aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/comp/lib/llvm.rs2
-rw-r--r--src/comp/middle/trans.rs9
-rw-r--r--src/rustllvm/Passes.cpp14
-rw-r--r--src/rustllvm/RustWrapper.cpp5
-rw-r--r--src/rustllvm/rustllvm.def.in2
5 files changed, 28 insertions, 4 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index 430e8cdb..67703205 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 6c4620d2..99ac225f 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 00000000..cde4f9d3
--- /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 34346914..aa17184c 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 d314c253..6067c383 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