[llvm] Reland [LLVM] Add flags to crash the opt/codegen pipeline (PR #201146)

Arthur Eubanks via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 2 08:51:46 PDT 2026


https://github.com/aeubanks updated https://github.com/llvm/llvm-project/pull/201146

>From 67bd535bb5c76cf7d46dfd2e26c6f63140969665 Mon Sep 17 00:00:00 2001
From: Arthur Eubanks <aeubanks at google.com>
Date: Mon, 1 Jun 2026 16:55:15 -0700
Subject: [PATCH 1/2] Reland [LLVM] Add flags to crash the opt/codegen pipeline

Will be used for testing crash reduction.

Reland of #200967. I believe that was failing on Fuchsia due to mangling differences, which can cause the automatically computed pass name to be different. I've added an explicit name to the pass (which was actually already there previously, I removed it thinking it was no longer required).
---
 .../llvm/Transforms/Utils/TriggerCrashPass.h  | 39 +++++++++++++++++
 llvm/lib/CodeGen/TargetPassConfig.cpp         | 10 +++++
 llvm/lib/Passes/PassBuilder.cpp               | 23 +---------
 llvm/lib/Passes/PassBuilderPipelines.cpp      |  8 ++++
 llvm/lib/Transforms/Utils/CMakeLists.txt      |  1 +
 .../lib/Transforms/Utils/TriggerCrashPass.cpp | 43 +++++++++++++++++++
 llvm/test/Other/trigger-crash-flags.ll        | 13 ++++++
 .../llvm/lib/Transforms/Utils/BUILD.gn        |  1 +
 8 files changed, 116 insertions(+), 22 deletions(-)
 create mode 100644 llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h
 create mode 100644 llvm/lib/Transforms/Utils/TriggerCrashPass.cpp
 create mode 100644 llvm/test/Other/trigger-crash-flags.ll

diff --git a/llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h b/llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h
new file mode 100644
index 0000000000000..c1131655b93bd
--- /dev/null
+++ b/llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h
@@ -0,0 +1,39 @@
+//===- TriggerCrashPass.h - Trigger Crash Passes ----------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM Exceptions
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides passes that trigger crashes for testing purposes.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TRANSFORMS_UTILS_TRIGGERCRASHPASS_H
+#define LLVM_TRANSFORMS_UTILS_TRIGGERCRASHPASS_H
+
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/PassManager.h"
+#include "llvm/Pass.h"
+
+namespace llvm {
+
+class TriggerCrashModulePass
+    : public OptionalPassInfoMixin<TriggerCrashModulePass> {
+public:
+  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
+};
+
+class TriggerCrashFunctionPass
+    : public OptionalPassInfoMixin<TriggerCrashFunctionPass> {
+public:
+  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
+};
+
+FunctionPass *createTriggerCrashFunctionPass();
+
+} // namespace llvm
+
+#endif // LLVM_TRANSFORMS_UTILS_TRIGGERCRASHPASS_H
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index 096e9a6f2b1dc..6231ab1ba0734 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -50,6 +50,7 @@
 #include "llvm/Transforms/ObjCARC.h"
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Transforms/Utils.h"
+#include "llvm/Transforms/Utils/TriggerCrashPass.h"
 #include <cassert>
 #include <optional>
 #include <string>
@@ -99,6 +100,11 @@ static cl::opt<bool> DisableConstantHoisting("disable-constant-hoisting",
     cl::Hidden, cl::desc("Disable ConstantHoisting"));
 static cl::opt<bool> DisableCGP("disable-cgp", cl::Hidden,
     cl::desc("Disable Codegen Prepare"));
+
+static cl::opt<bool>
+    TriggerCrash("codegen-pipeline-trigger-crash", cl::init(false), cl::Hidden,
+                 cl::desc("Trigger crash in codegen pipeline"));
+
 static cl::opt<bool> DisableCopyProp("disable-copyprop", cl::Hidden,
     cl::desc("Disable Copy Propagation pass"));
 static cl::opt<bool> DisablePartialLibcallInlining("disable-partial-libcall-inlining",
@@ -1086,6 +1092,10 @@ bool TargetPassConfig::addISelPasses() {
   addPass(createPreISelIntrinsicLoweringPass());
   addPass(createExpandIRInstsPass(getOptLevel()));
   addIRPasses();
+
+  if (TriggerCrash)
+    addPass(createTriggerCrashFunctionPass());
+
   addCodeGenPrepare();
   addPassesToHandleExceptions();
   addISelPrepare();
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 395dd4f14577f..9498b3d2bbd0c 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -386,6 +386,7 @@
 #include "llvm/Transforms/Utils/StripGCRelocates.h"
 #include "llvm/Transforms/Utils/StripNonLineTableDebugInfo.h"
 #include "llvm/Transforms/Utils/SymbolRewriter.h"
+#include "llvm/Transforms/Utils/TriggerCrashPass.h"
 #include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
 #include "llvm/Transforms/Utils/UnifyLoopExits.h"
 #include "llvm/Transforms/Vectorize/LoadStoreVectorizer.h"
@@ -423,28 +424,6 @@ bool applyMIRDebugify(DIBuilder &DIB, Function &F, ModuleAnalysisManager &AM) {
       });
 }
 
-// Passes for testing crashes.
-// DO NOT USE THIS EXCEPT FOR TESTING!
-class TriggerCrashModulePass
-    : public OptionalPassInfoMixin<TriggerCrashModulePass> {
-public:
-  PreservedAnalyses run(Module &, ModuleAnalysisManager &) {
-    abort();
-    return PreservedAnalyses::all();
-  }
-  static StringRef name() { return "TriggerCrashModulePass"; }
-};
-
-class TriggerCrashFunctionPass
-    : public OptionalPassInfoMixin<TriggerCrashFunctionPass> {
-public:
-  PreservedAnalyses run(Function &, FunctionAnalysisManager &) {
-    abort();
-    return PreservedAnalyses::all();
-  }
-  static StringRef name() { return "TriggerCrashFunctionPass"; }
-};
-
 // A pass for testing message reporting of -verify-each failures.
 // DO NOT USE THIS EXCEPT FOR TESTING!
 class TriggerVerifierErrorPass
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index a2ebd9730d51b..d0cf63028e303 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -151,6 +151,7 @@
 #include "llvm/Transforms/Utils/NameAnonGlobals.h"
 #include "llvm/Transforms/Utils/RelLookupTableConverter.h"
 #include "llvm/Transforms/Utils/SimplifyCFGOptions.h"
+#include "llvm/Transforms/Utils/TriggerCrashPass.h"
 #include "llvm/Transforms/Vectorize/LoopVectorize.h"
 #include "llvm/Transforms/Vectorize/SLPVectorizer.h"
 #include "llvm/Transforms/Vectorize/VectorCombine.h"
@@ -196,6 +197,10 @@ static cl::opt<bool> EnablePostPGOLoopRotation(
     "enable-post-pgo-loop-rotation", cl::init(true), cl::Hidden,
     cl::desc("Run the loop rotation transformation after PGO instrumentation"));
 
+static cl::opt<bool>
+    TriggerCrash("opt-pipeline-trigger-crash", cl::init(false), cl::Hidden,
+                 cl::desc("Trigger crash in optimization pipeline"));
+
 static cl::opt<bool> EnableGlobalAnalyses(
     "enable-global-analyses", cl::init(true), cl::Hidden,
     cl::desc("Enable inter-procedural analyses"));
@@ -1776,6 +1781,9 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
   // Force any function attributes we want the rest of the pipeline to observe.
   MPM.addPass(ForceFunctionAttrsPass());
 
+  if (TriggerCrash)
+    MPM.addPass(createModuleToFunctionPassAdaptor(TriggerCrashFunctionPass()));
+
   if (PGOOpt && PGOOpt->DebugInfoForProfiling)
     MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
 
diff --git a/llvm/lib/Transforms/Utils/CMakeLists.txt b/llvm/lib/Transforms/Utils/CMakeLists.txt
index 8fe0476ab1a32..1c8647eef5d0c 100644
--- a/llvm/lib/Transforms/Utils/CMakeLists.txt
+++ b/llvm/lib/Transforms/Utils/CMakeLists.txt
@@ -91,6 +91,7 @@ add_llvm_component_library(LLVMTransformUtils
   SplitModuleByCategory.cpp
   StripNonLineTableDebugInfo.cpp
   SymbolRewriter.cpp
+  TriggerCrashPass.cpp
   UnifyFunctionExitNodes.cpp
   UnifyLoopExits.cpp
   Utils.cpp
diff --git a/llvm/lib/Transforms/Utils/TriggerCrashPass.cpp b/llvm/lib/Transforms/Utils/TriggerCrashPass.cpp
new file mode 100644
index 0000000000000..3afe743a74d9d
--- /dev/null
+++ b/llvm/lib/Transforms/Utils/TriggerCrashPass.cpp
@@ -0,0 +1,43 @@
+//===- TriggerCrashPass.cpp -----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM Exceptions
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Utils/TriggerCrashPass.h"
+#include <cstdlib>
+
+using namespace llvm;
+
+PreservedAnalyses TriggerCrashModulePass::run(Module &,
+                                              ModuleAnalysisManager &) {
+  abort();
+  return PreservedAnalyses::all();
+}
+
+PreservedAnalyses TriggerCrashFunctionPass::run(Function &,
+                                                FunctionAnalysisManager &) {
+  abort();
+  return PreservedAnalyses::all();
+}
+
+namespace {
+class TriggerCrashFunctionLegacyPass : public FunctionPass {
+public:
+  static char ID;
+  TriggerCrashFunctionLegacyPass() : FunctionPass(ID) {}
+  bool runOnFunction(Function &F) override {
+    abort();
+    return false;
+  }
+  StringRef getPassName() const override { return "TriggerCrashFunctionPass"; }
+};
+} // namespace
+
+char TriggerCrashFunctionLegacyPass::ID = 0;
+
+FunctionPass *llvm::createTriggerCrashFunctionPass() {
+  return new TriggerCrashFunctionLegacyPass();
+}
diff --git a/llvm/test/Other/trigger-crash-flags.ll b/llvm/test/Other/trigger-crash-flags.ll
new file mode 100644
index 0000000000000..6c84b6ab52ec2
--- /dev/null
+++ b/llvm/test/Other/trigger-crash-flags.ll
@@ -0,0 +1,13 @@
+; RUN: not --crash opt -O2 -opt-pipeline-trigger-crash %s -disable-output 2>&1 | \
+; RUN: FileCheck %s --check-prefix=OPT
+;
+; RUN: not --crash llc -codegen-pipeline-trigger-crash %s -o /dev/null 2>&1 | \
+; RUN: FileCheck %s --check-prefix=CODEGEN
+
+; OPT: trigger-crash-function
+
+; CODEGEN: TriggerCrashFunctionPass
+
+define void @foo() {
+  ret void
+}
diff --git a/llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn
index 0b61f8f21e130..e814623eb99f3 100644
--- a/llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/lib/Transforms/Utils/BUILD.gn
@@ -99,6 +99,7 @@ static_library("Utils") {
     "StripGCRelocates.cpp",
     "StripNonLineTableDebugInfo.cpp",
     "SymbolRewriter.cpp",
+    "TriggerCrashPass.cpp",
     "UnifyFunctionExitNodes.cpp",
     "UnifyLoopExits.cpp",
     "Utils.cpp",

>From 884357912eb6640a89903b193b919fb0bf73c529 Mon Sep 17 00:00:00 2001
From: Arthur Eubanks <aeubanks at google.com>
Date: Tue, 2 Jun 2026 15:51:14 +0000
Subject: [PATCH 2/2] remove file names in header

---
 llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h | 4 +++-
 llvm/lib/Transforms/Utils/TriggerCrashPass.cpp        | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h b/llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h
index c1131655b93bd..5f0a2a1388555 100644
--- a/llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h
+++ b/llvm/include/llvm/Transforms/Utils/TriggerCrashPass.h
@@ -1,4 +1,4 @@
-//===- TriggerCrashPass.h - Trigger Crash Passes ----------------*- C++ -*-===//
+//===----------------------------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -24,12 +24,14 @@ class TriggerCrashModulePass
     : public OptionalPassInfoMixin<TriggerCrashModulePass> {
 public:
   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
+  static StringRef name() { return "TriggerCrashModulePass"; }
 };
 
 class TriggerCrashFunctionPass
     : public OptionalPassInfoMixin<TriggerCrashFunctionPass> {
 public:
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
+  static StringRef name() { return "TriggerCrashFunctionPass"; }
 };
 
 FunctionPass *createTriggerCrashFunctionPass();
diff --git a/llvm/lib/Transforms/Utils/TriggerCrashPass.cpp b/llvm/lib/Transforms/Utils/TriggerCrashPass.cpp
index 3afe743a74d9d..d0ff07775e013 100644
--- a/llvm/lib/Transforms/Utils/TriggerCrashPass.cpp
+++ b/llvm/lib/Transforms/Utils/TriggerCrashPass.cpp
@@ -1,4 +1,4 @@
-//===- TriggerCrashPass.cpp -----------------------------------------------===//
+//===----------------------------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.



More information about the llvm-commits mailing list