Skip to content

Commit

Permalink
Remove non-integral pointer from data layout before codegen (#36705)
Browse files Browse the repository at this point in the history
This allows LLVM codegen passes to insert `inttoptr` and `ptrtoint` as it wish,
and avoids hitting any illegal ones in those passes.

Fix #36062
  • Loading branch information
yuyichao committed Jul 24, 2020
1 parent b7af3a1 commit 235784a
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ SRCS += codegen llvm-ptls
RUNTIME_SRCS += jitlayers aotcompile debuginfo disasm llvm-simdloop llvm-muladd \
llvm-final-gc-lowering llvm-pass-helpers llvm-late-gc-lowering \
llvm-lower-handlers llvm-gc-invariant-verifier llvm-propagate-addrspaces \
llvm-multiversioning llvm-alloc-opt cgmemmgr llvm-api llvm-remove-addrspaces
llvm-multiversioning llvm-alloc-opt cgmemmgr llvm-api llvm-remove-addrspaces \
llvm-remove-ni
FLAGS += -I$(shell $(LLVM_CONFIG_HOST) --includedir)
LLVM_LIBS := all
ifeq ($(USE_POLLY),1)
Expand Down
2 changes: 2 additions & 0 deletions src/aotcompile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,7 @@ void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level,
PM->add(createFinalLowerGCPass());
PM->add(createLowerPTLSPass(dump_native));
}
PM->add(createRemoveNIPass());
PM->add(createLowerSimdLoopPass()); // Annotate loop marked with "loopinfo" as LLVM parallel loop
if (dump_native)
PM->add(createMultiVersioningPass());
Expand Down Expand Up @@ -754,6 +755,7 @@ void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level,
// Clean up write barrier and ptls lowering
PM->add(createCFGSimplificationPass());
}
PM->add(createRemoveNIPass());
PM->add(createCombineMulAddPass());
PM->add(createDivRemPairsPass());
#if defined(JL_ASAN_ENABLED)
Expand Down
1 change: 1 addition & 0 deletions src/jitlayers.h
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ Pass *createLowerExcHandlersPass();
Pass *createGCInvariantVerifierPass(bool Strong);
Pass *createPropagateJuliaAddrspaces();
Pass *createRemoveJuliaAddrspacesPass();
Pass *createRemoveNIPass();
Pass *createMultiVersioningPass();
Pass *createAllocOptPass();
// Whether the Function is an llvm or julia intrinsic.
Expand Down
49 changes: 49 additions & 0 deletions src/llvm-remove-ni.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// This file is a part of Julia. License is MIT: https://julialang.org/license

#include "llvm-version.h"

#include <llvm/IR/Module.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/Support/Debug.h>

#define DEBUG_TYPE "remove_ni"

using namespace llvm;

namespace {

struct RemoveNIPass : public ModulePass {
static char ID;
RemoveNIPass() : ModulePass(ID) {};

bool runOnModule(Module &M)
{
auto dlstr = M.getDataLayoutStr();
auto nistart = dlstr.find("-ni:");
if (nistart == std::string::npos)
return false;
auto len = dlstr.size();
auto niend = nistart + 1;
for (; niend < len; niend++) {
if (dlstr[niend] == '-') {
break;
}
}
dlstr.erase(nistart, niend - nistart);
M.setDataLayout(dlstr);
return true;
}
};

char RemoveNIPass::ID = 0;
static RegisterPass<RemoveNIPass>
Y("RemoveNI",
"Remove non-integral address space.",
false,
false);
}

Pass *createRemoveNIPass()
{
return new RemoveNIPass();
}

0 comments on commit 235784a

Please sign in to comment.