Skip to content

Commit 6cea404

Browse files
authored
[IR] Remove RepeatedPass (#96211)
This pass is not used in any pipeline, barely used in tests and not really useful, so drop it. The only place where we "repeat" passes is devirt repetition, and that is done using a separate pass.
1 parent 1107575 commit 6cea404

File tree

7 files changed

+3
-202
lines changed

7 files changed

+3
-202
lines changed

llvm/include/llvm/IR/PassManager.h

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -950,58 +950,6 @@ struct InvalidateAllAnalysesPass : PassInfoMixin<InvalidateAllAnalysesPass> {
950950
}
951951
};
952952

953-
/// A utility pass template that simply runs another pass multiple times.
954-
///
955-
/// This can be useful when debugging or testing passes. It also serves as an
956-
/// example of how to extend the pass manager in ways beyond composition.
957-
template <typename PassT>
958-
class RepeatedPass : public PassInfoMixin<RepeatedPass<PassT>> {
959-
public:
960-
RepeatedPass(int Count, PassT &&P)
961-
: Count(Count), P(std::forward<PassT>(P)) {}
962-
963-
template <typename IRUnitT, typename AnalysisManagerT, typename... Ts>
964-
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, Ts &&... Args) {
965-
966-
// Request PassInstrumentation from analysis manager, will use it to run
967-
// instrumenting callbacks for the passes later.
968-
// Here we use std::tuple wrapper over getResult which helps to extract
969-
// AnalysisManager's arguments out of the whole Args set.
970-
PassInstrumentation PI =
971-
detail::getAnalysisResult<PassInstrumentationAnalysis>(
972-
AM, IR, std::tuple<Ts...>(Args...));
973-
974-
auto PA = PreservedAnalyses::all();
975-
for (int i = 0; i < Count; ++i) {
976-
// Check the PassInstrumentation's BeforePass callbacks before running the
977-
// pass, skip its execution completely if asked to (callback returns
978-
// false).
979-
if (!PI.runBeforePass<IRUnitT>(P, IR))
980-
continue;
981-
PreservedAnalyses IterPA = P.run(IR, AM, std::forward<Ts>(Args)...);
982-
PA.intersect(IterPA);
983-
PI.runAfterPass(P, IR, IterPA);
984-
}
985-
return PA;
986-
}
987-
988-
void printPipeline(raw_ostream &OS,
989-
function_ref<StringRef(StringRef)> MapClassName2PassName) {
990-
OS << "repeat<" << Count << ">(";
991-
P.printPipeline(OS, MapClassName2PassName);
992-
OS << ')';
993-
}
994-
995-
private:
996-
int Count;
997-
PassT P;
998-
};
999-
1000-
template <typename PassT>
1001-
RepeatedPass<PassT> createRepeatedPass(int Count, PassT &&P) {
1002-
return RepeatedPass<PassT>(Count, std::forward<PassT>(P));
1003-
}
1004-
1005953
} // end namespace llvm
1006954

1007955
#endif // LLVM_IR_PASSMANAGER_H

llvm/include/llvm/Transforms/Scalar/LoopPassManager.h

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -129,37 +129,6 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
129129
new LoopNestPassModelT(std::forward<PassT>(Pass))));
130130
}
131131

132-
// Specializations of `addPass` for `RepeatedPass`. These are necessary since
133-
// `RepeatedPass` has a templated `run` method that will result in incorrect
134-
// detection of `HasRunOnLoopT`.
135-
template <typename PassT>
136-
LLVM_ATTRIBUTE_MINSIZE
137-
std::enable_if_t<is_detected<HasRunOnLoopT, PassT>::value>
138-
addPass(RepeatedPass<PassT> &&Pass) {
139-
using RepeatedLoopPassModelT =
140-
detail::PassModel<Loop, RepeatedPass<PassT>, LoopAnalysisManager,
141-
LoopStandardAnalysisResults &, LPMUpdater &>;
142-
IsLoopNestPass.push_back(false);
143-
// Do not use make_unique or emplace_back, they cause too many template
144-
// instantiations, causing terrible compile times.
145-
LoopPasses.push_back(std::unique_ptr<LoopPassConceptT>(
146-
new RepeatedLoopPassModelT(std::move(Pass))));
147-
}
148-
149-
template <typename PassT>
150-
LLVM_ATTRIBUTE_MINSIZE
151-
std::enable_if_t<!is_detected<HasRunOnLoopT, PassT>::value>
152-
addPass(RepeatedPass<PassT> &&Pass) {
153-
using RepeatedLoopNestPassModelT =
154-
detail::PassModel<LoopNest, RepeatedPass<PassT>, LoopAnalysisManager,
155-
LoopStandardAnalysisResults &, LPMUpdater &>;
156-
IsLoopNestPass.push_back(true);
157-
// Do not use make_unique or emplace_back, they cause too many template
158-
// instantiations, causing terrible compile times.
159-
LoopNestPasses.push_back(std::unique_ptr<LoopNestPassConceptT>(
160-
new RepeatedLoopNestPassModelT(std::move(Pass))));
161-
}
162-
163132
bool isEmpty() const { return LoopPasses.empty() && LoopNestPasses.empty(); }
164133

