[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