@@ -556,7 +556,8 @@ void jl_dump_native_impl(void *native_code,
556556 PM.add (createBitcodeWriterPass (unopt_bc_OS));
557557 PM.run (M);
558558 }
559- optimizeModule (M, TM.get (), jl_options.opt_level , true , true );
559+ NewPassManager NPM (*TM, jl_options.opt_level , true , true );
560+ NPM.run (M);
560561 legacy::PassManager PM;
561562 if (bc_fname)
562563 PM.add (createBitcodeWriterPass (bc_OS));
@@ -1049,7 +1050,7 @@ static void addSanitizers(ModulePassManager &MPM, int optlevel) {
10491050 // }
10501051}
10511052
1052- static void addPipeline (ModulePassManager &MPM, int opt_level, bool lower_intrinsics, bool dump_native)
1053+ static void addPipeline (ModulePassManager &MPM, int opt_level, bool lower_intrinsics, bool dump_native, bool external_use )
10531054{
10541055 // TODO: CommonInstruction hoisting/sinking enables AllocOpt
10551056 // to merge allocations and sometimes eliminate them,
@@ -1115,7 +1116,7 @@ static void addPipeline(ModulePassManager &MPM, int opt_level, bool lower_intrin
11151116 }
11161117 MPM.addPass (LowerSIMDLoop ()); // Annotate loop marked with "loopinfo" as LLVM parallel loop
11171118 if (dump_native) {
1118- MPM.addPass (MultiVersioning ());
1119+ MPM.addPass (MultiVersioning (external_use ));
11191120 MPM.addPass (CPUFeatures ());
11201121 // minimal clean-up to get rid of CPU feature checks
11211122 if (opt_level == 1 ) {
@@ -1150,7 +1151,7 @@ static void addPipeline(ModulePassManager &MPM, int opt_level, bool lower_intrin
11501151 }
11511152
11521153 if (dump_native)
1153- MPM.addPass (MultiVersioning ());
1154+ MPM.addPass (MultiVersioning (external_use ));
11541155 MPM.addPass (CPUFeatures ());
11551156 {
11561157 FunctionPassManager FPM;
@@ -1314,80 +1315,88 @@ static void addPipeline(ModulePassManager &MPM, int opt_level, bool lower_intrin
13141315// TargetMachine::registerPassBuilderCallbacks. We need to find a solution either in working with upstream
13151316// or adapting PassBuilder (or subclassing it) to suite our needs. This is in particular important for
13161317// BPF, NVPTX, and AMDGPU.
1317-
1318- void optimizeModule (Module &M, TargetMachine *TM, int opt_level, bool lower_intrinsics, bool dump_native)
1319- {
1320- // llvm::PassBuilder pb(targetMachine->LLVM, llvm::PipelineTuningOptions(), llvm::None, &passInstrumentationCallbacks);
1321- PassInstrumentationCallbacks PIC;
1322- StandardInstrumentations SI (false );
1323- SI.registerCallbacks (PIC);
1318+ namespace { // NewPM
1319+ auto createPIC (StandardInstrumentations &SI) {
1320+ auto PIC = std::make_unique<PassInstrumentationCallbacks>();
1321+ SI.registerCallbacks (*PIC);
13241322
13251323// Borrowed from LLVM PassBuilder.cpp:386
13261324#define MODULE_PASS (NAME, CREATE_PASS ) \
1327- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1325+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13281326#define MODULE_PASS_WITH_PARAMS (NAME, CLASS, CREATE_PASS, PARSER, PARAMS ) \
1329- PIC. addClassToPassName (CLASS, NAME);
1327+ PIC-> addClassToPassName (CLASS, NAME);
13301328#define MODULE_ANALYSIS (NAME, CREATE_PASS ) \
1331- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1329+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13321330#define FUNCTION_PASS (NAME, CREATE_PASS ) \
1333- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1331+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13341332#define FUNCTION_PASS_WITH_PARAMS (NAME, CLASS, CREATE_PASS, PARSER, PARAMS ) \
1335- PIC. addClassToPassName (CLASS, NAME);
1333+ PIC-> addClassToPassName (CLASS, NAME);
13361334#define FUNCTION_ANALYSIS (NAME, CREATE_PASS ) \
1337- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1335+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13381336#define LOOPNEST_PASS (NAME, CREATE_PASS ) \
1339- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1337+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13401338#define LOOP_PASS (NAME, CREATE_PASS ) \
1341- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1339+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13421340#define LOOP_PASS_WITH_PARAMS (NAME, CLASS, CREATE_PASS, PARSER, PARAMS ) \
1343- PIC. addClassToPassName (CLASS, NAME);
1341+ PIC-> addClassToPassName (CLASS, NAME);
13441342#define LOOP_ANALYSIS (NAME, CREATE_PASS ) \
1345- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1343+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13461344#define CGSCC_PASS (NAME, CREATE_PASS ) \
1347- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1345+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13481346#define CGSCC_PASS_WITH_PARAMS (NAME, CLASS, CREATE_PASS, PARSER, PARAMS ) \
1349- PIC. addClassToPassName (CLASS, NAME);
1347+ PIC-> addClassToPassName (CLASS, NAME);
13501348#define CGSCC_ANALYSIS (NAME, CREATE_PASS ) \
1351- PIC. addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
1349+ PIC-> addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
13521350
13531351#include " llvm-julia-passes.inc"
13541352
1355- PassBuilder PB (TM, PipelineTuningOptions (), None, &PIC);
1356- // Create the analysis managers.
1357- LoopAnalysisManager LAM;
1358- PB.registerLoopAnalyses (LAM);
1359-
1360- AAManager AA;
1361- // TODO: Why are we only doing this for -O3?
1362- if (opt_level >= 3 ) {
1363- AA.registerFunctionAnalysis <BasicAA>();
1353+ return PIC;
13641354 }
1365- if (opt_level >= 2 ) {
1366- AA.registerFunctionAnalysis <ScopedNoAliasAA>();
1367- AA.registerFunctionAnalysis <TypeBasedAA>();
1368- }
1369- // TM->registerDefaultAliasAnalyses(AA);
1370-
1371- FunctionAnalysisManager FAM;
1372- // Register the AA manager first so that our version is the one used.
1373- FAM.registerPass ([&] { return std::move (AA); });
1374- // Register our TargetLibraryInfoImpl.
1375- FAM.registerPass ([&] { return llvm::TargetIRAnalysis (TM->getTargetIRAnalysis ()); });
1376- FAM.registerPass ([&] { return llvm::TargetLibraryAnalysis (llvm::TargetLibraryInfoImpl (TM->getTargetTriple ())); });
13771355
1378- PB.registerFunctionAnalyses (FAM);
1379-
1380- CGSCCAnalysisManager CGAM;
1381- PB.registerCGSCCAnalyses (CGAM);
1356+ auto createFAM (TargetMachine &TM, int opt_level) {
1357+ AAManager AA;
1358+ // TODO: Why are we only doing this for -O3?
1359+ if (opt_level >= 3 ) {
1360+ AA.registerFunctionAnalysis <BasicAA>();
1361+ }
1362+ if (opt_level >= 2 ) {
1363+ AA.registerFunctionAnalysis <ScopedNoAliasAA>();
1364+ AA.registerFunctionAnalysis <TypeBasedAA>();
1365+ }
1366+ // TM->registerDefaultAliasAnalyses(AA);
1367+
1368+ FunctionAnalysisManager FAM;
1369+ // Register the AA manager first so that our version is the one used.
1370+ FAM.registerPass ([&] { return std::move (AA); });
1371+ // Register our TargetLibraryInfoImpl.
1372+ FAM.registerPass ([&] { return llvm::TargetIRAnalysis (TM.getTargetIRAnalysis ()); });
1373+ FAM.registerPass ([&] { return llvm::TargetLibraryAnalysis (llvm::TargetLibraryInfoImpl (TM.getTargetTriple ())); });
1374+ return FAM;
1375+ }
13821376
1383- ModuleAnalysisManager MAM;
1384- PB.registerModuleAnalyses (MAM);
1377+ auto createPB (TargetMachine &TM, PassInstrumentationCallbacks &PIC, LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM) {
1378+ PassBuilder PB (&TM, PipelineTuningOptions (), None, &PIC);
1379+ PB.registerLoopAnalyses (LAM);
1380+ PB.registerFunctionAnalyses (FAM);
1381+ PB.registerCGSCCAnalyses (CGAM);
1382+ PB.registerModuleAnalyses (MAM);
1383+ PB.crossRegisterProxies (LAM, FAM, CGAM, MAM);
1384+ return PB;
1385+ }
13851386
1386- PB.crossRegisterProxies (LAM, FAM, CGAM, MAM);
1387+ auto createMPM (int opt_level, bool lower_intrinsics, bool dump_native, bool external_use) {
1388+ ModulePassManager MPM;
1389+ addPipeline (MPM, opt_level, lower_intrinsics, dump_native, external_use);
1390+ return MPM;
1391+ }
1392+ }
13871393
1388- ModulePassManager MPM;
1389- addPipeline (MPM, opt_level, lower_intrinsics, dump_native);
1394+ NewPassManager::NewPassManager (TargetMachine &TM, int opt_level, bool lower_intrinsics, bool dump_native, bool external_use)
1395+ : SI(false ), PIC(createPIC(SI)), LAM(), FAM(createFAM(TM, opt_level)), CGAM(), MAM(),
1396+ PB(createPB(TM, *PIC, LAM, FAM, CGAM, MAM)),
1397+ MPM(createMPM(opt_level, lower_intrinsics, dump_native, external_use)) {}
13901398
1399+ void NewPassManager::run (Module &M) {
13911400 MPM.run (M, MAM);
13921401}
13931402
@@ -1550,10 +1559,12 @@ void *jl_get_llvmf_defn_impl(jl_method_instance_t *mi, size_t world, char getwra
15501559 // and will better match what's actually in sysimg.
15511560 for (auto &global : output.globals )
15521561 global.second ->setLinkage (GlobalValue::ExternalLinkage);
1553- if (optimize)
1562+ if (optimize) {
15541563 // Safe b/c context lock is held by output
15551564 // PM->run(*m.getModuleUnlocked());
1556- optimizeModule (*m.getModuleUnlocked (), &jl_ExecutionEngine->getTargetMachine (), jl_options.opt_level );
1565+ NewPassManager NPM (jl_ExecutionEngine->getTargetMachine (), jl_options.opt_level );
1566+ NPM.run (*m.getModuleUnlocked ());
1567+ }
15571568 const std::string *fname;
15581569 if (decls.functionObject == " jl_fptr_args" || decls.functionObject == " jl_fptr_sparam" )
15591570 getwrapper = false ;
0 commit comments