[llvm] [NewPM] Add `disable-passes` command line option (PR #76714)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 2 04:57:25 PST 2024


https://github.com/paperchalice created https://github.com/llvm/llvm-project/pull/76714

Noticed there are some command line options to disable passes in `TargetPassConfig.cpp`, this patch adds a unified option to disable them. This option may be rarely used in tools like `opt`, but `llc` could benefit from it.

>From 5da6c6c56afa203bc0a7d16e2e392590e1370630 Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Tue, 2 Jan 2024 20:47:59 +0800
Subject: [PATCH] [NewPM] Add `disable-passes` command line option

Noticed there are some command line options to disable passes in `TargetPassConfig.cpp`, this patch adds a unified option to disable them.
---
 llvm/lib/Passes/PassBuilder.cpp       | 18 +++++++++++++++++-
 llvm/test/tools/opt/disable-passes.ll |  8 ++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/tools/opt/disable-passes.ll

diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index f94bd422c6b592..04f133fe43b589 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -15,6 +15,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Passes/PassBuilder.h"
+#include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Analysis/AliasAnalysisEvaluator.h"
 #include "llvm/Analysis/AliasSetTracker.h"
@@ -288,6 +289,10 @@ using namespace llvm;
 static const Regex DefaultAliasRegex(
     "^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
 
+static cl::list<std::string>
+    DisablePasses("disable-passes", llvm::cl::desc("Disable specified passes"),
+                  cl::CommaSeparated, cl::Hidden);
+
 namespace llvm {
 cl::opt<bool> PrintPipelinePasses(
     "print-pipeline-passes",
@@ -406,7 +411,8 @@ AnalysisKey NoOpLoopAnalysis::Key;
 /// We currently only use this for --print-before/after.
 bool shouldPopulateClassToPassNames() {
   return PrintPipelinePasses || !printBeforePasses().empty() ||
-         !printAfterPasses().empty() || !isFilterPassesEmpty();
+         !printAfterPasses().empty() || !isFilterPassesEmpty() ||
+         !DisablePasses.empty();
 }
 
 // A pass for testing -print-on-crash.
@@ -482,6 +488,16 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
 #define CGSCC_ANALYSIS(NAME, CREATE_PASS)                                      \
   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
 #include "PassRegistry.def"
+
+    if (!DisablePasses.empty()) {
+      SmallSet<StringRef, 8> S;
+      for (const auto &P : DisablePasses)
+        S.insert(P);
+      PIC->registerShouldRunOptionalPassCallback(
+          [PassNameSet = std::move(S), PIC](StringRef Name, Any IR) {
+            return !PassNameSet.contains(PIC->getPassNameForClassName(Name));
+          });
+    }
   }
 }
 
diff --git a/llvm/test/tools/opt/disable-passes.ll b/llvm/test/tools/opt/disable-passes.ll
new file mode 100644
index 00000000000000..2cee87f84d0a14
--- /dev/null
+++ b/llvm/test/tools/opt/disable-passes.ll
@@ -0,0 +1,8 @@
+; RUN: opt --disable-output --debug-pass-manager \
+; RUN:   --passes='default<O2>' --disable-passes=early-cse,inline < %s 2>&1 | FileCheck %s
+define void @test() {
+  ret void
+}
+
+; CHECK: Skipping pass: InlinerPass on (test)
+; CHECK: Skipping pass: EarlyCSEPass on test



More information about the llvm-commits mailing list