Skip to content

Commit 56b942e

Browse files
committed
Better way to expose julia meta-pass
In the previous iteration of this code, timing would be double counted. This way, the individual passes are correctly registered with the top level manager, so timing works properly. It's a bit hacky but with the legacy pass manager, there's not much else to be done.
1 parent ae3bd5b commit 56b942e

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

src/jitlayers.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ namespace llvm {
5555
#include <llvm/Bitcode/BitcodeWriterPass.h>
5656
#endif
5757

58+
#include <llvm/IR/LegacyPassManagers.h>
59+
#include <llvm/IR/IRPrintingPasses.h>
5860
#include <llvm/Transforms/Utils/Cloning.h>
5961
#include <llvm/ExecutionEngine/JITEventListener.h>
6062

@@ -109,7 +111,7 @@ void jl_init_jit(Type *T_pjlvalue_)
109111

110112
// this defines the set of optimization passes defined for Julia at various optimization levels
111113
#if JL_LLVM_VERSION >= 30700
112-
void addOptimizationPasses(legacy::PassManager *PM, int opt_level)
114+
void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level)
113115
#else
114116
void addOptimizationPasses(PassManager *PM, int opt_level)
115117
#endif
@@ -1432,20 +1434,24 @@ GlobalVariable *jl_get_global_for(const char *cname, void *addr, Module *M)
14321434
// An LLVM module pass that just runs all julia passes in order. Useful for
14331435
// debugging
14341436
extern "C" void jl_init_codegen(void);
1435-
class JuliaPipeline : public ModulePass {
1437+
class JuliaPipeline : public Pass {
14361438
public:
14371439
static char ID;
1438-
JuliaPipeline() : ModulePass(ID) {}
1439-
virtual bool runOnModule(Module &M) {
1440+
// A bit of a hack, but works
1441+
struct TPMAdapter : public PassManagerBase {
1442+
PMTopLevelManager *TPM;
1443+
TPMAdapter(PMTopLevelManager *TPM) : TPM(TPM) {}
1444+
void add(Pass *P) { TPM->schedulePass(P); }
1445+
};
1446+
void preparePassManager(PMStack &Stack) override {
14401447
(void)jl_init_llvm();
1441-
#if JL_LLVM_VERSION >= 30700
1442-
legacy::PassManager PM;
1443-
#else
1444-
PassManager PM;
1445-
#endif
1446-
addOptimizationPasses(&PM, 3);
1447-
PM.run(M);
1448-
return true;
1448+
PMTopLevelManager *TPM = Stack.top()->getTopLevelManager();
1449+
TPMAdapter Adapter(TPM);
1450+
addOptimizationPasses(&Adapter, 3);
1451+
}
1452+
JuliaPipeline() : Pass(PT_PassManager, ID) {}
1453+
Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const {
1454+
return createPrintModulePass(O, Banner);
14491455
}
14501456
};
14511457
char JuliaPipeline::ID = 0;

src/jitlayers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ extern size_t jltls_offset_idx;
6161
typedef struct {Value *gv; int32_t index;} jl_value_llvm; // uses 1-based indexing
6262

6363
#if JL_LLVM_VERSION >= 30700
64-
void addOptimizationPasses(legacy::PassManager *PM, int opt_level);
64+
void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level);
6565
#else
6666
void addOptimizationPasses(PassManager *PM, int opt_level);
6767
#endif

0 commit comments

Comments
 (0)