-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[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
base: main
Are you sure you want to change the base?
Conversation
@llvm/pr-subscribers-llvm-globalisel Author: David Green (davemgreen) ChangesWith 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:
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
|
@llvm/pr-subscribers-backend-aarch64 Author: David Green (davemgreen) ChangesWith 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:
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) |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
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.
161948b
to
97592c5
Compare
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.