Skip to content

Commit f147249

Browse files
committed
[NewPM] support disablePass, insertPass in CodeGenPassBuilder
Currently only machine function passes support `insertPass`, but it seems to be enough, all targets tune their pipelines when adding machine function passes.
1 parent e9e4ab8 commit f147249

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,6 @@ template <typename DerivedT> class CodeGenPassBuilder {
176176
// Add Function Pass
177177
if constexpr (is_detected<is_function_pass_t, PassT>::value) {
178178
FPM.addPass(std::forward<PassT>(Pass));
179-
180-
for (auto &C : PB.AfterCallbacks)
181-
C(Name);
182179
} else {
183180
// Add Module Pass
184181
if (!FPM.isEmpty()) {
@@ -187,9 +184,6 @@ template <typename DerivedT> class CodeGenPassBuilder {
187184
}
188185

189186
MPM.addPass(std::forward<PassT>(Pass));
190-
191-
for (auto &C : PB.AfterCallbacks)
192-
C(Name);
193187
}
194188
}
195189

@@ -222,9 +216,6 @@ template <typename DerivedT> class CodeGenPassBuilder {
222216
// Add Function Pass
223217
if constexpr (is_detected<is_machine_function_pass_t, PassT>::value) {
224218
MFPM.addPass(std::forward<PassT>(Pass));
225-
226-
for (auto &C : PB.AfterCallbacks)
227-
C(Name);
228219
} else {
229220
// Add Module Pass
230221
if (!MFPM.isEmpty()) {
@@ -234,10 +225,10 @@ template <typename DerivedT> class CodeGenPassBuilder {
234225
}
235226

236227
MPM.addPass(std::forward<PassT>(Pass));
237-
238-
for (auto &C : PB.AfterCallbacks)
239-
C(Name);
240228
}
229+
230+
for (auto &C : PB.AfterCallbacks)
231+
C(Name, MFPM);
241232
}
242233

243234
private:
@@ -461,6 +452,24 @@ template <typename DerivedT> class CodeGenPassBuilder {
461452
Error addRegAssignmentFast(AddMachinePass &) const;
462453
Error addRegAssignmentOptimized(AddMachinePass &) const;
463454

455+
/// Allow the target to disable a specific pass by default.
456+
/// Backend can declare unwanted passes in constructor.
457+
template <typename... PassTs> void disablePass() {
458+
BeforeCallbacks.emplace_back(
459+
[](StringRef Name) { return ((Name != PassTs::name()) && ...); });
460+
}
461+
462+
/// Insert InsertedPass pass after TargetPass pass.
463+
/// Only machine function passes are supported.
464+
template <typename TargetPassT, typename InsertedPassT>
465+
void insertPass(InsertedPassT &&Pass) {
466+
AfterCallbacks.emplace_back(
467+
[&](StringRef Name, MachineFunctionPassManager &MFPM) mutable {
468+
if (Name == TargetPassT::name())
469+
MFPM.addPass(std::forward<InsertedPassT>(Pass));
470+
});
471+
}
472+
464473
private:
465474
DerivedT &derived() { return static_cast<DerivedT &>(*this); }
466475
const DerivedT &derived() const {
@@ -480,7 +489,9 @@ template <typename DerivedT> class CodeGenPassBuilder {
480489

481490
mutable SmallVector<llvm::unique_function<bool(StringRef)>, 4>
482491
BeforeCallbacks;
483-
mutable SmallVector<llvm::unique_function<void(StringRef)>, 4> AfterCallbacks;
492+
mutable SmallVector<
493+
llvm::unique_function<void(StringRef, MachineFunctionPassManager &)>, 4>
494+
AfterCallbacks;
484495

485496
/// Helper variable for `-start-before/-start-after/-stop-before/-stop-after`
486497
mutable bool Started = true;

0 commit comments

Comments
 (0)