[llvm] [NewPM] Add pass options for `InternalizePass` to preserve GVs. (PR #91334)
Tim Besard via llvm-commits
llvm-commits at lists.llvm.org
Tue May 14 04:32:52 PDT 2024
https://github.com/maleadt updated https://github.com/llvm/llvm-project/pull/91334
>From 2ac99419c3b6089c2de9a4086d96a7a2aca1dc23 Mon Sep 17 00:00:00 2001
From: Tim Besard <tim.besard at gmail.com>
Date: Tue, 7 May 2024 16:09:23 +0200
Subject: [PATCH 1/2] [NewPM] Add pass options for `InternalizePass` to
preserve GVs.
---
llvm/lib/Passes/PassBuilder.cpp | 18 ++++++++++++++++++
llvm/lib/Passes/PassRegistry.def | 15 ++++++++++++++-
llvm/test/Transforms/Internalize/lists.ll | 5 +++++
3 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index e4131706aba01..91c5b65c03511 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -1142,6 +1142,24 @@ Expected<GlobalMergeOptions> parseGlobalMergeOptions(StringRef Params) {
return Result;
}
+Expected<SmallVector<std::string, 0>> parseInternalizeGVs(StringRef Params) {
+ SmallVector<std::string, 1> PreservedGVs;
+ while (!Params.empty()) {
+ StringRef ParamName;
+ std::tie(ParamName, Params) = Params.split(';');
+
+ if (ParamName.consume_front("preserve-gv=")) {
+ PreservedGVs.push_back(ParamName.str());
+ } else {
+ return make_error<StringError>(
+ formatv("invalid Internalize pass parameter '{0}' ", ParamName).str(),
+ inconvertibleErrorCode());
+ }
+ }
+
+ return PreservedGVs;
+}
+
} // namespace
/// Tests whether a pass name starts with a valid prefix for a default pipeline
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index e5ce6cb7da649..d296222843d8c 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -78,7 +78,6 @@ MODULE_PASS("insert-gcov-profiling", GCOVProfilerPass())
MODULE_PASS("instrorderfile", InstrOrderFilePass())
MODULE_PASS("instrprof", InstrProfilingLoweringPass())
MODULE_PASS("ctx-instr-lower", PGOCtxProfLoweringPass())
-MODULE_PASS("internalize", InternalizePass())
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
MODULE_PASS("iroutliner", IROutlinerPass())
MODULE_PASS("jmc-instrumenter", JMCInstrumenterPass())
@@ -200,6 +199,20 @@ MODULE_PASS_WITH_PARAMS(
return StructuralHashPrinterPass(dbgs(), EnableDetailedStructuralHash);
},
parseStructuralHashPrinterPassOptions, "detailed")
+MODULE_PASS_WITH_PARAMS(
+ "internalize", "InternalizePass",
+ [](SmallVector<std::string, 0> PreservedGVs) {
+ if (PreservedGVs.empty())
+ return InternalizePass();
+ auto MustPreserveGV = [=](const GlobalValue &GV) {
+ for (auto &PreservedGV : PreservedGVs)
+ if (GV.getName() == PreservedGV)
+ return true;
+ return false;
+ };
+ return InternalizePass(MustPreserveGV);
+ },
+ parseInternalizeGVs, "preserve-gv=GV")
#undef MODULE_PASS_WITH_PARAMS
#ifndef CGSCC_ANALYSIS
diff --git a/llvm/test/Transforms/Internalize/lists.ll b/llvm/test/Transforms/Internalize/lists.ll
index df408f906b780..83dad03d75eae 100644
--- a/llvm/test/Transforms/Internalize/lists.ll
+++ b/llvm/test/Transforms/Internalize/lists.ll
@@ -13,6 +13,11 @@
; -file and -list options should be merged, the apifile contains foo and j
; RUN: opt < %s -passes=internalize -internalize-public-api-list bar -internalize-public-api-file %S/apifile -S | FileCheck --check-prefix=FOO_J_AND_BAR %s
+; specifying through pass builder option
+; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=j>' -S | FileCheck --check-prefix=FOO_AND_J %s
+; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=bar>' -S | FileCheck --check-prefix=FOO_AND_BAR %s
+; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=j;preserve-gv=bar>' -S | FileCheck --check-prefix=FOO_J_AND_BAR %s
+
; ALL: @i = internal global
; FOO_AND_J: @i = internal global
; FOO_AND_BAR: @i = internal global
>From 2148c469d872319c0eff20d728e5465cb1f7ac05 Mon Sep 17 00:00:00 2001
From: Tim Besard <tim.besard at gmail.com>
Date: Tue, 14 May 2024 13:32:36 +0200
Subject: [PATCH 2/2] Address review comment.
---
llvm/lib/Passes/PassRegistry.def | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index d296222843d8c..50682ca4970f1 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -174,6 +174,20 @@ MODULE_PASS_WITH_PARAMS(
"hwasan", "HWAddressSanitizerPass",
[](HWAddressSanitizerOptions Opts) { return HWAddressSanitizerPass(Opts); },
parseHWASanPassOptions, "kernel;recover")
+MODULE_PASS_WITH_PARAMS(
+ "internalize", "InternalizePass",
+ [](SmallVector<std::string, 0> PreservedGVs) {
+ if (PreservedGVs.empty())
+ return InternalizePass();
+ auto MustPreserveGV = [=](const GlobalValue &GV) {
+ for (auto &PreservedGV : PreservedGVs)
+ if (GV.getName() == PreservedGV)
+ return true;
+ return false;
+ };
+ return InternalizePass(MustPreserveGV);
+ },
+ parseInternalizeGVs, "preserve-gv=GV")
MODULE_PASS_WITH_PARAMS(
"ipsccp", "IPSCCPPass", [](IPSCCPOptions Opts) { return IPSCCPPass(Opts); },
parseIPSCCPOptions, "no-func-spec;func-spec")
@@ -199,20 +213,6 @@ MODULE_PASS_WITH_PARAMS(
return StructuralHashPrinterPass(dbgs(), EnableDetailedStructuralHash);
},
parseStructuralHashPrinterPassOptions, "detailed")
-MODULE_PASS_WITH_PARAMS(
- "internalize", "InternalizePass",
- [](SmallVector<std::string, 0> PreservedGVs) {
- if (PreservedGVs.empty())
- return InternalizePass();
- auto MustPreserveGV = [=](const GlobalValue &GV) {
- for (auto &PreservedGV : PreservedGVs)
- if (GV.getName() == PreservedGV)
- return true;
- return false;
- };
- return InternalizePass(MustPreserveGV);
- },
- parseInternalizeGVs, "preserve-gv=GV")
#undef MODULE_PASS_WITH_PARAMS
#ifndef CGSCC_ANALYSIS
More information about the llvm-commits
mailing list