[llvm] Report pass name when -llvm-verify-each reports breakage (PR #71447)

via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 28 13:20:22 PST 2023


https://github.com/chrulski-intel updated https://github.com/llvm/llvm-project/pull/71447

>From c7a15dcfed077f95470eaa57833331a24d54fd3c Mon Sep 17 00:00:00 2001
From: chrulski-intel <christopher.m.chrulski at intel.com>
Date: Mon, 6 Nov 2023 09:39:33 -0800
Subject: [PATCH 1/2] Report pass name when -llvm-verify-each reports breakage

Update the string reported to include the pass name of last pass
when running verifier after each pass.
---
 llvm/lib/Passes/StandardInstrumentations.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index 06cc58c0219632d..556fdbb44620d90 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -1401,7 +1401,9 @@ void VerifyInstrumentation::registerCallbacks(
             dbgs() << "Verifying function " << F->getName() << "\n";
 
           if (verifyFunction(*F, &errs()))
-            report_fatal_error("Broken function found, compilation aborted!");
+            report_fatal_error(formatv("Broken function found after pass "
+                                       "\"{0}\", compilation aborted!",
+                                       P));
         } else {
           const Module **MPtr = llvm::any_cast<const Module *>(&IR);
           const Module *M = MPtr ? *MPtr : nullptr;
@@ -1416,7 +1418,9 @@ void VerifyInstrumentation::registerCallbacks(
               dbgs() << "Verifying module " << M->getName() << "\n";
 
             if (verifyModule(*M, &errs()))
-              report_fatal_error("Broken module found, compilation aborted!");
+              report_fatal_error(formatv("Broken module found after pass "
+                                         "\"{0}\", compilation aborted!",
+                                         P));
           }
         }
       });

>From 85536510f3fea0fde04d13b2cca82e682b63d884 Mon Sep 17 00:00:00 2001
From: chrulski-intel <christopher.m.chrulski at intel.com>
Date: Tue, 28 Nov 2023 12:34:33 -0800
Subject: [PATCH 2/2] Add test for message reporting of -verify-each failure
 message

Adds a testing pass that intentionally creates IR that will
trigger a verification failure to test that -verify-each
generates an appropriate error message.
---
 llvm/lib/Passes/PassBuilder.cpp        | 26 ++++++++++++++++++++++++++
 llvm/lib/Passes/PassRegistry.def       |  2 ++
 llvm/test/Other/verify-each-failure.ll | 18 ++++++++++++++++++
 3 files changed, 46 insertions(+)
 create mode 100644 llvm/test/Other/verify-each-failure.ll

diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 0d7cac19d44c3a8..c1a7d2b068004e8 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -405,6 +405,32 @@ class TriggerCrashPass : public PassInfoMixin<TriggerCrashPass> {
   static StringRef name() { return "TriggerCrashPass"; }
 };
 
+// A pass for testing message reporting of -verify-each failures.
+// DO NOT USE THIS EXCEPT FOR TESTING!
+class TriggerVerifyEachFailurePass
+    : public PassInfoMixin<TriggerVerifyEachFailurePass> {
+public:
+  PreservedAnalyses run(Module &M, ModuleAnalysisManager &) {
+    // Intentionally break the Module by creating an alias without setting the
+    // aliasee.
+    auto *PtrTy = llvm::PointerType::getUnqual(M.getContext());
+    GlobalAlias::create(PtrTy, PtrTy->getAddressSpace(),
+                        GlobalValue::LinkageTypes::InternalLinkage,
+                        "__bad_alias", nullptr, &M);
+    return PreservedAnalyses::none();
+  }
+
+  PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
+    // Intentionally break the Function by inserting a terminator
+    // instruction in the middle of a basic block.
+    BasicBlock &BB = F.getEntryBlock();
+    new UnreachableInst(F.getContext(), BB.getTerminator());
+    return PreservedAnalyses::none();
+  }
+
+  static StringRef name() { return "TriggerVerifierFailurePass"; }
+};
+
 } // namespace
 
 PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index eb51ccef68c827d..e6c66c3aab2c9cd 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -122,6 +122,7 @@ MODULE_PASS("strip-nonlinetable-debuginfo", StripNonLineTableDebugInfoPass())
 MODULE_PASS("synthetic-counts-propagation", SyntheticCountsPropagation())
 MODULE_PASS("trigger-crash", TriggerCrashPass())
 MODULE_PASS("verify", VerifierPass())
+MODULE_PASS("verify-each-failure", TriggerVerifyEachFailurePass())
 MODULE_PASS("view-callgraph", CallGraphViewerPass())
 MODULE_PASS("wholeprogramdevirt", WholeProgramDevirtPass())
 MODULE_PASS("dfsan", DataFlowSanitizerPass())
@@ -438,6 +439,7 @@ FUNCTION_PASS("verify<memoryssa>", MemorySSAVerifierPass())
 FUNCTION_PASS("verify<regions>", RegionInfoVerifierPass())
 FUNCTION_PASS("verify<safepoint-ir>", SafepointIRVerifierPass())
 FUNCTION_PASS("verify<scalar-evolution>", ScalarEvolutionVerifierPass())
+FUNCTION_PASS("verify-each-failure", TriggerVerifyEachFailurePass())
 FUNCTION_PASS("view-cfg", CFGViewerPass())
 FUNCTION_PASS("view-cfg-only", CFGOnlyViewerPass())
 FUNCTION_PASS("tlshoist", TLSVariableHoistPass())
diff --git a/llvm/test/Other/verify-each-failure.ll b/llvm/test/Other/verify-each-failure.ll
new file mode 100644
index 000000000000000..ce9a21ceb9beeee
--- /dev/null
+++ b/llvm/test/Other/verify-each-failure.ll
@@ -0,0 +1,18 @@
+; A test that the option -verify-each reports the last pass run
+; when a failure occurs.
+
+; RUN: not --crash opt -disable-output -debug-pass-manager -verify-each -passes="module(verify-each-failure)" %s 2>&1 | FileCheck %s --check-prefix=CHECK_MODULE
+; RUN: not --crash opt -disable-output -debug-pass-manager -verify-each -passes="function(verify-each-failure)" %s 2>&1 | FileCheck %s --check-prefix=CHECK_FUNCTION
+
+; CHECK_MODULE: Running pass: TriggerVerifierFailurePass on [module]
+; CHECK_MODULE: Broken module found after pass "TriggerVerifierFailurePass", compilation aborted!
+
+; CHECK_FUNCTION: Running pass: TriggerVerifierFailurePass on main
+; CHECK_FUNCTION: Broken function found after pass "TriggerVerifierFailurePass", compilation aborted!
+
+define i32 @main() {
+entry:
+  %retval = alloca i32, align 4
+  store i32 0, ptr %retval, align 4
+  ret i32 0
+}



More information about the llvm-commits mailing list