Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[GlobalISel] Put legalizer rule debug behind a verbose option. #138277

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

davemgreen
Copy link
Collaborator

With the larger number of G_ opcodes now, this debug information emitted for checking the global isel legalizer rules are valid is quite verbose and runs even when gisel is not being used. This makes it especially verbose when running a single pass with -debug.

This patch puts it behind a verbose debug option so that most people don't need to worry about it.

@llvmbot
Copy link
Member

llvmbot commented May 2, 2025

@llvm/pr-subscribers-llvm-globalisel

Author: David Green (davemgreen)

Changes

With the larger number of G_ opcodes now, this debug information emitted for checking the global isel legalizer rules are valid is quite verbose and runs even when gisel is not being used. This makes it especially verbose when running a single pass with -debug.

This patch puts it behind a verbose debug option so that most people don't need to worry about it.


Full diff: https://github.com/llvm/llvm-project/pull/138277.diff

3 Files Affected:

  • (modified) llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp (+34-19)
  • (modified) llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir (+1-1)
  • (modified) llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir (+2-2)
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp
index c9ee35373cd44..2a9607cd6c822 100644
--- a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp
@@ -34,6 +34,12 @@ cl::opt<bool> llvm::DisableGISelLegalityCheck(
     cl::desc("Don't verify that MIR is fully legal between GlobalISel passes"),
     cl::Hidden);
 
