Skip to content

Commit 10f64c3

Browse files
committed
Add callback style pass builder
1 parent 3f9d02a commit 10f64c3

15 files changed

+1281
-13
lines changed

llvm/include/llvm/CodeGen/TargetPassConfig.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,7 @@ class TargetPassConfig : public ImmutablePass {
190190

191191
/// Returns pass name in `-stop-before` or `-stop-after`
192192
/// NOTE: New pass manager migration only
193-
static Expected<StartStopInfo>
194-
getStartStopInfo(PassInstrumentationCallbacks &PIC);
193+
static Expected<StartStopInfo> getStartStopInfo();
195194

196195
void setDisableVerify(bool Disable) { setOpt(DisableVerify, Disable); }
197196

llvm/include/llvm/Passes/CodeGenPassBuilder.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ template <typename Derived, typename TargetMachineT>
534534
Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
535535
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
536536
CodeGenFileType FileType) const {
537-
auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
537+
auto StartStopInfo = TargetPassConfig::getStartStopInfo();
538538
if (!StartStopInfo)
539539
return StartStopInfo.takeError();
540540
setStartStopPasses(*StartStopInfo);

llvm/include/llvm/Passes/MachinePassRegistry.def

+5
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ DUMMY_MACHINE_MODULE_PASS("mir-strip-debug", StripDebugMachineModulePass)
206206
#ifndef DUMMY_MACHINE_FUNCTION_PASS
207207
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME)
208208
#endif
209+
DUMMY_MACHINE_FUNCTION_PASS("bb-path-cloning", BasicBlockPathCloningPass)
209210
DUMMY_MACHINE_FUNCTION_PASS("bbsections-prepare", BasicBlockSectionsPass)
210211
DUMMY_MACHINE_FUNCTION_PASS("bbsections-profile-reader", BasicBlockSectionsProfileReaderPass)
211212
DUMMY_MACHINE_FUNCTION_PASS("block-placement", MachineBlockPlacementPass)
@@ -222,6 +223,8 @@ DUMMY_MACHINE_FUNCTION_PASS("fixup-statepoint-caller-saved", FixupStatepointCall
222223
DUMMY_MACHINE_FUNCTION_PASS("fs-profile-loader", MIRProfileLoaderNewPass)
223224
DUMMY_MACHINE_FUNCTION_PASS("funclet-layout", FuncletLayoutPass)
224225
DUMMY_MACHINE_FUNCTION_PASS("gc-empty-basic-blocks", GCEmptyBasicBlocksPass)
226+
DUMMY_MACHINE_FUNCTION_PASS("gc-machine-code-insersion",
227+
GCMachineCodeInsertionPass)
225228
DUMMY_MACHINE_FUNCTION_PASS("implicit-null-checks", ImplicitNullChecksPass)
226229
DUMMY_MACHINE_FUNCTION_PASS("init-undef-pass", InitUndefPass)
227230
DUMMY_MACHINE_FUNCTION_PASS("instruction-select", InstructionSelectPass)
@@ -266,6 +269,8 @@ DUMMY_MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass)
266269
DUMMY_MACHINE_FUNCTION_PASS("stack-slot-coloring", StackSlotColoringPass)
267270
DUMMY_MACHINE_FUNCTION_PASS("stackmap-liveness", StackMapLivenessPass)
268271
DUMMY_MACHINE_FUNCTION_PASS("unpack-mi-bundles", UnpackMachineBundlesPass)
272+
DUMMY_MACHINE_FUNCTION_PASS("unreachable-mbb-elimination",
273+
UnreachableMachineBlockElimPass)
269274
DUMMY_MACHINE_FUNCTION_PASS("virtregrewriter", VirtRegRewriterPass)
270275
DUMMY_MACHINE_FUNCTION_PASS("xray-instrumentation", XRayInstrumentationPass)
271276
#undef DUMMY_MACHINE_FUNCTION_PASS

