Skip to content

Commit 021a00b

Browse files
pchintalapudipcjentsch
authored andcommitted
Create the new pass manager pipelines (JuliaLang#46175)
* Create basic NewPM structures * Replace incidental uses of the legacy pass manager with the new pass manager * Run the MC emitter
1 parent 429c7fe commit 021a00b

File tree

6 files changed

+700
-74
lines changed

6 files changed

+700
-74
lines changed

src/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ CODEGEN_SRCS := codegen jitlayers aotcompile debuginfo disasm llvm-simdloop llvm
5656
llvm-final-gc-lowering llvm-pass-helpers llvm-late-gc-lowering llvm-ptls \
5757
llvm-lower-handlers llvm-gc-invariant-verifier llvm-propagate-addrspaces \
5858
llvm-multiversioning llvm-alloc-opt llvm-alloc-helpers cgmemmgr llvm-remove-addrspaces \
59-
llvm-remove-ni llvm-julia-licm llvm-demote-float16 llvm-cpufeatures
59+
llvm-remove-ni llvm-julia-licm llvm-demote-float16 llvm-cpufeatures pipeline
6060
FLAGS += -I$(shell $(LLVM_CONFIG_HOST) --includedir)
6161
CG_LLVM_LIBS := all
6262
ifeq ($(USE_POLLY),1)
@@ -317,6 +317,7 @@ $(BUILDDIR)/signal-handling.o $(BUILDDIR)/signal-handling.dbg.obj: $(addprefix $
317317
$(BUILDDIR)/staticdata.o $(BUILDDIR)/staticdata.dbg.obj: $(SRCDIR)/processor.h $(SRCDIR)/builtin_proto.h
318318
$(BUILDDIR)/toplevel.o $(BUILDDIR)/toplevel.dbg.obj: $(SRCDIR)/builtin_proto.h
319319
$(BUILDDIR)/ircode.o $(BUILDDIR)/ircode.dbg.obj: $(SRCDIR)/serialize.h
320+
$(BUILDDIR)/pipeline.o $(BUILDDIR)/pipeline.dbg.obj: $(SRCDIR)/passes.h $(SRCDIR)/jitlayers.h
320321

321322
$(addprefix $(BUILDDIR)/,threading.o threading.dbg.obj gc.o gc.dbg.obj init.c init.dbg.obj task.o task.dbg.obj): $(addprefix $(SRCDIR)/,threading.h)
322323
$(addprefix $(BUILDDIR)/,APInt-C.o APInt-C.dbg.obj runtime_intrinsics.o runtime_intrinsics.dbg.obj): $(SRCDIR)/APInt-C.h

src/aotcompile.cpp

Lines changed: 22 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -515,20 +515,23 @@ void jl_dump_native_impl(void *native_code,
515515
std::vector<NewArchiveMember> unopt_bc_Archive;
516516
std::vector<std::string> outputs;
517517

518-
legacy::PassManager preopt, postopt;
518+
PassBuilder emptyPB;
519+
AnalysisManagers empty(emptyPB);
520+
ModulePassManager preopt, postopt;
521+
legacy::PassManager emitter; // MC emission is only supported on legacy PM
519522

520523
if (unopt_bc_fname)
521-
preopt.add(createBitcodeWriterPass(unopt_bc_OS));
524+
preopt.addPass(BitcodeWriterPass(unopt_bc_OS));
522525

523-
//Is this necessary for TM?
524-
// addTargetPasses(&postopt, TM->getTargetTriple(), TM->getTargetIRAnalysis());
525526
if (bc_fname)
526-
postopt.add(createBitcodeWriterPass(bc_OS));
527+
postopt.addPass(BitcodeWriterPass(bc_OS));
528+
//Is this necessary for TM?
529+
addTargetPasses(&emitter, TM->getTargetTriple(), TM->getTargetIRAnalysis());
527530
if (obj_fname)
528-
if (TM->addPassesToEmitFile(postopt, obj_OS, nullptr, CGFT_ObjectFile, false))
531+
if (TM->addPassesToEmitFile(emitter, obj_OS, nullptr, CGFT_ObjectFile, false))
529532
jl_safe_printf("ERROR: target does not support generation of object files\n");
530533
if (asm_fname)
531-
if (TM->addPassesToEmitFile(postopt, asm_OS, nullptr, CGFT_AssemblyFile, false))
534+
if (TM->addPassesToEmitFile(emitter, asm_OS, nullptr, CGFT_AssemblyFile, false))
532535
jl_safe_printf("ERROR: target does not support generation of object files\n");
533536

534537
legacy::PassManager optimizer;
@@ -567,7 +570,7 @@ void jl_dump_native_impl(void *native_code,
567570

568571
// do the actual work
569572
auto add_output = [&] (Module &M, StringRef unopt_bc_Name, StringRef bc_Name, StringRef obj_Name, StringRef asm_Name) {
570-
preopt.run(M);
573+
preopt.run(M, empty.MAM);
571574
optimizer.run(M);
572575

573576
// We would like to emit an alias or an weakref alias to redirect these symbols
@@ -585,7 +588,8 @@ void jl_dump_native_impl(void *native_code,
585588
injectCRTAlias(M, "__truncdfhf2", "julia__truncdfhf2",
586589
FunctionType::get(Type::getHalfTy(Context), { Type::getDoubleTy(Context) }, false));
587590

588-
postopt.run(M);
591+
postopt.run(M, empty.MAM);
592+
emitter.run(M);
589593

590594
if (unopt_bc_fname)
591595
emit_result(unopt_bc_Archive, unopt_bc_Buffer, unopt_bc_Name, outputs);
@@ -946,79 +950,27 @@ static void registerCallbacks(PassBuilder &PB) {
946950
PB.registerPipelineParsingCallback(
947951
[](StringRef Name, FunctionPassManager &PM,
948952
ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
949-
if (Name == "DemoteFloat16") {
950-
PM.addPass(DemoteFloat16());
951-
return true;
952-
}
953-
if (Name == "CombineMulAdd") {
954-
PM.addPass(CombineMulAdd());
955-
return true;
956-
}
957-
if (Name == "LateLowerGCFrame") {
958-
PM.addPass(LateLowerGC());
959-
return true;
960-
}
961-
if (Name == "AllocOpt") {
962-
PM.addPass(AllocOptPass());
963-
return true;
964-
}
965-
if (Name == "PropagateJuliaAddrspaces") {
966-
PM.addPass(PropagateJuliaAddrspacesPass());
967-
return true;
968-
}
969-
if (Name == "LowerExcHandlers") {
970-
PM.addPass(LowerExcHandlers());
971-
return true;
972-
}
973-
if (Name == "GCInvariantVerifier") {
974-
// TODO: Parse option and allow users to set `Strong`
975-
PM.addPass(GCInvariantVerifierPass());
976-
return true;
977-
}
953+
#define FUNCTION_PASS(NAME, CREATE_PASS) if (Name == NAME) { PM.addPass(CREATE_PASS); return true; }
954+
#include "llvm-julia-passes.inc"
955+
#undef FUNCTION_PASS
978956
return false;
979957
});
980958

981959
PB.registerPipelineParsingCallback(
982960
[](StringRef Name, ModulePassManager &PM,
983961
ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
984-
if (Name == "CPUFeatures") {
985-
PM.addPass(CPUFeatures());
986-
return true;
987-
}
988-
if (Name == "RemoveNI") {
989-
PM.addPass(RemoveNI());
990-
return true;
991-
}
992-
if (Name == "LowerSIMDLoop") {
993-
PM.addPass(LowerSIMDLoop());
994-
return true;
995-
}
996-
if (Name == "FinalLowerGC") {
997-
PM.addPass(FinalLowerGCPass());
998-
return true;
999-
}
1000-
if (Name == "RemoveJuliaAddrspaces") {
1001-
PM.addPass(RemoveJuliaAddrspacesPass());
1002-
return true;
1003-
}
1004-
if (Name == "MultiVersioning") {
1005-
PM.addPass(MultiVersioning());
1006-
return true;
1007-
}
1008-
if (Name == "LowerPTLS") {
1009-
PM.addPass(LowerPTLSPass());
1010-
return true;
1011-
}
962+
#define MODULE_PASS(NAME, CREATE_PASS) if (Name == NAME) { PM.addPass(CREATE_PASS); return true; }
963+
#include "llvm-julia-passes.inc"
964+
#undef MODULE_PASS
1012965
return false;
1013966
});
1014967

1015968
PB.registerPipelineParsingCallback(
1016969
[](StringRef Name, LoopPassManager &PM,
1017970
ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
1018-
if (Name == "JuliaLICM") {
1019-
PM.addPass(JuliaLICMPass());
1020-
return true;
1021-
}
971+
#define LOOP_PASS(NAME, CREATE_PASS) if (Name == NAME) { PM.addPass(CREATE_PASS); return true; }
972+
#include "llvm-julia-passes.inc"
973+
#undef LOOP_PASS
1022974
return false;
1023975
});
1024976
}

src/disasm.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,9 +482,11 @@ void jl_strip_llvm_debug(Module *m)
482482

483483
void jl_strip_llvm_addrspaces(Module *m)
484484
{
485-
legacy::PassManager PM;
486-
PM.add(createRemoveJuliaAddrspacesPass());
487-
PM.run(*m);
485+
PassBuilder PB;
486+
AnalysisManagers AM(PB);
487+
ModulePassManager MPM;
488+
MPM.addPass(RemoveJuliaAddrspacesPass());
489+
MPM.run(*m, AM.MAM);
488490
}
489491

490492
// print an llvm IR acquired from jl_get_llvmf

src/jitlayers.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@
1313
#include <llvm/ExecutionEngine/Orc/IRTransformLayer.h>
1414
#include <llvm/ExecutionEngine/JITEventListener.h>
1515

16+
#include <llvm/Passes/PassBuilder.h>
17+
#include <llvm/Passes/PassPlugin.h>
18+
#include <llvm/Passes/StandardInstrumentations.h>
19+
1620
#include <llvm/Target/TargetMachine.h>
1721
#include "julia_assert.h"
1822
#include "debug-registry.h"
23+
#include "platform.h"
1924

2025
#include <stack>
2126
#include <queue>
@@ -69,6 +74,41 @@ static inline bool imaging_default() {
6974
return jl_options.image_codegen || (jl_generating_output() && !jl_options.incremental);
7075
}
7176

77+
struct OptimizationOptions {
78+
bool lower_intrinsics;
79+
bool dump_native;
80+
bool external_use;
81+
82+
static constexpr OptimizationOptions defaults() {
83+
return {true, false, false};
84+
}
85+
};
86+
87+
struct NewPM {
88+
std::unique_ptr<TargetMachine> TM;
89+
StandardInstrumentations SI;
90+
std::unique_ptr<PassInstrumentationCallbacks> PIC;
91+
PassBuilder PB;
92+
ModulePassManager MPM;
93+
OptimizationLevel O;
94+
95+
NewPM(std::unique_ptr<TargetMachine> TM, OptimizationLevel O, OptimizationOptions options = OptimizationOptions::defaults());
96+
97+
void run(Module &M);
98+
};
99+
100+
struct AnalysisManagers {
101+
LoopAnalysisManager LAM;
102+
FunctionAnalysisManager FAM;
103+
CGSCCAnalysisManager CGAM;
104+
ModuleAnalysisManager MAM;
105+
106+
AnalysisManagers(PassBuilder &PB);
107+
AnalysisManagers(TargetMachine &TM, PassBuilder &PB, OptimizationLevel O);
108+
};
109+
110+
OptimizationLevel getOptLevel(int optlevel);
111+
72112
struct jl_locked_stream {
73113
JL_STREAM *stream = nullptr;
74114
std::mutex mutex;

src/llvm-julia-passes.inc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//Module passes
2+
#ifdef MODULE_PASS
3+
MODULE_PASS("CPUFeatures", CPUFeatures())
4+
MODULE_PASS("RemoveNI", RemoveNI())
5+
MODULE_PASS("LowerSIMDLoop", LowerSIMDLoop())
6+
MODULE_PASS("FinalLowerGC", FinalLowerGCPass())
7+
MODULE_PASS("JuliaMultiVersioning", MultiVersioning())
8+
MODULE_PASS("RemoveJuliaAddrspaces", RemoveJuliaAddrspacesPass())
9+
MODULE_PASS("RemoveAddrspaces", RemoveAddrspacesPass())
10+
MODULE_PASS("LowerPTLSPass", LowerPTLSPass())
11+
#endif
12+
13+
//Function passes
14+
#ifdef FUNCTION_PASS
15+
FUNCTION_PASS("DemoteFloat16", DemoteFloat16())
16+
FUNCTION_PASS("CombineMulAdd", CombineMulAdd())
17+
FUNCTION_PASS("LateLowerGCFrame", LateLowerGC())
18+
FUNCTION_PASS("AllocOpt", AllocOptPass())
19+
FUNCTION_PASS("PropagateJuliaAddrspaces", PropagateJuliaAddrspacesPass())
20+
FUNCTION_PASS("LowerExcHandlers", LowerExcHandlers())
21+
FUNCTION_PASS("GCInvariantVerifier", GCInvariantVerifierPass())
22+
#endif
23+
24+
//Loop passes
25+
#ifdef LOOP_PASS
26+
LOOP_PASS("JuliaLICM", JuliaLICMPass())
27+
#endif

0 commit comments

Comments
 (0)