Skip to content

Commit

Permalink
Remove the MDNode arguments to Julia's LLVM passes.
Browse files Browse the repository at this point in the history
We reconstruct the TBAA MDNodes in the pass' runOnModule functions.
This should be fine, as the node's first field uniquely identifies it.
  • Loading branch information
maleadt committed Oct 20, 2016
1 parent be38529 commit 2cc6ae2
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 46 deletions.
11 changes: 3 additions & 8 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ static Type *T_pppint8;
static Type *T_void;

// type-based alias analysis nodes. Indentation of comments indicates hierarchy.
MDNode *tbaa_gcframe; // GC frame
static MDNode *tbaa_gcframe; // GC frame
// LLVM should have enough info for alias analysis of non-gcframe stack slot
// this is mainly a place holder for `jl_cgval_t::tbaa`
static MDNode *tbaa_stack; // stack slot
Expand All @@ -270,7 +270,7 @@ static MDNode *tbaa_arrayptr; // The pointer inside a jl_array_t
static MDNode *tbaa_arraysize; // A size in a jl_array_t
static MDNode *tbaa_arraylen; // The len in a jl_array_t
static MDNode *tbaa_arrayflags; // The flags in a jl_array_t
MDNode *tbaa_const; // Memory that is immutable by the time LLVM can see it
static MDNode *tbaa_const; // Memory that is immutable by the time LLVM can see it