llvm/include/llvm/Passes/PassBuilder.h

+236
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@
1515
#ifndef LLVM_PASSES_PASSBUILDER_H
1616
#define LLVM_PASSES_PASSBUILDER_H
1717

18+
#include "llvm/ADT/StringSet.h"
1819
#include "llvm/Analysis/CGSCCPassManager.h"
1920
#include "llvm/CodeGen/MachinePassManager.h"
2021
#include "llvm/CodeGen/RegAllocCommon.h"
2122
#include "llvm/IR/PassManager.h"
2223
#include "llvm/Passes/OptimizationLevel.h"
24+
#include "llvm/Support/CodeGen.h"
2325
#include "llvm/Support/Error.h"
2426
#include "llvm/Support/PGOOptions.h"
2527
#include "llvm/Support/raw_ostream.h"
28+
#include "llvm/Target/CGPassBuilderOption.h"
2629
#include "llvm/Transforms/IPO/Inliner.h"
2730
#include "llvm/Transforms/IPO/ModuleInliner.h"
2831
#include "llvm/Transforms/Scalar/LoopPassManager.h"
@@ -34,6 +37,7 @@ class StringRef;
3437
class AAManager;
3538
class TargetMachine;
3639
class ModuleSummaryIndex;
40+
class MCContext;
3741
template <typename T> class IntrusiveRefCntPtr;
3842
namespace vfs {
3943
class FileSystem;
@@ -106,6 +110,7 @@ class PassBuilder {
106110
TargetMachine *TM;
107111
PipelineTuningOptions PTO;
108112
std::optional<PGOOptions> PGOOpt;
113+
CGPassBuilderOption CGPBO;
109114
PassInstrumentationCallbacks *PIC;
110115

111116
public:
@@ -308,6 +313,24 @@ class PassBuilder {
308313
/// TargetMachine::registerDefaultAliasAnalyses().
309314
AAManager buildDefaultAAPipeline();
310315

316+
/// Build CodeGen pass pipeline.
317+
///
318+
/// {{@
319+
Expected<ModulePassManager>
320+
buildDefaultCodeGenPipeline(raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
321+
CodeGenFileType FileType, MCContext &Ctx);
322+
Error buildDefaultCodeGenPipeline(ModulePassManager &MPM,
323+
raw_pwrite_stream &Out,
324+
raw_pwrite_stream *DwoOut,
325+
CodeGenFileType FileType, MCContext &Ctx);
326+
Error addRegAllocPass(MachineFunctionPassManager &MFPM,
327+
StringRef Filter = "all");
328+
// TODO: Add method to build MC emission pipeline.
329+
template <typename... PassTs> void disablePass() {
330+
(DisabledPasses.insert(PassTs::name()), ...);
331+
}
332+
/// @}}
333+
311334
/// Parse a textual pass pipeline description into a \c
312335
/// ModulePassManager.
313336
///
@@ -523,6 +546,133 @@ class PassBuilder {
523546
FullLinkTimeOptimizationLastEPCallbacks.push_back(C);
524547
}
525548

549+
/// Register target specific callbacks to extend codegen pipeline.
550+
/// {{@
551+
552+
/// If target want its own pipeline, use this callback.
553+
void setCustomCodeGenPipelineBuilderCallback(
554+
const std::function<Error(ModulePassManager &, raw_pwrite_stream &,
555+
raw_pwrite_stream *, CodeGenFileType,
556+
MCContext &)>
557+
C) {
558+
CustomCodeGenPipelineBuilderCallback = C;
559+
}
560+
561+
void registerCodeGenIREarlyEPCallback(
562+
const std::function<void(ModulePassManager &)> C) {
563+
CodeGenIREarlyEPCallbacks.push_back(C);
564+
}
565+
566+
void registerGCLoweringEPCallback(
567+
const std::function<void(FunctionPassManager &)> C) {
568+
GCLoweringEPCallbacks.push_back(C);
569+
}
570+
571+
void registerISelPrepareEPCallback(
572+
const std::function<void(ModulePassManager &)> &C) {
573+
ISelPrepareEPCallbacks.push_back(C);
574+
}
575+
576+
void registerMachineSSAOptimizationEarlyEPCallback(
577+
const std::function<void(MachineFunctionPassManager &)> &C) {
578+
MachineSSAOptimizationEarlyEPCallbacks.push_back(C);
579+
}
580+
581+
void registerILPOptsEPCallback(
582+
const std::function<void(MachineFunctionPassManager &)> &C) {
583+
ILPOptsEPCallbacks.push_back(C);
584+
}
585+
586+
void registerMachineSSAOptimizationLastEPCallback(
587+
const std::function<void(MachineFunctionPassManager &)> &C) {
588+
MachineSSAOptimizationLastEPCallbacks.push_back(C);
589+
}
590+
591+
void registerPreRegAllocEPCallback(
592+
const std::function<void(MachineFunctionPassManager &)> &C) {
593+
PreRegAllocEPCallbacks.push_back(C);
594+
}
595+
596+
void registerPostRegAllocEPCallback(
597+
const std::function<void(MachineFunctionPassManager &)> &C) {
598+
PostRegAllocEPCallbacks.push_back(C);
599+
}
600+
601+
void registerPreRegBankSelectEPCallback(
602+
const std::function<void(MachineFunctionPassManager &)> &C) {
603+
PreRegBankSelectEPCallbacks.push_back(C);
604+
}
605+
606+
void registerPreGlobalInstructionSelectEPCallback(
607+
const std::function<void(MachineFunctionPassManager &)> &C) {
608+
PreGlobalInstructionSelectEPCallbacks.push_back(C);
609+
}
610+
611+
void registerPostGlobalInstructionSelectEPCallback(
612+
const std::function<void(MachineFunctionPassManager &)> &C) {
613+
PostGlobalInstructionSelectEPCallbacks.push_back(C);
614+
}
615+
616+
void registerMachineLateOptimizationEPCallback(
617+
const std::function<void(MachineFunctionPassManager &)> &C) {
618+
MachineLateOptimizationEPCallbacks.push_back(C);
619+
}
620+
621+
void registerPreSched2EPCallback(
622+
const std::function<void(MachineFunctionPassManager &)> &C) {
623+
PreSched2EPCallbacks.push_back(C);
624+
}
625+
626+
void registerPostRewriteEPCallback(
627+
const std::function<void(MachineFunctionPassManager &)> &C) {
628+
PostRewriteEPCallbacks.push_back(C);
629+
}
630+
631+
void registerPreEmitEPCallback(
632+
const std::function<void(MachineFunctionPassManager &)> &C) {
633+
PreEmitEPCallbacks.push_back(C);
634+
}
635+
636+
void registerPostBBSectionsEPCallback(
637+
const std::function<void(MachineFunctionPassManager &)> &C) {
638+
PostBBSectionsEPCallbacks.push_back(C);
639+
}
640+
641+
void registerMIEmitEPCallback(
642+
const std::function<void(MachineFunctionPassManager &)> &C) {
643+
MIEmitEPCallbacks.push_back(C);
644+
}
645+
646+
void setAddInstSelectorCallback(
647+
const std::function<void(MachineFunctionPassManager &)> &C) {
648+
AddInstSelectorCallback = C;
649+
}
650+
651+
void setCodeGenPreparePassesCallback(
652+
const std::function<void(ModulePassManager &)> C) {
653+
AddCodeGenPreparePassesCallback = C;
654+
}
655+
656+
void setRegAllocFastCallback(
657+
const std::function<Error(MachineFunctionPassManager &)> &C) {
658+
AddRegAllocFastCallback = C;
659+
}
660+
661+
void setRegAllocOptimizedCallback(
662+
const std::function<Error(MachineFunctionPassManager &)> &C) {
663+
AddRegAllocOptimizedCallback = C;
664+
}
665+
///@}}
666+
667+
/// Building block callbacks for codegen pipeline.
668+
void addDefaultCodeGenPreparePasses(ModulePassManager &MPM);
669+
Error addDefaultRegAllocFastPasses(MachineFunctionPassManager &MFPM);
670+
Error addDefaultRegAllocOptimizedPasses(MachineFunctionPassManager &MFPM);
671+
672+
// New pass manager migration methods, don't use them
673+
// outside llvm!
674+
CGPassBuilderOption &getCGPBO() { return CGPBO; }
675+
526676
/// Register a callback for parsing an AliasAnalysis Name to populate
527677
/// the given AAManager \p AA
528678
void registerParseAACallback(
@@ -647,6 +797,28 @@ class PassBuilder {
647797
OptimizationLevel Level,
648798
ThinOrFullLTOPhase Phase);
649799

800+
void invokeCodeGenIREarlyEPCallbacks(ModulePassManager &MPM);
801+
void invokeGCLoweringEPCallbacks(FunctionPassManager &FPM);
802+
void invokeISelPrepareEPCallbacks(ModulePassManager &MPM);
803+
void invokeMachineSSAOptimizationEarlyEPCallbacks(
804+
MachineFunctionPassManager &MFPM);
805+
void
806+
invokeMachineSSAOptimizationLastEPCallbacks(MachineFunctionPassManager &MFPM);
807+
void invokePreRegAllocEPCallbacks(MachineFunctionPassManager &MFPM);
808+
void invokePostRegAllocEPCallbacks(MachineFunctionPassManager &MFPM);
809+
void invokePreRegBankSelectEPCallbacks(MachineFunctionPassManager &MFPM);
810+
void
811+
invokePreGlobalInstructionSelectEPCallbacks(MachineFunctionPassManager &MFPM);
812+
void invokePostGlobalInstructionSelectEPCallbacks(
813+
MachineFunctionPassManager &MFPM);
814+
void invokeILPOptsEPCallbacks(MachineFunctionPassManager &MFPM);
815+
void
816+
invokeMachineLateOptimizationEPCallbacks(MachineFunctionPassManager &MFPM);
817+
void invokePreEmitEPCallbacks(MachineFunctionPassManager &MFPM);
818+
void invokePostBBSectionsEPCallbacks(MachineFunctionPassManager &MFPM);
819+
void invokeMIEmitEPCallbacks(MachineFunctionPassManager &MFPM);
820+
void invokePreSched2EPCallbacks(MachineFunctionPassManager &MFPM);
821+
650822
static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
651823
if (!Name.consume_front(PassName))
652824
return false;
@@ -711,6 +883,21 @@ class PassBuilder {
711883
void addVectorPasses(OptimizationLevel Level, FunctionPassManager &FPM,
712884
bool IsFullLTO);
713885

886+
Error addExceptionHandlingPasses(FunctionPassManager &FPM);
887+
888+
Error addInstructionSelectorPasses(MachineFunctionPassManager &MFPM);
889+
890+
void addMachineSSAOptimizationPasses(MachineFunctionPassManager &MFPM);
891+
892+
Error addMachinePasses(ModulePassManager &MPM, FunctionPassManager &FPM,
893+
MachineFunctionPassManager &MFPM);
894+
895+
Error addRegisterAllocatorPasses(MachineFunctionPassManager &MFPM);
896+
897+
Error parseRegAllocOption(StringRef Text);
898+
899+
bool isOptimizedRegAlloc() const;
900+
714901
static std::optional<std::vector<PipelineElement>>
715902
parsePipelineText(StringRef Text);
716903

@@ -779,6 +966,55 @@ class PassBuilder {
779966
2>
780967
PipelineEarlySimplificationEPCallbacks;
781968

969+
// CodeGen extension point callbacks
970+
std::function<Error(ModulePassManager &, raw_pwrite_stream &,
971+
raw_pwrite_stream *, CodeGenFileType, MCContext &)>
972+
CustomCodeGenPipelineBuilderCallback;
973+
974+
SmallVector<std::function<void(ModulePassManager &)>, 2>
975+
CodeGenIREarlyEPCallbacks;
976+
SmallVector<std::function<void(FunctionPassManager &)>, 2>
977+
GCLoweringEPCallbacks;
978+
SmallVector<std::function<void(ModulePassManager &)>, 2>
979+
ISelPrepareEPCallbacks;
980+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
981+
MachineSSAOptimizationEarlyEPCallbacks;
982+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
983+
MachineSSAOptimizationLastEPCallbacks;
984+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
985+
PreRegAllocEPCallbacks;
986+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
987+
PostRegAllocEPCallbacks;
988+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
989+
PreRegBankSelectEPCallbacks;
990+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
991+
PreGlobalInstructionSelectEPCallbacks;
992+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
993+
PostGlobalInstructionSelectEPCallbacks;
994+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
995+
ILPOptsEPCallbacks;
996+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
997+
MachineLateOptimizationEPCallbacks;
998+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
999+
PreSched2EPCallbacks;
1000+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
1001+
PostRewriteEPCallbacks;
1002+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
1003+
PreEmitEPCallbacks;
1004+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
1005+
PostBBSectionsEPCallbacks;
1006+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
1007+
MIEmitEPCallbacks;
1008+
1009+
std::function<void(ModulePassManager &)> AddCodeGenPreparePassesCallback;
1010+
std::function<void(MachineFunctionPassManager &)> AddInstSelectorCallback;
1011+
std::function<Error(MachineFunctionPassManager &)> AddRegAllocFastCallback;
1012+
std::function<Error(MachineFunctionPassManager &)>
1013+
AddRegAllocOptimizedCallback;
1014+
StringSet<> DisabledPasses;
1015+
StringMap<MachineFunctionPassManager> RegAllocPasses;
1016+
// TODO: Add methods in LLVMTargetMachine so we can get rid of it.
1017+
7821018
SmallVector<std::function<void(ModuleAnalysisManager &)>, 2>
7831019
ModuleAnalysisRegistrationCallbacks;
7841020
SmallVector<std::function<bool(StringRef, ModulePassManager &,

llvm/include/llvm/Target/CGPassBuilderOption.h

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ struct CGPassBuilderOption {
4242
bool PrintLSR = false;
4343
bool DisableMergeICmps = false;
4444
bool DisablePartialLibcallInlining = false;
45+
bool DisableReplaceWithVecLib = false;
46+
bool DisableLayoutFSProfileLoader = false;
47+
bool DisablePrologEpilogInserterPass = false;
4548
bool DisableConstantHoisting = false;
4649
bool DisableSelectOptimize = true;
4750
bool DisableAtExitBasedGlobalDtorLowering = false;

llvm/lib/CodeGen/MachinePassManager.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ bool MachineFunctionAnalysisManagerFunctionProxy::Result::invalidate(
105105
return false;
106106
}
107107

108+
void FunctionToMachineFunctionPassAdaptor::eraseIf(
109+
function_ref<bool(StringRef)> Pred) {
110+
StringRef PassName = Pass->name();
111+
if (PassName.contains("PassManager") || PassName.ends_with("PassAdaptor")) {
112+
Pass->eraseIf(Pred);
113+
if (Pass->isEmpty())
114+
Pass.reset();
115+
} else if (Pred(PassName)) {
116+
Pass.reset();
117+
}
118+
}
119+
108120
PreservedAnalyses
109121
FunctionToMachineFunctionPassAdaptor::run(Function &F,
110122
FunctionAnalysisManager &FAM) {

0 commit comments

Comments
 (0)