Skip to content

Commit c5e1466

Browse files
committed
[NewPM] Add callback style codegen pass builder
1 parent 5364e1c commit c5e1466

16 files changed

+1290
-24
lines changed

llvm/include/llvm/CodeGen/TargetPassConfig.h

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ template <typename Derived, typename TargetMachineT>
523523
Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
524524
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
525525
CodeGenFileType FileType) const {
526-
auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
526+
auto StartStopInfo = TargetPassConfig::getStartStopInfo();
527527
if (!StartStopInfo)
528528
return StartStopInfo.takeError();
529529
setStartStopPasses(*StartStopInfo);

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ DUMMY_MACHINE_MODULE_PASS("mir-strip-debug", StripDebugMachineModulePass)
191191
#ifndef DUMMY_MACHINE_FUNCTION_PASS
192192
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME)
193193
#endif
194+
DUMMY_MACHINE_FUNCTION_PASS("bb-path-cloning", BasicBlockPathCloningPass)
194195
DUMMY_MACHINE_FUNCTION_PASS("bbsections-prepare", BasicBlockSectionsPass)
195196
DUMMY_MACHINE_FUNCTION_PASS("bbsections-profile-reader", BasicBlockSectionsProfileReaderPass)
196197
DUMMY_MACHINE_FUNCTION_PASS("block-placement", MachineBlockPlacementPass)
@@ -210,6 +211,8 @@ DUMMY_MACHINE_FUNCTION_PASS("fixup-statepoint-caller-saved", FixupStatepointCall
210211
DUMMY_MACHINE_FUNCTION_PASS("fs-profile-loader", MIRProfileLoaderNewPass)
211212
DUMMY_MACHINE_FUNCTION_PASS("funclet-layout", FuncletLayoutPass)
212213
DUMMY_MACHINE_FUNCTION_PASS("gc-empty-basic-blocks", GCEmptyBasicBlocksPass)
214+
DUMMY_MACHINE_FUNCTION_PASS("gc-machine-code-insersion",
215+
GCMachineCodeInsertionPass)
213216
DUMMY_MACHINE_FUNCTION_PASS("implicit-null-checks", ImplicitNullChecksPass)
214217
DUMMY_MACHINE_FUNCTION_PASS("init-undef-pass", InitUndefPass)
215218
DUMMY_MACHINE_FUNCTION_PASS("instruction-select", InstructionSelectPass)
@@ -261,6 +264,8 @@ DUMMY_MACHINE_FUNCTION_PASS("stack-slot-coloring", StackSlotColoringPass)
261264
DUMMY_MACHINE_FUNCTION_PASS("stackmap-liveness", StackMapLivenessPass)
262265
DUMMY_MACHINE_FUNCTION_PASS("tailduplication", TailDuplicatePass)
263266
DUMMY_MACHINE_FUNCTION_PASS("unpack-mi-bundles", UnpackMachineBundlesPass)
267+
DUMMY_MACHINE_FUNCTION_PASS("unreachable-mbb-elimination",
268+
UnreachableMachineBlockElimPass)
264269
DUMMY_MACHINE_FUNCTION_PASS("virtregrewriter", VirtRegRewriterPass)
265270
DUMMY_MACHINE_FUNCTION_PASS("xray-instrumentation", XRayInstrumentationPass)
266271
#undef DUMMY_MACHINE_FUNCTION_PASS

llvm/include/llvm/Passes/PassBuilder.h

Lines changed: 241 additions & 0 deletions
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/Instrumentation.h"
@@ -35,6 +38,7 @@ class StringRef;
3538
class AAManager;
3639
class TargetMachine;
3740
class ModuleSummaryIndex;
41+
class MCContext;
3842
template <typename T> class IntrusiveRefCntPtr;
3943
namespace vfs {
4044
class FileSystem;
@@ -107,6 +111,7 @@ class PassBuilder {
107111
TargetMachine *TM;
108112
PipelineTuningOptions PTO;
109113
std::optional<PGOOptions> PGOOpt;
114+
CGPassBuilderOption CGPBO;
110115
PassInstrumentationCallbacks *PIC;
111116

112117
public:
@@ -307,6 +312,24 @@ class PassBuilder {
307312
/// TargetMachine::registerDefaultAliasAnalyses().
308313
AAManager buildDefaultAAPipeline();
309314

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

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

793+
void invokeCodeGenIREarlyEPCallbacks(ModulePassManager &MPM);
794+
void invokeCodeGenIRLateEPCallbacks(ModulePassManager &MPM);
795+
void invokeCodeGenIRFinalEPCallbacks(FunctionPassManager &FPM);
796+
void invokeGCLoweringEPCallbacks(FunctionPassManager &FPM);
797+
void invokeISelPrepareEPCallbacks(ModulePassManager &MPM);
798+
void invokeMachineSSAOptimizationEarlyEPCallbacks(
799+
MachineFunctionPassManager &MFPM);
800+
void
801+
invokeMachineSSAOptimizationLastEPCallbacks(MachineFunctionPassManager &MFPM);
802+
void invokePreRegAllocEPCallbacks(MachineFunctionPassManager &MFPM);
803+
void invokePostRegAllocEPCallbacks(MachineFunctionPassManager &MFPM);
804+
void invokePreRegBankSelectEPCallbacks(MachineFunctionPassManager &MFPM);
805+
void
806+
invokePreGlobalInstructionSelectEPCallbacks(MachineFunctionPassManager &MFPM);
807+
void invokePostGlobalInstructionSelectEPCallbacks(
808+
MachineFunctionPassManager &MFPM);
809+
void invokeILPOptsEPCallbacks(MachineFunctionPassManager &MFPM);
810+
void
811+
invokeMachineLateOptimizationEPCallbacks(MachineFunctionPassManager &MFPM);
812+
void invokePreEmitEPCallbacks(MachineFunctionPassManager &MFPM);
813+
void invokePostBBSectionsEPCallbacks(MachineFunctionPassManager &MFPM);
814+
void invokeMIEmitEPCallbacks(MachineFunctionPassManager &MFPM);
815+
void invokePreSched2EPCallbacks(MachineFunctionPassManager &MFPM);
816+
643817
static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
644818
if (!Name.consume_front(PassName))
645819
return false;
@@ -704,6 +878,21 @@ class PassBuilder {
704878
void addVectorPasses(OptimizationLevel Level, FunctionPassManager &FPM,
705879
bool IsFullLTO);
706880

881+
Error addExceptionHandlingPasses(FunctionPassManager &FPM);
882+
883+
Error addInstructionSelectorPasses(MachineFunctionPassManager &MFPM);
884+
885+
void addMachineSSAOptimizationPasses(MachineFunctionPassManager &MFPM);
886+
887+
Error addMachinePasses(ModulePassManager &MPM, FunctionPassManager &FPM,
888+
MachineFunctionPassManager &MFPM);
889+
890+
Error addRegisterAllocatorPasses(MachineFunctionPassManager &MFPM);
891+
892+
Error parseRegAllocOption(StringRef Text);
893+
894+
bool isOptimizedRegAlloc() const;
895+
707896
static std::optional<std::vector<PipelineElement>>
708897
parsePipelineText(StringRef Text);
709898

@@ -766,6 +955,58 @@ class PassBuilder {
766955
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
767956
PipelineEarlySimplificationEPCallbacks;
768957

958+
// CodeGen extension point callbacks
959+
std::function<Error(ModulePassManager &, raw_pwrite_stream &,
960+
raw_pwrite_stream *, CodeGenFileType, MCContext &)>
961+
CustomCodeGenPipelineBuilderCallback;
962+
963+
SmallVector<std::function<void(ModulePassManager &)>, 2>
964+
CodeGenIREarlyEPCallbacks;
965+
SmallVector<std::function<void(ModulePassManager &)>, 2>
966+
CodeGenIRLateEPCallbacks;
967+
SmallVector<std::function<void(FunctionPassManager &)>, 2>
968+
CodeGenIRFinalEPCallbacks;
969+
SmallVector<std::function<void(FunctionPassManager &)>, 2>
970+
GCLoweringEPCallbacks;
971+
SmallVector<std::function<void(ModulePassManager &)>, 2>
972+
ISelPrepareEPCallbacks;
973+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
974+
MachineSSAOptimizationEarlyEPCallbacks;
975+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
976+
MachineSSAOptimizationLastEPCallbacks;
977+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
978+
PreRegAllocEPCallbacks;
979+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
980+
PostRegAllocEPCallbacks;
981+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
982+
PreRegBankSelectEPCallbacks;
983+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
984+
PreGlobalInstructionSelectEPCallbacks;
985+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
986+
PostGlobalInstructionSelectEPCallbacks;
987+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
988+
ILPOptsEPCallbacks;
989+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
990+
MachineLateOptimizationEPCallbacks;
991+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
992+
PreSched2EPCallbacks;
993+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
994+
PostRewriteEPCallbacks;
995+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
996+
PreEmitEPCallbacks;
997+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
998+
PostBBSectionsEPCallbacks;
999+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
1000+
MIEmitEPCallbacks;
1001+
1002+
std::function<void(MachineFunctionPassManager &)> AddInstSelectorCallback;
1003+
std::function<Error(MachineFunctionPassManager &)> AddFastRegAllocCallback;
1004+
std::function<Error(MachineFunctionPassManager &)>
1005+
AddOptimizedRegAllocCallback;
1006+
StringSet<> DisabledPasses;
1007+
StringMap<MachineFunctionPassManager> RegAllocPasses;
1008+
// TODO: Add methods in LLVMTargetMachine so we can get rid of it.
1009+
7691010
SmallVector<std::function<void(ModuleAnalysisManager &)>, 2>
7701011
ModuleAnalysisRegistrationCallbacks;
7711012
SmallVector<std::function<bool(StringRef, ModulePassManager &,

llvm/include/llvm/Target/CGPassBuilderOption.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ struct CGPassBuilderOption {
4141
bool PrintLSR = false;
4242
bool DisableMergeICmps = false;
4343
bool DisablePartialLibcallInlining = false;
44+
bool DisableReplaceWithVecLib = false;
45+
bool DisableLayoutFSProfileLoader = false;
46+
bool DisablePrologEpilogInserterPass = false;
4447
bool DisableConstantHoisting = false;
4548
bool DisableSelectOptimize = true;
4649
bool DisableAtExitBasedGlobalDtorLowering = false;

llvm/lib/CodeGen/MachinePassManager.cpp

Lines changed: 12 additions & 0 deletions
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)