// Basic DITypes
#if JL_LLVM_VERSION >= 30700
Expand Down Expand Up @@ -5085,7 +5085,7 @@ static std::unique_ptr<Module> emit_function(jl_method_instance_t *lam, jl_code_

// --- initialization ---

static MDNode *tbaa_make_child( const char *name, MDNode *parent, bool isConstant=false )
MDNode *tbaa_make_child(const char *name, MDNode *parent, bool isConstant=false)
{
MDNode *n = mbuilder->createTBAANode(name,parent,isConstant);
#if JL_LLVM_VERSION < 30600
Expand Down Expand Up @@ -6229,8 +6229,3 @@ extern "C" void jl_dump_llvm_type(void *v)
{
((Type*)v)->dump(); putchar('\n');
}

extern "C" JL_DLLEXPORT
LLVMValueRef jl_get_tbaa_gcframe() {
return wrap(MetadataAsValue::get(jl_LLVMContext, tbaa_gcframe));
}
10 changes: 5 additions & 5 deletions src/jitlayers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ void addOptimizationPasses(legacy::PassManager *PM)
void addOptimizationPasses(PassManager *PM)
#endif
{
PM->add(createLowerGCFramePass(tbaa_gcframe));
PM->add(createLowerGCFramePass());
#ifdef JL_DEBUG_BUILD
PM->add(createVerifierPass());
#endif
Expand All @@ -122,7 +122,7 @@ void addOptimizationPasses(PassManager *PM)
PM->add(llvm::createMemorySanitizerPass(true));
#endif
if (jl_options.opt_level == 0) {
PM->add(createLowerPTLSPass(imaging_mode, tbaa_const));
PM->add(createLowerPTLSPass(imaging_mode));
return;
}
#if JL_LLVM_VERSION >= 30700
Expand Down Expand Up @@ -156,7 +156,7 @@ void addOptimizationPasses(PassManager *PM)
#endif
// Let the InstCombine pass remove the unnecessary load of
// safepoint address first
PM->add(createLowerPTLSPass(imaging_mode, tbaa_const));
PM->add(createLowerPTLSPass(imaging_mode));
PM->add(createSROAPass()); // Break up aggregate allocas
#ifndef INSTCOMBINE_BUG
PM->add(createInstructionCombiningPass()); // Cleanup for scalarrepl.
Expand Down Expand Up @@ -455,8 +455,8 @@ JuliaOJIT::JuliaOJIT(TargetMachine &TM)
addOptimizationPasses(&PM);
}
else {
PM.add(createLowerGCFramePass(tbaa_gcframe));
PM.add(createLowerPTLSPass(imaging_mode, tbaa_const));
PM.add(createLowerGCFramePass());
PM.add(createLowerPTLSPass(imaging_mode));
}
if (TM.addPassesToEmitMC(PM, Ctx, ObjStream))
llvm_unreachable("Target does not support MC emission.");
Expand Down
7 changes: 2 additions & 5 deletions src/jitlayers.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,11 +232,8 @@ JL_DLLEXPORT extern LLVMContext jl_LLVMContext;
JL_DLLEXPORT extern LLVMContext &jl_LLVMContext;
#endif

extern MDNode *tbaa_const;
extern MDNode *tbaa_gcframe;

Pass *createLowerPTLSPass(bool imaging_mode, MDNode *tbaa_const);
Pass *createLowerGCFramePass(MDNode *tbaa_gcframe);
Pass *createLowerPTLSPass(bool imaging_mode);
Pass *createLowerGCFramePass();
// Whether the Function is an llvm or julia intrinsic.
static inline bool isIntrinsicFunction(Function *F)
{
Expand Down
29 changes: 15 additions & 14 deletions src/llvm-gcroot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <llvm/IR/DIBuilder.h>
#include <llvm/IR/DebugInfoMetadata.h>
#endif
#include <llvm/IR/MDBuilder.h>

#include <vector>
#include <queue>
Expand All @@ -35,6 +36,8 @@

using namespace llvm;

extern MDNode *tbaa_make_child(const char *name, MDNode *parent, bool isConstant=false);

namespace {

#ifndef NDEBUG
Expand Down Expand Up @@ -1131,15 +1134,12 @@ void JuliaGCAllocator::allocate_frame()

struct LowerGCFrame: public ModulePass {
static char ID;
LowerGCFrame(MDNode *_tbaa_gcframe=nullptr)
: ModulePass(ID),
tbaa_gcframe(_tbaa_gcframe)
LowerGCFrame() : ModulePass(ID)
{}

private:
MDNode *tbaa_gcframe; // One `LLVMContext` only
void runOnFunction(Module *M, Function &F, Function *ptls_getter,
Type *T_pjlvalue);
Type *T_pjlvalue, MDNode *tbaa_gcframe);
bool runOnModule(Module &M) override;
};

Expand Down Expand Up @@ -1176,6 +1176,10 @@ static void ensure_enter_function(Module &M)

bool LowerGCFrame::runOnModule(Module &M)
{
MDBuilder mbuilder(M.getContext());
MDNode *tbaa_root = mbuilder.createTBAARoot("jtbaa");
MDNode *tbaa_gcframe = tbaa_make_child("jtbaa_gcframe", tbaa_root);

Function *ptls_getter = M.getFunction("jl_get_ptls_states");
ensure_enter_function(M);
FunctionType *functype = nullptr;
Expand All @@ -1189,7 +1193,7 @@ bool LowerGCFrame::runOnModule(Module &M)
for (auto F = M.begin(), E = M.end(); F != E; ++F) {
if (F->isDeclaration())
continue;
runOnFunction(&M, *F, ptls_getter, T_pjlvalue);
runOnFunction(&M, *F, ptls_getter, T_pjlvalue, tbaa_gcframe);
}

// Cleanup for GC frame lowering.
Expand All @@ -1202,7 +1206,7 @@ bool LowerGCFrame::runOnModule(Module &M)
}

void LowerGCFrame::runOnFunction(Module *M, Function &F, Function *ptls_getter,
Type *T_pjlvalue)
Type *T_pjlvalue, MDNode *tbaa_gcframe)
{
CallInst *ptlsStates = nullptr;
for (auto I = F.getEntryBlock().begin(), E = F.getEntryBlock().end();
Expand Down Expand Up @@ -1241,15 +1245,12 @@ void jl_dump_bb_uses(std::map<BasicBlock*, std::map<frame_register, liveness::id
}
#endif

Pass *createLowerGCFramePass(MDNode *tbaa_gcframe)
Pass *createLowerGCFramePass()
{
assert(tbaa_gcframe);
return new LowerGCFrame(tbaa_gcframe);
return new LowerGCFrame();
}

extern "C" JL_DLLEXPORT
void LLVMAddLowerGCFramePass(LLVMPassManagerRef PM, LLVMValueRef V) {
auto *MD = cast<MetadataAsValue>(unwrap(V));
auto *tbaa_gcframe = cast<MDNode>(MD->getMetadata());
unwrap(PM)->add(createLowerGCFramePass(tbaa_gcframe));
void LLVMAddLowerGCFramePass(LLVMPassManagerRef PM) {
unwrap(PM)->add(createLowerGCFramePass());
}
30 changes: 16 additions & 14 deletions src/llvm-ptls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <llvm/IR/Constants.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/MDBuilder.h>

#include "julia.h"
#include "julia_internal.h"
Expand All @@ -26,22 +27,22 @@

using namespace llvm;

extern MDNode *tbaa_make_child(const char *name, MDNode *parent, bool isConstant=false);

namespace {

struct LowerPTLS: public ModulePass {
static char ID;
LowerPTLS(bool _imaging_mode=false, MDNode *_tbaa_const=nullptr)
LowerPTLS(bool _imaging_mode=false)
: ModulePass(ID),
imaging_mode(_imaging_mode),
tbaa_const(_tbaa_const)
imaging_mode(_imaging_mode)
{}

private:
bool imaging_mode;
MDNode *tbaa_const; // One `LLVMContext` only
bool runOnModule(Module &M) override;
void runOnFunction(LLVMContext &ctx, Module &M, Function *F,
Function *ptls_getter, Type *T_ppjlvalue);
Function *ptls_getter, Type *T_ppjlvalue, MDNode *tbaa_const);
};

static void ensure_global(const char *name, Type *t, Module &M,
Expand Down Expand Up @@ -69,7 +70,7 @@ static void ensure_global(const char *name, Type *t, Module &M,
}

void LowerPTLS::runOnFunction(LLVMContext &ctx, Module &M, Function *F,
Function *ptls_getter, Type *T_ppjlvalue)
Function *ptls_getter, Type *T_ppjlvalue, MDNode *tbaa_const)
{
CallInst *ptlsStates = NULL;
for (auto I = F->getEntryBlock().begin(), E = F->getEntryBlock().end();
Expand Down Expand Up @@ -167,6 +168,10 @@ void LowerPTLS::runOnFunction(LLVMContext &ctx, Module &M, Function *F,

bool LowerPTLS::runOnModule(Module &M)
{
MDBuilder mbuilder(M.getContext());
MDNode *tbaa_root = mbuilder.createTBAARoot("jtbaa");
MDNode *tbaa_const = tbaa_make_child("jtbaa_const", tbaa_root, true);

Function *ptls_getter = M.getFunction("jl_get_ptls_states");
if (!ptls_getter)
return true;
Expand All @@ -183,7 +188,7 @@ bool LowerPTLS::runOnModule(Module &M)
for (auto F = M.begin(), E = M.end(); F != E; ++F) {
if (F->isDeclaration())
continue;
runOnFunction(ctx, M, &*F, ptls_getter, T_ppjlvalue);
runOnFunction(ctx, M, &*F, ptls_getter, T_ppjlvalue, tbaa_const);
}
#ifndef JULIA_ENABLE_THREADING
ptls_getter->eraseFromParent();
Expand All @@ -199,15 +204,12 @@ static RegisterPass<LowerPTLS> X("LowerPTLS", "LowerPTLS Pass",

} // anonymous namespace

Pass *createLowerPTLSPass(bool imaging_mode, MDNode *tbaa_const)
Pass *createLowerPTLSPass(bool imaging_mode)
{
assert(tbaa_const);
return new LowerPTLS(imaging_mode, tbaa_const);
return new LowerPTLS(imaging_mode);
}

extern "C" JL_DLLEXPORT
void LLVMAddLowerPTLSPass(LLVMPassManagerRef PM, LLVMValueRef V, int imaging_mode) {
auto *MD = cast<MetadataAsValue>(unwrap(V));
auto *tbaa_gcframe = cast<MDNode>(MD->getMetadata());
unwrap(PM)->add(createLowerPTLSPass(imaging_mode != 0, tbaa_gcframe));
void LLVMAddLowerPTLSPass(LLVMPassManagerRef PM, int imaging_mode) {
unwrap(PM)->add(createLowerPTLSPass(imaging_mode != 0));
}

0 comments on commit 2cc6ae2

Please sign in to comment.