diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs index 430e8cdb3b8..6770320598a 100644 --- a/src/comp/lib/llvm.rs +++ b/src/comp/lib/llvm.rs @@ -775,6 +775,8 @@ native mod llvm = llvm_lib { fn LLVMAddSimplifyLibCallsPass(PassManagerRef PM); fn LLVMAddLoopIdiomPass(PassManagerRef PM); fn LLVMAddEarlyCSEPass(PassManagerRef PM); + fn LLVMAddTypeBasedAliasAnalysisPass(PassManagerRef PM); + fn LLVMAddBasicAliasAnalysisPass(PassManagerRef PM); /** Destroys a memory buffer. */ fn LLVMDisposeMemoryBuffer(MemoryBufferRef MemBuf); diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 6c4620d2476..99ac225f8ee 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -6647,6 +6647,8 @@ fn run_passes(ModuleRef llmod, bool opt) { auto fpm = mk_pass_manager(); // createStandardFunctionPasses + llvm.LLVMAddTypeBasedAliasAnalysisPass(fpm.llpm); + llvm.LLVMAddBasicAliasAnalysisPass(fpm.llpm); llvm.LLVMAddCFGSimplificationPass(fpm.llpm); llvm.LLVMAddScalarReplAggregatesPass(fpm.llpm); llvm.LLVMAddEarlyCSEPass(fpm.llpm); @@ -6654,6 +6656,8 @@ fn run_passes(ModuleRef llmod, bool opt) { llvm.LLVMRunPassManager(fpm.llpm, llmod); // createStandardModulePasses + llvm.LLVMAddTypeBasedAliasAnalysisPass(pm.llpm); + llvm.LLVMAddBasicAliasAnalysisPass(pm.llpm); llvm.LLVMAddGlobalOptimizerPass(pm.llpm); llvm.LLVMAddIPSCCPPass(pm.llpm); llvm.LLVMAddDeadArgEliminationPass(pm.llpm); @@ -6661,10 +6665,7 @@ fn run_passes(ModuleRef llmod, bool opt) { llvm.LLVMAddCFGSimplificationPass(pm.llpm); llvm.LLVMAddPruneEHPass(pm.llpm); llvm.LLVMAddFunctionInliningPass(pm.llpm); - - // FIXME: crashes! - // llvm.LLVMAddFunctionAttrsPass(pm.llpm); - + llvm.LLVMAddFunctionAttrsPass(pm.llpm); llvm.LLVMAddScalarReplAggregatesPassSSA(pm.llpm); llvm.LLVMAddEarlyCSEPass(pm.llpm); llvm.LLVMAddSimplifyLibCallsPass(pm.llpm); diff --git a/src/rustllvm/Passes.cpp b/src/rustllvm/Passes.cpp new file mode 100644 index 00000000000..cde4f9d34c1 --- /dev/null +++ b/src/rustllvm/Passes.cpp @@ -0,0 +1,14 @@ +#include "llvm/Analysis/Passes.h" +#include "llvm/PassManager.h" +#include "llvm-c/Core.h" + +using namespace llvm; +extern "C" { + void LLVMAddTypeBasedAliasAnalysisPass(LLVMPassManagerRef PM) { + unwrap(PM)->add(createTypeBasedAliasAnalysisPass()); + } + + void LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM) { + unwrap(PM)->add(createBasicAliasAnalysisPass()); + } +} diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 34346914940..aa17184ceb9 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -31,3 +31,8 @@ extern "C" const char *LLVMRustGetLastError(void) { LLVMOpaqueObjectFile* (*RustHackToFetchObjectO)(LLVMOpaqueMemoryBuffer*) = LLVMCreateObjectFile; + +extern "C" void LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM); + +void (*RustHackToFetchPassesO)(LLVMPassManagerRef PM) = + LLVMAddBasicAliasAnalysisPass; diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in index d314c253e88..6067c3838fb 100644 --- a/src/rustllvm/rustllvm.def.in +++ b/src/rustllvm/rustllvm.def.in @@ -15,6 +15,7 @@ LLVMAddAggressiveDCEPass LLVMAddAlias LLVMAddArgumentPromotionPass LLVMAddAttribute +LLVMaddBasicAliasAnalysisPass LLVMAddCFGSimplificationPass LLVMAddCase LLVMAddConstantMergePass @@ -67,6 +68,7 @@ LLVMAddStripDeadPrototypesPass LLVMAddStripSymbolsPass LLVMAddTailCallEliminationPass LLVMAddTargetData +LLVMAddTypeBasedAliasAnalysisPass LLVMAddTypeName LLVMAddVerifierPass LLVMAlignOf