Skip to content

Commit ffdaaef

Browse files
committed
[NewPM] Add callback style codegen pass builder
1 parent 7de4c63 commit ffdaaef

16 files changed

+1291
-25
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
@@ -524,7 +524,7 @@ template <typename Derived, typename TargetMachineT>
524524
Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
525525
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
526526
CodeGenFileType FileType) const {
527-
auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
527+
auto StartStopInfo = TargetPassConfig::getStartStopInfo();
528528
if (!StartStopInfo)
529529
return StartStopInfo.takeError();
530530
setStartStopPasses(*StartStopInfo);

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ DUMMY_MACHINE_MODULE_PASS("mir-strip-debug", StripDebugMachineModulePass)
193193
#ifndef DUMMY_MACHINE_FUNCTION_PASS
194194
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME)
195195
#endif
196+
DUMMY_MACHINE_FUNCTION_PASS("bb-path-cloning", BasicBlockPathCloningPass)
196197
DUMMY_MACHINE_FUNCTION_PASS("bbsections-prepare", BasicBlockSectionsPass)
197198
DUMMY_MACHINE_FUNCTION_PASS("bbsections-profile-reader", BasicBlockSectionsProfileReaderPass)
198199
DUMMY_MACHINE_FUNCTION_PASS("block-placement", MachineBlockPlacementPass)
@@ -211,6 +212,8 @@ DUMMY_MACHINE_FUNCTION_PASS("fixup-statepoint-caller-saved", FixupStatepointCall
211212
DUMMY_MACHINE_FUNCTION_PASS("fs-profile-loader", MIRProfileLoaderNewPass)
212213
DUMMY_MACHINE_FUNCTION_PASS("funclet-layout", FuncletLayoutPass)
213214
DUMMY_MACHINE_FUNCTION_PASS("gc-empty-basic-blocks", GCEmptyBasicBlocksPass)
215+
DUMMY_MACHINE_FUNCTION_PASS("gc-machine-code-insersion",
216+
GCMachineCodeInsertionPass)
214217
DUMMY_MACHINE_FUNCTION_PASS("implicit-null-checks", ImplicitNullChecksPass)
215218
DUMMY_MACHINE_FUNCTION_PASS("init-undef-pass", InitUndefPass)
216219
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: 236 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/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:
@@ -306,6 +311,24 @@ class PassBuilder {
306311
/// TargetMachine::registerDefaultAliasAnalyses().
307312
AAManager buildDefaultAAPipeline();
308313

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

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

792+
void invokeCodeGenIREarlyEPCallbacks(ModulePassManager &MPM);
793+
void invokeGCLoweringEPCallbacks(FunctionPassManager &FPM);
794+
void invokeISelPrepareEPCallbacks(ModulePassManager &MPM);
795+
void invokeMachineSSAOptimizationEarlyEPCallbacks(
796+
MachineFunctionPassManager &MFPM);
797+
void
798+
invokeMachineSSAOptimizationLastEPCallbacks(MachineFunctionPassManager &MFPM);
799+
void invokePreRegAllocEPCallbacks(MachineFunctionPassManager &MFPM);
800+
void invokePostRegAllocEPCallbacks(MachineFunctionPassManager &MFPM);
801+
void invokePreRegBankSelectEPCallbacks(MachineFunctionPassManager &MFPM);
802+
void
803+
invokePreGlobalInstructionSelectEPCallbacks(MachineFunctionPassManager &MFPM);
804+
void invokePostGlobalInstructionSelectEPCallbacks(
805+
MachineFunctionPassManager &MFPM);
806+
void invokeILPOptsEPCallbacks(MachineFunctionPassManager &MFPM);
807+
void
808+
invokeMachineLateOptimizationEPCallbacks(MachineFunctionPassManager &MFPM);
809+
void invokePreEmitEPCallbacks(MachineFunctionPassManager &MFPM);
810+
void invokePostBBSectionsEPCallbacks(MachineFunctionPassManager &MFPM);
811+
void invokeMIEmitEPCallbacks(MachineFunctionPassManager &MFPM);
812+
void invokePreSched2EPCallbacks(MachineFunctionPassManager &MFPM);
813+
642814
static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
643815
if (!Name.consume_front(PassName))
644816
return false;
@@ -703,6 +875,21 @@ class PassBuilder {
703875
void addVectorPasses(OptimizationLevel Level, FunctionPassManager &FPM,
704876
bool IsFullLTO);
705877

878+
Error addExceptionHandlingPasses(FunctionPassManager &FPM);
879+
880+
Error addInstructionSelectorPasses(MachineFunctionPassManager &MFPM);
881+
882+
void addMachineSSAOptimizationPasses(MachineFunctionPassManager &MFPM);
883+
884+
Error addMachinePasses(ModulePassManager &MPM, FunctionPassManager &FPM,
885+
MachineFunctionPassManager &MFPM);
886+
887+
Error addRegisterAllocatorPasses(MachineFunctionPassManager &MFPM);
888+
889+
Error parseRegAllocOption(StringRef Text);
890+
891+
bool isOptimizedRegAlloc() const;
892+
706893
static std::optional<std::vector<PipelineElement>>
707894
parsePipelineText(StringRef Text);
708895

@@ -765,6 +952,55 @@ class PassBuilder {
765952
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
766953
PipelineEarlySimplificationEPCallbacks;
767954

955+
// CodeGen extension point callbacks
956+
std::function<Error(ModulePassManager &, raw_pwrite_stream &,
957+
raw_pwrite_stream *, CodeGenFileType, MCContext &)>
958+
CustomCodeGenPipelineBuilderCallback;
959+
960+
SmallVector<std::function<void(ModulePassManager &)>, 2>
961+
CodeGenIREarlyEPCallbacks;
962+
SmallVector<std::function<void(FunctionPassManager &)>, 2>
963+
GCLoweringEPCallbacks;
964+
SmallVector<std::function<void(ModulePassManager &)>, 2>
965+
ISelPrepareEPCallbacks;
966+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
967+
MachineSSAOptimizationEarlyEPCallbacks;
968+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
969+
MachineSSAOptimizationLastEPCallbacks;
970+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
971+
PreRegAllocEPCallbacks;
972+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
973+
PostRegAllocEPCallbacks;
974+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
975+
PreRegBankSelectEPCallbacks;
976+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
977+
PreGlobalInstructionSelectEPCallbacks;
978+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
979+
PostGlobalInstructionSelectEPCallbacks;
980+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
981+
ILPOptsEPCallbacks;
982+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
983+
MachineLateOptimizationEPCallbacks;
984+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
985+
PreSched2EPCallbacks;
986+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
987+
PostRewriteEPCallbacks;
988+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
989+
PreEmitEPCallbacks;
990+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
991+
PostBBSectionsEPCallbacks;
992+
SmallVector<std::function<void(MachineFunctionPassManager &)>, 2>
993+
MIEmitEPCallbacks;
994+
995+
std::function<void(ModulePassManager &)> AddCodeGenPreparePassesCallback;
996+
std::function<void(MachineFunctionPassManager &)> AddInstSelectorCallback;
997+
std::function<Error(MachineFunctionPassManager &)> AddRegAllocFastCallback;
998+
std::function<Error(MachineFunctionPassManager &)>
999+
AddRegAllocOptimizedCallback;
1000+
StringSet<> DisabledPasses;
1001+
StringMap<MachineFunctionPassManager> RegAllocPasses;
1002+
// TODO: Add methods in LLVMTargetMachine so we can get rid of it.
1003+
7681004
SmallVector<std::function<void(ModuleAnalysisManager &)>, 2>
7691005
ModuleAnalysisRegistrationCallbacks;
7701006
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)