@@ -176,9 +176,6 @@ template <typename DerivedT> class CodeGenPassBuilder {
176
176
// Add Function Pass
177
177
if constexpr (is_detected<is_function_pass_t , PassT>::value) {
178
178
FPM.addPass (std::forward<PassT>(Pass));
179
-
180
- for (auto &C : PB.AfterCallbacks )
181
- C (Name);
182
179
} else {
183
180
// Add Module Pass
184
181
if (!FPM.isEmpty ()) {
@@ -187,9 +184,6 @@ template <typename DerivedT> class CodeGenPassBuilder {
187
184
}
188
185
189
186
MPM.addPass (std::forward<PassT>(Pass));
190
-
191
- for (auto &C : PB.AfterCallbacks )
192
- C (Name);
193
187
}
194
188
}
195
189
@@ -222,9 +216,6 @@ template <typename DerivedT> class CodeGenPassBuilder {
222
216
// Add Function Pass
223
217
if constexpr (is_detected<is_machine_function_pass_t , PassT>::value) {
224
218
MFPM.addPass (std::forward<PassT>(Pass));
225
-
226
- for (auto &C : PB.AfterCallbacks )
227
- C (Name);
228
219
} else {
229
220
// Add Module Pass
230
221
if (!MFPM.isEmpty ()) {
@@ -234,10 +225,10 @@ template <typename DerivedT> class CodeGenPassBuilder {
234
225
}
235
226
236
227
MPM.addPass (std::forward<PassT>(Pass));
237
-
238
- for (auto &C : PB.AfterCallbacks )
239
- C (Name);
240
228
}
229
+
230
+ for (auto &C : PB.AfterCallbacks )
231
+ C (Name, MFPM);
241
232
}
242
233
243
234
private:
@@ -461,6 +452,24 @@ template <typename DerivedT> class CodeGenPassBuilder {
461
452
Error addRegAssignmentFast (AddMachinePass &) const ;
462
453
Error addRegAssignmentOptimized (AddMachinePass &) const ;
463
454
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
+
464
473
private:
465
474
DerivedT &derived () { return static_cast <DerivedT &>(*this ); }
466
475
const DerivedT &derived () const {
@@ -480,7 +489,9 @@ template <typename DerivedT> class CodeGenPassBuilder {
480
489
481
490
mutable SmallVector<llvm::unique_function<bool (StringRef)>, 4 >
482
491
BeforeCallbacks;
483
- mutable SmallVector<llvm::unique_function<void (StringRef)>, 4 > AfterCallbacks;
492
+ mutable SmallVector<
493
+ llvm::unique_function<void (StringRef, MachineFunctionPassManager &)>, 4 >
494
+ AfterCallbacks;
484
495
485
496
// / Helper variable for `-start-before/-start-after/-stop-before/-stop-after`
486
497
mutable bool Started = true ;
0 commit comments