From 27408bcf6c8fe9f8156885f8a39088acb65f1620 Mon Sep 17 00:00:00 2001 From: Yichao Yu Date: Fri, 24 Jul 2020 15:50:36 -0400 Subject: [PATCH] Remove non-integral pointer from data layout before codegen (#36705) This allows LLVM codegen passes to insert `inttoptr` and `ptrtoint` as it wish, and avoids hitting any illegal ones in those passes. Fix #36062 (cherry picked from commit 235784a49b6ed8ab5677f42887e08c84fdc12c5c) --- src/Makefile | 3 ++- src/aotcompile.cpp | 2 ++ src/jitlayers.h | 1 + src/llvm-remove-ni.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/llvm-remove-ni.cpp diff --git a/src/Makefile b/src/Makefile index 1c51e01d45c92..407835643ce85 100644 --- a/src/Makefile +++ b/src/Makefile @@ -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) diff --git a/src/aotcompile.cpp b/src/aotcompile.cpp index 7ad21841ab693..03b90640ee71a 100644 --- a/src/aotcompile.cpp +++ b/src/aotcompile.cpp @@ -631,6 +631,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()); @@ -753,6 +754,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) diff --git a/src/jitlayers.h b/src/jitlayers.h index c7f2dbbe90b26..4ca69f803ee22 100644 --- a/src/jitlayers.h +++ b/src/jitlayers.h @@ -247,6 +247,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. diff --git a/src/llvm-remove-ni.cpp b/src/llvm-remove-ni.cpp new file mode 100644 index 0000000000000..2da30f25e75af --- /dev/null +++ b/src/llvm-remove-ni.cpp @@ -0,0 +1,49 @@ +// This file is a part of Julia. License is MIT: https://julialang.org/license + +#include "llvm-version.h" + +#include +#include +#include + +#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 + Y("RemoveNI", + "Remove non-integral address space.", + false, + false); +} + +Pass *createRemoveNIPass() +{ + return new RemoveNIPass(); +}