about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJames Miller <james@aatch.net>2013-05-29 13:12:36 +1200
committerJames Miller <james@aatch.net>2013-05-29 14:16:49 +1200
commit998e2ce4ff7ae7ab1227a30ed3e20e503da53b27 (patch)
tree8886f78ade931e7dd69f989e5a74333424498ad7
parent4988c89e86d7120d5c9b0d5ccabba4e8763e1fe7 (diff)
downloadrust-998e2ce4ff7ae7ab1227a30ed3e20e503da53b27.tar.gz
rust-998e2ce4ff7ae7ab1227a30ed3e20e503da53b27.zip
Remove passes that were causing bad optmizations
-rw-r--r--src/librustc/back/passes.rs33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/librustc/back/passes.rs b/src/librustc/back/passes.rs
index 9b140ac5907..ba4170fde56 100644
--- a/src/librustc/back/passes.rs
+++ b/src/librustc/back/passes.rs
@@ -55,12 +55,13 @@ impl PassManager {
 
 pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
     unsafe {
+        // We add a lot of normally-unused prototypes, so always strip them
+        // straight away, later passes will get rid of any that are optimized
+        // away
+        pm.addPass(llvm::LLVMCreateStripDeadPrototypesPass());
         if level == session::No {
             pm.addPass(llvm::LLVMCreateAlwaysInlinerPass());
 
-            // We add a lot of unused prototypes, so strip them no matter
-            // what
-            pm.addPass(llvm::LLVMCreateStripDeadPrototypesPass());
             return;
         }
 
@@ -81,6 +82,13 @@ pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
 
         pm.addPass(llvm::LLVMCreatePruneEHPass());
 
+        if level == session::Aggressive {
+            // Do this before inlining, since inlining might
+            // make minor changes to functions that mean they
+            // can't be merged, despite being almost identical
+            pm.addPass(llvm::LLVMCreateMergeFunctionsPass());
+        }
+
         match level {
             session::Less       => pm.addPass(llvm::LLVMCreateFunctionInliningPass(200)),
             session::Default    => pm.addPass(llvm::LLVMCreateFunctionInliningPass(225)),
@@ -94,8 +102,6 @@ pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
             pm.addPass(llvm::LLVMCreateArgumentPromotionPass());
         }
 
-        pm.addPass(llvm::LLVMCreateSROAPass());
-
         pm.addPass(llvm::LLVMCreateEarlyCSEPass());
         pm.addPass(llvm::LLVMCreateSimplifyLibCallsPass());
         pm.addPass(llvm::LLVMCreateJumpThreadingPass());
@@ -109,8 +115,6 @@ pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
         pm.addPass(llvm::LLVMCreateLoopRotatePass());
         pm.addPass(llvm::LLVMCreateLICMPass());
 
-        pm.addPass(llvm::LLVMCreateLoopUnswitchPass());
-
         pm.addPass(llvm::LLVMCreateInstructionCombiningPass());
         pm.addPass(llvm::LLVMCreateIndVarSimplifyPass());
         pm.addPass(llvm::LLVMCreateLoopIdiomPass());
@@ -134,16 +138,17 @@ pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
 
         pm.addPass(llvm::LLVMCreateBBVectorizePass());
         pm.addPass(llvm::LLVMCreateInstructionCombiningPass());
+        pm.addPass(llvm::LLVMCreateEarlyCSEPass());
+
+        pm.addPass(llvm::LLVMCreateLoopUnrollPass());
+
+        pm.addPass(llvm::LLVMCreateAggressiveDCEPass());
+        pm.addPass(llvm::LLVMCreateCFGSimplificationPass());
+        pm.addPass(llvm::LLVMCreateInstructionSimplifierPass());
+
         if level != session::Less {
             pm.addPass(llvm::LLVMCreateGlobalDCEPass());
             pm.addPass(llvm::LLVMCreateConstantMergePass());
         }
-
-        if level == session::Aggressive {
-            pm.addPass(llvm::LLVMCreateMergeFunctionsPass());
-        }
-
-        pm.addPass(llvm::LLVMCreateStripDeadPrototypesPass());
-
     }
 }