+cl::opt<bool> VerboseVerifyLegalizerInfo(
+    "verbose-gisel-verify-legalizer-info",
+    cl::desc("Print more information to dbgs about GlobalISel legalizer rules "
+             "being verified"),
+    cl::Hidden);
+
 raw_ostream &llvm::operator<<(raw_ostream &OS, LegalizeAction Action) {
   switch (Action) {
   case Legal:
@@ -211,20 +217,24 @@ LegalizeActionStep LegalizeRuleSet::apply(const LegalityQuery &Query) const {
 bool LegalizeRuleSet::verifyTypeIdxsCoverage(unsigned NumTypeIdxs) const {
 #ifndef NDEBUG
   if (Rules.empty()) {
-    LLVM_DEBUG(
-        dbgs() << ".. type index coverage check SKIPPED: no rules defined\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(
+          dbgs() << ".. type index coverage check SKIPPED: no rules defined\n");
     return true;
   }
   const int64_t FirstUncovered = TypeIdxsCovered.find_first_unset();
   if (FirstUncovered < 0) {
-    LLVM_DEBUG(dbgs() << ".. type index coverage check SKIPPED:"
-                         " user-defined predicate detected\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << ".. type index coverage check SKIPPED:"
+                           " user-defined predicate detected\n");
     return true;
   }
   const bool AllCovered = (FirstUncovered >= NumTypeIdxs);
   if (NumTypeIdxs > 0)
-    LLVM_DEBUG(dbgs() << ".. the first uncovered type index: " << FirstUncovered
-                      << ", " << (AllCovered ? "OK" : "FAIL") << "\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << ".. the first uncovered type index: "
+                        << FirstUncovered << ", "
+                        << (AllCovered ? "OK" : "FAIL") << "\n");
   return AllCovered;
 #else
   return true;
@@ -234,19 +244,22 @@ bool LegalizeRuleSet::verifyTypeIdxsCoverage(unsigned NumTypeIdxs) const {
 bool LegalizeRuleSet::verifyImmIdxsCoverage(unsigned NumImmIdxs) const {
 #ifndef NDEBUG
   if (Rules.empty()) {
-    LLVM_DEBUG(
-        dbgs() << ".. imm index coverage check SKIPPED: no rules defined\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(
+          dbgs() << ".. imm index coverage check SKIPPED: no rules defined\n");
     return true;
   }
   const int64_t FirstUncovered = ImmIdxsCovered.find_first_unset();
   if (FirstUncovered < 0) {
-    LLVM_DEBUG(dbgs() << ".. imm index coverage check SKIPPED:"
-                         " user-defined predicate detected\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << ".. imm index coverage check SKIPPED:"
+                           " user-defined predicate detected\n");
     return true;
   }
   const bool AllCovered = (FirstUncovered >= NumImmIdxs);
-  LLVM_DEBUG(dbgs() << ".. the first uncovered imm index: " << FirstUncovered
-                    << ", " << (AllCovered ? "OK" : "FAIL") << "\n");
+  if (VerboseVerifyLegalizerInfo)
+    LLVM_DEBUG(dbgs() << ".. the first uncovered imm index: " << FirstUncovered
+                      << ", " << (AllCovered ? "OK" : "FAIL") << "\n");
   return AllCovered;
 #else
   return true;
@@ -274,8 +287,9 @@ unsigned LegalizerInfo::getOpcodeIdxForOpcode(unsigned Opcode) const {
 unsigned LegalizerInfo::getActionDefinitionsIdx(unsigned Opcode) const {
   unsigned OpcodeIdx = getOpcodeIdxForOpcode(Opcode);
   if (unsigned Alias = RulesForOpcode[OpcodeIdx].getAlias()) {
-    LLVM_DEBUG(dbgs() << ".. opcode " << Opcode << " is aliased to " << Alias
-                      << "\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << ".. opcode " << Opcode << " is aliased to " << Alias
+                        << "\n");
     OpcodeIdx = getOpcodeIdxForOpcode(Alias);
     assert(RulesForOpcode[OpcodeIdx].getAlias() == 0 && "Cannot chain aliases");
   }
@@ -396,11 +410,12 @@ void LegalizerInfo::verify(const MCInstrInfo &MII) const {
                      ? std::max(OpInfo.getGenericImmIndex() + 1U, Acc)
                      : Acc;
         });
-    LLVM_DEBUG(dbgs() << MII.getName(Opcode) << " (opcode " << Opcode
-                      << "): " << NumTypeIdxs << " type ind"
-                      << (NumTypeIdxs == 1 ? "ex" : "ices") << ", "
-                      << NumImmIdxs << " imm ind"
-                      << (NumImmIdxs == 1 ? "ex" : "ices") << "\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << MII.getName(Opcode) << " (opcode " << Opcode
+                        << "): " << NumTypeIdxs << " type ind"
+                        << (NumTypeIdxs == 1 ? "ex" : "ices") << ", "
+                        << NumImmIdxs << " imm ind"
+                        << (NumImmIdxs == 1 ? "ex" : "ices") << "\n");
     const LegalizeRuleSet &RuleSet = getActionDefinitions(Opcode);
     if (!RuleSet.verifyTypeIdxsCoverage(NumTypeIdxs))
       FailedOpcodes.push_back(Opcode);
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
index 7c5af4b7baa36..0cb354629a802 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
@@ -2,7 +2,7 @@
 # RUN: llc -mtriple=aarch64-- -run-pass=legalizer %s \
 # RUN:     -mcpu=cortex-a75 -o - 2>&1 | FileCheck %s --check-prefixes=CHECK
 
-# RUN: llc -mtriple=aarch64-- -run-pass=legalizer %s -debug-only=legalizer-info \
+# RUN: llc -mtriple=aarch64-- -run-pass=legalizer %s -debug-only=legalizer-info -verbose-gisel-verify-legalizer-info \
 # RUN:     -mcpu=cortex-a75 -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,DEBUG
 
 # REQUIRES: asserts
diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir
index dd05eacef2408..354d393edfa63 100644
--- a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir
+++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir
@@ -4,9 +4,9 @@
 # RUN: llc -mtriple=riscv64-- -run-pass=legalizer %s \
 # RUN:     -mattr=+m,+zbb,+zfh,+v -o - 2>&1 | FileCheck %s --check-prefixes=CHECK
 
-# RUN: llc -mtriple=riscv32-- -run-pass=legalizer %s -debug-only=legalizer-info \
+# RUN: llc -mtriple=riscv32-- -run-pass=legalizer %s -debug-only=legalizer-info -verbose-gisel-verify-legalizer-info \
 # RUN:     -mattr=+m,+zbb,+zfh,+v -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,DEBUG,DEBUG-RV32
-# RUN: llc -mtriple=riscv64-- -run-pass=legalizer %s -debug-only=legalizer-info \
+# RUN: llc -mtriple=riscv64-- -run-pass=legalizer %s -debug-only=legalizer-info -verbose-gisel-verify-legalizer-info \
 # RUN:     -mattr=+m,+zbb,+zfh,+v -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,DEBUG,DEBUG-RV64
 
 # REQUIRES: asserts

@llvmbot
Copy link
Member

llvmbot commented May 2, 2025

@llvm/pr-subscribers-backend-aarch64

Author: David Green (davemgreen)

Changes

With the larger number of G_ opcodes now, this debug information emitted for checking the global isel legalizer rules are valid is quite verbose and runs even when gisel is not being used. This makes it especially verbose when running a single pass with -debug.

This patch puts it behind a verbose debug option so that most people don't need to worry about it.


Full diff: https://github.com/llvm/llvm-project/pull/138277.diff

3 Files Affected:

  • (modified) llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp (+34-19)
  • (modified) llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir (+1-1)
  • (modified) llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir (+2-2)
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp
index c9ee35373cd44..2a9607cd6c822 100644
--- a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp
@@ -34,6 +34,12 @@ cl::opt<bool> llvm::DisableGISelLegalityCheck(
     cl::desc("Don't verify that MIR is fully legal between GlobalISel passes"),
     cl::Hidden);
 
+cl::opt<bool> VerboseVerifyLegalizerInfo(
+    "verbose-gisel-verify-legalizer-info",
+    cl::desc("Print more information to dbgs about GlobalISel legalizer rules "
+             "being verified"),
+    cl::Hidden);
+
 raw_ostream &llvm::operator<<(raw_ostream &OS, LegalizeAction Action) {
   switch (Action) {
   case Legal:
@@ -211,20 +217,24 @@ LegalizeActionStep LegalizeRuleSet::apply(const LegalityQuery &Query) const {
 bool LegalizeRuleSet::verifyTypeIdxsCoverage(unsigned NumTypeIdxs) const {
 #ifndef NDEBUG
   if (Rules.empty()) {
-    LLVM_DEBUG(
-        dbgs() << ".. type index coverage check SKIPPED: no rules defined\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(
+          dbgs() << ".. type index coverage check SKIPPED: no rules defined\n");
     return true;
   }
   const int64_t FirstUncovered = TypeIdxsCovered.find_first_unset();
   if (FirstUncovered < 0) {
-    LLVM_DEBUG(dbgs() << ".. type index coverage check SKIPPED:"
-                         " user-defined predicate detected\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << ".. type index coverage check SKIPPED:"
+                           " user-defined predicate detected\n");
     return true;
   }
   const bool AllCovered = (FirstUncovered >= NumTypeIdxs);
   if (NumTypeIdxs > 0)
-    LLVM_DEBUG(dbgs() << ".. the first uncovered type index: " << FirstUncovered
-                      << ", " << (AllCovered ? "OK" : "FAIL") << "\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << ".. the first uncovered type index: "
+                        << FirstUncovered << ", "
+                        << (AllCovered ? "OK" : "FAIL") << "\n");
   return AllCovered;
 #else
   return true;
@@ -234,19 +244,22 @@ bool LegalizeRuleSet::verifyTypeIdxsCoverage(unsigned NumTypeIdxs) const {
 bool LegalizeRuleSet::verifyImmIdxsCoverage(unsigned NumImmIdxs) const {
 #ifndef NDEBUG
   if (Rules.empty()) {
-    LLVM_DEBUG(
-        dbgs() << ".. imm index coverage check SKIPPED: no rules defined\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(
+          dbgs() << ".. imm index coverage check SKIPPED: no rules defined\n");
     return true;
   }
   const int64_t FirstUncovered = ImmIdxsCovered.find_first_unset();
   if (FirstUncovered < 0) {
-    LLVM_DEBUG(dbgs() << ".. imm index coverage check SKIPPED:"
-                         " user-defined predicate detected\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << ".. imm index coverage check SKIPPED:"
+                           " user-defined predicate detected\n");
     return true;
   }
   const bool AllCovered = (FirstUncovered >= NumImmIdxs);
-  LLVM_DEBUG(dbgs() << ".. the first uncovered imm index: " << FirstUncovered
-                    << ", " << (AllCovered ? "OK" : "FAIL") << "\n");
+  if (VerboseVerifyLegalizerInfo)
+    LLVM_DEBUG(dbgs() << ".. the first uncovered imm index: " << FirstUncovered
+                      << ", " << (AllCovered ? "OK" : "FAIL") << "\n");
   return AllCovered;
 #else
   return true;
@@ -274,8 +287,9 @@ unsigned LegalizerInfo::getOpcodeIdxForOpcode(unsigned Opcode) const {
 unsigned LegalizerInfo::getActionDefinitionsIdx(unsigned Opcode) const {
   unsigned OpcodeIdx = getOpcodeIdxForOpcode(Opcode);
   if (unsigned Alias = RulesForOpcode[OpcodeIdx].getAlias()) {
-    LLVM_DEBUG(dbgs() << ".. opcode " << Opcode << " is aliased to " << Alias
-                      << "\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << ".. opcode " << Opcode << " is aliased to " << Alias
+                        << "\n");
     OpcodeIdx = getOpcodeIdxForOpcode(Alias);
     assert(RulesForOpcode[OpcodeIdx].getAlias() == 0 && "Cannot chain aliases");
   }
@@ -396,11 +410,12 @@ void LegalizerInfo::verify(const MCInstrInfo &MII) const {
                      ? std::max(OpInfo.getGenericImmIndex() + 1U, Acc)
                      : Acc;
         });
-    LLVM_DEBUG(dbgs() << MII.getName(Opcode) << " (opcode " << Opcode
-                      << "): " << NumTypeIdxs << " type ind"
-                      << (NumTypeIdxs == 1 ? "ex" : "ices") << ", "
-                      << NumImmIdxs << " imm ind"
-                      << (NumImmIdxs == 1 ? "ex" : "ices") << "\n");
+    if (VerboseVerifyLegalizerInfo)
+      LLVM_DEBUG(dbgs() << MII.getName(Opcode) << " (opcode " << Opcode
+                        << "): " << NumTypeIdxs << " type ind"
+                        << (NumTypeIdxs == 1 ? "ex" : "ices") << ", "
+                        << NumImmIdxs << " imm ind"
+                        << (NumImmIdxs == 1 ? "ex" : "ices") << "\n");
     const LegalizeRuleSet &RuleSet = getActionDefinitions(Opcode);
     if (!RuleSet.verifyTypeIdxsCoverage(NumTypeIdxs))
       FailedOpcodes.push_back(Opcode);
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
index 7c5af4b7baa36..0cb354629a802 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir
@@ -2,7 +2,7 @@
 # RUN: llc -mtriple=aarch64-- -run-pass=legalizer %s \
 # RUN:     -mcpu=cortex-a75 -o - 2>&1 | FileCheck %s --check-prefixes=CHECK
 
-# RUN: llc -mtriple=aarch64-- -run-pass=legalizer %s -debug-only=legalizer-info \
+# RUN: llc -mtriple=aarch64-- -run-pass=legalizer %s -debug-only=legalizer-info -verbose-gisel-verify-legalizer-info \
 # RUN:     -mcpu=cortex-a75 -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,DEBUG
 
 # REQUIRES: asserts
diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir
index dd05eacef2408..354d393edfa63 100644
--- a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir
+++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir
@@ -4,9 +4,9 @@
 # RUN: llc -mtriple=riscv64-- -run-pass=legalizer %s \
 # RUN:     -mattr=+m,+zbb,+zfh,+v -o - 2>&1 | FileCheck %s --check-prefixes=CHECK
 
-# RUN: llc -mtriple=riscv32-- -run-pass=legalizer %s -debug-only=legalizer-info \
+# RUN: llc -mtriple=riscv32-- -run-pass=legalizer %s -debug-only=legalizer-info -verbose-gisel-verify-legalizer-info \
 # RUN:     -mattr=+m,+zbb,+zfh,+v -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,DEBUG,DEBUG-RV32
-# RUN: llc -mtriple=riscv64-- -run-pass=legalizer %s -debug-only=legalizer-info \
+# RUN: llc -mtriple=riscv64-- -run-pass=legalizer %s -debug-only=legalizer-info -verbose-gisel-verify-legalizer-info \
 # RUN:     -mattr=+m,+zbb,+zfh,+v -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,DEBUG,DEBUG-RV64
 
 # REQUIRES: asserts

@@ -211,20 +217,24 @@ LegalizeActionStep LegalizeRuleSet::apply(const LegalityQuery &Query) const {
bool LegalizeRuleSet::verifyTypeIdxsCoverage(unsigned NumTypeIdxs) const {
#ifndef NDEBUG
if (Rules.empty()) {
LLVM_DEBUG(
dbgs() << ".. type index coverage check SKIPPED: no rules defined\n");
if (VerboseVerifyLegalizerInfo)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe just skip the whole verifyTypeIdxsCoverage?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was assuming that AllCovered is still a useful check (I was trying not to alter what was tested with the verbosity option). Let me know if I should skip the whole thing.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These probably aren't useful in general other than the target tests for the legality rules, I think it's fine to just not print anything unless you use the flag

davemgreen added 2 commits May 6, 2025 07:17
With the larger number of G_ opcodes now, this debug information emitted for
checking the global isel legalizer rules are valid is quite verbose and runs
even when gisel is not being used. This makes it especially verbose when
running a single pass with -debug.

This patch puts it behind a verbose debug option so that most people don't need
to worry about it.
@davemgreen davemgreen force-pushed the gh-gi-debugverbose branch from 161948b to 97592c5 Compare May 6, 2025 06:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants