Skip to content

Commit d01c08c

Browse files
committed
[NewPM] Add pass options for InternalizePass to preserve GVs (reland) (llvm#92383)
1 parent 0424864 commit d01c08c

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,24 @@ Expected<std::string> parseMemProfUsePassOptions(StringRef Params) {
10881088
return Result;
10891089
}
10901090

1091+
Expected<SmallVector<std::string, 0>> parseInternalizeGVs(StringRef Params) {
1092+
SmallVector<std::string, 1> PreservedGVs;
1093+
while (!Params.empty()) {
1094+
StringRef ParamName;
1095+
std::tie(ParamName, Params) = Params.split(';');
1096+
1097+
if (ParamName.consume_front("preserve-gv=")) {
1098+
PreservedGVs.push_back(ParamName.str());
1099+
} else {
1100+
return make_error<StringError>(
1101+
formatv("invalid Internalize pass parameter '{0}' ", ParamName).str(),
1102+
inconvertibleErrorCode());
1103+
}
1104+
}
1105+
1106+
return Expected<SmallVector<std::string, 0>>(std::move(PreservedGVs));
1107+
}
1108+
10911109
} // namespace
10921110

10931111
/// Tests whether a pass name starts with a valid prefix for a default pipeline

llvm/lib/Passes/PassRegistry.def

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ MODULE_PASS("inliner-wrapper-no-mandatory-first", ModuleInlinerWrapperPass(
7373
MODULE_PASS("insert-gcov-profiling", GCOVProfilerPass())
7474
MODULE_PASS("instrorderfile", InstrOrderFilePass())
7575
MODULE_PASS("instrprof", InstrProfiling())
76-
MODULE_PASS("internalize", InternalizePass())
7776
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
7877
MODULE_PASS("iroutliner", IROutlinerPass())
7978
MODULE_PASS("print-ir-similarity", IRSimilarityAnalysisPrinterPass(dbgs()))
@@ -169,6 +168,21 @@ MODULE_PASS_WITH_PARAMS("msan",
169168
},
170169
parseMSanPassOptions,
171170
"recover;kernel;eager-checks;track-origins=N")
171+
MODULE_PASS_WITH_PARAMS("internalize",
172+
"InternalizePass",
173+
[](SmallVector<std::string, 0> PreservedGVs) {
174+
if (PreservedGVs.empty())
175+
return InternalizePass();
176+
auto MustPreserveGV = [=](const GlobalValue &GV) {
177+
for (auto &PreservedGV : PreservedGVs)
178+
if (GV.getName() == PreservedGV)
179+
return true;
180+
return false;
181+
};
182+
return InternalizePass(MustPreserveGV);
183+
},
184+
parseInternalizeGVs,
185+
"preserve-gv=GV")
172186
MODULE_PASS_WITH_PARAMS("ipsccp",
173187
"IPSCCPPass",
174188
[](IPSCCPOptions Opts) {

llvm/test/Transforms/Internalize/lists.ll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
; -file and -list options should be merged, the apifile contains foo and j
1414
; 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
1515

16+
; specifying through pass builder option
17+
; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=j>' -S | FileCheck --check-prefix=FOO_AND_J %s
18+
; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=bar>' -S | FileCheck --check-prefix=FOO_AND_BAR %s
19+
; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=j;preserve-gv=bar>' -S | FileCheck --check-prefix=FOO_J_AND_BAR %s
20+
1621
; ALL: @i = internal global
1722
; FOO_AND_J: @i = internal global
1823
; FOO_AND_BAR: @i = internal global

0 commit comments

Comments
 (0)