165134
static bool isRequired() { return true; }

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -506,15 +506,6 @@ void PassBuilder::registerLoopAnalyses(LoopAnalysisManager &LAM) {
506506
C(LAM);
507507
}
508508

509-
static std::optional<int> parseRepeatPassName(StringRef Name) {
510-
if (!Name.consume_front("repeat<") || !Name.consume_back(">"))
511-
return std::nullopt;
512-
int Count;
513-
if (Name.getAsInteger(0, Count) || Count <= 0)
514-
return std::nullopt;
515-
return Count;
516-
}
517-
518509
static std::optional<std::pair<bool, bool>>
519510
parseFunctionPipelineName(StringRef Name) {
520511
std::pair<bool, bool> Params;
@@ -1243,10 +1234,6 @@ static bool isModulePassName(StringRef Name, CallbacksT &Callbacks) {
12431234
if (Name == "coro-cond")
12441235
return true;
12451236

1246-
// Explicitly handle custom-parsed pass names.
1247-
if (parseRepeatPassName(Name))
1248-
return true;
1249-
12501237
#define MODULE_PASS(NAME, CREATE_PASS) \
12511238
if (Name == NAME) \
12521239
return true;
@@ -1271,8 +1258,6 @@ static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks) {
12711258
return true;
12721259

12731260
// Explicitly handle custom-parsed pass names.
1274-
if (parseRepeatPassName(Name))
1275-
return true;
12761261
if (parseDevirtPassName(Name))
12771262
return true;
12781263

@@ -1299,10 +1284,6 @@ static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
12991284
if (Name == "loop" || Name == "loop-mssa" || Name == "machine-function")
13001285
return true;
13011286

1302-
// Explicitly handle custom-parsed pass names.
1303-
if (parseRepeatPassName(Name))
1304-
return true;
1305-
13061287
#define FUNCTION_PASS(NAME, CREATE_PASS) \
13071288
if (Name == NAME) \
13081289
return true;
@@ -1323,10 +1304,6 @@ static bool isMachineFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
13231304
if (Name == "machine-function")
13241305
return true;
13251306

1326-
// Explicitly handle custom-parsed pass names.
1327-
if (parseRepeatPassName(Name))
1328-
return true;
1329-
13301307
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
13311308
if (Name == NAME) \
13321309
return true;
@@ -1349,10 +1326,6 @@ static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks,
13491326
bool &UseMemorySSA) {
13501327
UseMemorySSA = false;
13511328

1352-
// Explicitly handle custom-parsed pass names.
1353-
if (parseRepeatPassName(Name))
1354-
return true;
1355-
13561329
if (PassBuilder::checkParametrizedPassName(Name, "lnicm")) {
13571330
UseMemorySSA = true;
13581331
return true;
@@ -1371,10 +1344,6 @@ static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks,
13711344
bool &UseMemorySSA) {
13721345
UseMemorySSA = false;
13731346

1374-
// Explicitly handle custom-parsed pass names.
1375-
if (parseRepeatPassName(Name))
1376-
return true;
1377-
13781347
if (PassBuilder::checkParametrizedPassName(Name, "licm")) {
13791348
UseMemorySSA = true;
13801349
return true;
@@ -1491,13 +1460,6 @@ Error PassBuilder::parseModulePass(ModulePassManager &MPM,
14911460
createModuleToFunctionPassAdaptor(std::move(FPM), Params->first));
14921461
return Error::success();
14931462
}
1494-
if (auto Count = parseRepeatPassName(Name)) {
1495-
ModulePassManager NestedMPM;
1496-
if (auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1497-
return Err;
1498-
MPM.addPass(createRepeatedPass(*Count, std::move(NestedMPM)));
1499-
return Error::success();
1500-
}
15011463

15021464
for (auto &C : ModulePipelineParsingCallbacks)
15031465
if (C(Name, MPM, InnerPipeline))
@@ -1660,13 +1622,6 @@ Error PassBuilder::parseCGSCCPass(CGSCCPassManager &CGPM,
16601622
std::move(FPM), Params->first, Params->second));
16611623
return Error::success();
16621624
}
1663-
if (auto Count = parseRepeatPassName(Name)) {
1664-
CGSCCPassManager NestedCGPM;
1665-
if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1666-
return Err;
1667-
CGPM.addPass(createRepeatedPass(*Count, std::move(NestedCGPM)));
1668-
return Error::success();
1669-
}
16701625
if (auto MaxRepetitions = parseDevirtPassName(Name)) {
16711626
CGSCCPassManager NestedCGPM;
16721627
if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
@@ -1789,13 +1744,6 @@ Error PassBuilder::parseFunctionPass(FunctionPassManager &FPM,
17891744
UseBFI, UseBPI));
17901745
return Error::success();
17911746
}
1792-
if (auto Count = parseRepeatPassName(Name)) {
1793-
FunctionPassManager NestedFPM;
1794-
if (auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
1795-
return Err;
1796-
FPM.addPass(createRepeatedPass(*Count, std::move(NestedFPM)));
1797-
return Error::success();
1798-
}
17991747
if (Name == "machine-function") {
18001748
MachineFunctionPassManager MFPM;
18011749
if (auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
@@ -1888,13 +1836,6 @@ Error PassBuilder::parseLoopPass(LoopPassManager &LPM,
18881836
LPM.addPass(std::move(NestedLPM));
18891837
return Error::success();
18901838
}
1891-
if (auto Count = parseRepeatPassName(Name)) {
1892-
LoopPassManager NestedLPM;
1893-
if (auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
1894-
return Err;
1895-
LPM.addPass(createRepeatedPass(*Count, std::move(NestedLPM)));
1896-
return Error::success();
1897-
}
18981839

18991840
for (auto &C : LoopPipelineParsingCallbacks)
19001841
if (C(Name, LPM, InnerPipeline))

llvm/test/Other/new-pass-manager.ll

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -299,60 +299,6 @@
299299
; avoiding FileCheck complaining about the unused prefix.
300300
; CHECK-NOEXT: {{.*}}
301301

302-
; RUN: opt -disable-output -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \
303-
; RUN: -passes='repeat<3>(no-op-module)' %s 2>&1 \
304-
; RUN: | FileCheck %s --check-prefix=CHECK-REPEAT-MODULE-PASS
305-
; CHECK-REPEAT-MODULE-PASS: Running pass: RepeatedPass
306-
; CHECK-REPEAT-MODULE-PASS-NEXT: Running pass: NoOpModulePass
307-
; CHECK-REPEAT-MODULE-PASS-NEXT: Running pass: NoOpModulePass
308-
; CHECK-REPEAT-MODULE-PASS-NEXT: Running pass: NoOpModulePass
309-
310-
; RUN: opt -disable-output -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \
311-
; RUN: -passes='cgscc(repeat<3>(no-op-cgscc))' %s 2>&1 \
312-
; RUN: | FileCheck %s --check-prefix=CHECK-REPEAT-CGSCC-PASS
313-
; CHECK-REPEAT-CGSCC-PASS: Running analysis: InnerAnalysisManagerProxy<{{.*(CGSCCAnalysisManager|AnalysisManager<.*LazyCallGraph::SCC.*>).*}},{{.*}}Module>
314-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*(FunctionAnalysisManager|AnalysisManager<.*Function.*>).*}},{{.*}}Module>
315-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: LazyCallGraphAnalysis
316-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: TargetLibraryAnalysis
317-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy
318-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph::SCC{{.*}}>
319-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running pass: RepeatedPass
320-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running pass: NoOpCGSCCPass
321-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running pass: NoOpCGSCCPass
322-
; CHECK-REPEAT-CGSCC-PASS-NEXT: Running pass: NoOpCGSCCPass
323-
324-
; RUN: opt -disable-output -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \
325-
; RUN: -passes='function(repeat<3>(no-op-function))' %s 2>&1 \
326-
; RUN: | FileCheck %s --check-prefix=CHECK-REPEAT-FUNCTION-PASS
327-
; CHECK-REPEAT-FUNCTION-PASS: Running analysis: InnerAnalysisManagerProxy<{{.*}}>
328-
; CHECK-REPEAT-FUNCTION-PASS-NEXT: Running pass: RepeatedPass
329-
; CHECK-REPEAT-FUNCTION-PASS-NEXT: Running pass: NoOpFunctionPass
330-
; CHECK-REPEAT-FUNCTION-PASS-NEXT: Running pass: NoOpFunctionPass
331-
; CHECK-REPEAT-FUNCTION-PASS-NEXT: Running pass: NoOpFunctionPass
332-
333-
; RUN: opt -disable-output -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \
334-
; RUN: -passes='loop(repeat<3>(no-op-loop))' %s 2>&1 \
335-
; RUN: | FileCheck %s --check-prefix=CHECK-REPEAT-LOOP-PASS
336-
; CHECK-REPEAT-LOOP-PASS: Running analysis: InnerAnalysisManagerProxy<{{.*}}>
337-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running pass: LoopSimplify
338-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: LoopAnalysis
339-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: DominatorTreeAnalysis
340-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: AssumptionAnalysis
341-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: TargetIRAnalysis
342-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running pass: LCSSAPass
343-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: AAManager
344-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: TargetLibraryAnalysis
345-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: BasicAA
346-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: ScopedNoAliasAA
347-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: TypeBasedAA
348-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: OuterAnalysisManagerProxy
349-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: ScalarEvolutionAnalysis
350-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}>
351-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running pass: RepeatedPass
352-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running pass: NoOpLoopPass
353-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running pass: NoOpLoopPass
354-
; CHECK-REPEAT-LOOP-PASS-NEXT: Running pass: NoOpLoopPass
355-
356302
define void @foo(i1 %x, ptr %p1, ptr %p2) {
357303
entry:
358304
store i8 42, ptr %p1

llvm/test/Other/new-pm-print-pipeline.ll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='module(rpo-function-attrs,require<globals-aa>,function(float2int,lower-constant-intrinsics,loop(loop-rotate)),invalidate<globals-aa>)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-1
77
; CHECK-1: rpo-function-attrs,require<globals-aa>,function(float2int,lower-constant-intrinsics,loop(loop-rotate<header-duplication;no-prepare-for-lto>)),invalidate<globals-aa>
88

9-
; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='repeat<5>(function(mem2reg)),invalidate<all>' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-2
10-
; CHECK-2: repeat<5>(function(mem2reg)),invalidate<all>
11-
129
;; Test that we get ClassName printed when there is no ClassName to pass-name mapping (as is the case for the BitcodeWriterPass).
1310
; RUN: opt -o /dev/null -disable-verify -print-pipeline-passes -passes='function(mem2reg)' < %s -disable-pipeline-verification | FileCheck %s --match-full-lines --check-prefixes=CHECK-3
1411
; CHECK-3: function(mem2reg),BitcodeWriterPass

llvm/test/Transforms/Coroutines/coro-elide-stat.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
; REQUIRES: asserts
33
;
44
; RUN: opt < %s -S \
5-
; RUN: -passes='cgscc(repeat<2>(inline,function(coro-elide,dce)))' -stats 2>&1 \
5+
; RUN: -passes='cgscc(inline,function(coro-elide,dce),inline,function(coro-elide,dce))' -stats 2>&1 \
66
; RUN: | FileCheck %s
77
; RUN: opt < %s --disable-output \
8-
; RUN: -passes='cgscc(repeat<2>(inline,function(coro-elide,dce)))' \
8+
; RUN: -passes='cgscc(inline,function(coro-elide,dce),inline,function(coro-elide,dce))' \
99
; RUN: -coro-elide-info-output-file=%t && \
1010
; RUN: cat %t \
1111
; RUN: | FileCheck %s --check-prefix=FILE

llvm/test/Transforms/Coroutines/coro-elide.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
; Tests that the coro.destroy and coro.resume are devirtualized where possible,
22
; SCC pipeline restarts and inlines the direct calls.
33
; RUN: opt < %s -S \
4-
; RUN: -passes='cgscc(repeat<2>(inline,function(coro-elide,dce)))' \
4+
; RUN: -passes='cgscc(inline,function(coro-elide,dce),inline,function(coro-elide,dce))' \
55
; RUN: | FileCheck %s
66

77
declare void @print(i32) nounwind

0 commit comments

Comments
 (0)