about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-06-28 16:49:49 -0700
committerbors <bors@rust-lang.org>2013-06-28 16:49:49 -0700
commite23934645aa7eb526e9f55da6b3d7c262dc1670f (patch)
treefc2d6911cc0ed268f5f55f12657bf0221c5c70d1 /src
parent5d2e565bb1f4566bdaab053876bacad72c57f582 (diff)
parent2bdc88b6526f806156a6342ae75a80d99ea6e378 (diff)
downloadrust-e23934645aa7eb526e9f55da6b3d7c262dc1670f.tar.gz
rust-e23934645aa7eb526e9f55da6b3d7c262dc1670f.zip
auto merge of #7466 : thestinger/rust/passes, r=cmr
Diffstat (limited to 'src')
-rw-r--r--src/librustc/back/passes.rs155
-rw-r--r--src/test/bench/noise.rs8
2 files changed, 91 insertions, 72 deletions
diff --git a/src/librustc/back/passes.rs b/src/librustc/back/passes.rs
index fa261a977f5..d2b4c87c744 100644
--- a/src/librustc/back/passes.rs
+++ b/src/librustc/back/passes.rs
@@ -60,90 +60,109 @@ impl PassManager {
     }
 }
 
-pub fn create_standard_passes(level:OptLevel) -> ~[~str] {
-    let mut passes = ~[~"strip-dead-prototypes"];
-
-    if level == No {
-        passes.push(~"always-inline");
-        return passes;
+pub fn create_standard_passes(level: OptLevel) -> ~[~str] {
+    let mut passes = ~[];
+
+    // mostly identical to clang 3.3, all differences are documented with comments
+
+    if level != No {
+        passes.push(~"targetlibinfo");
+        passes.push(~"no-aa");
+        // "tbaa" omitted, we don't emit clang-style type-based alias analysis information
+        passes.push(~"basicaa");
+        passes.push(~"globalopt");
+        passes.push(~"ipsccp");
+        passes.push(~"deadargelim");
+        passes.push(~"instcombine");
+        passes.push(~"simplifycfg");
     }
 
-    passes.push(~"targetlibinfo");
-
-    passes.push(~"scev-aa");
-    passes.push(~"basicaa");
-
-    passes.push(~"instcombine");
-    passes.push(~"simplifycfg");
-    passes.push(~"scalarrepl-ssa");
-    passes.push(~"early-cse");
-
-    passes.push(~"globalopt");
-    passes.push(~"ipsccp");
-    passes.push(~"deadargelim");
-    passes.push(~"instcombine");
-    passes.push(~"simplifycfg");
+    passes.push(~"basiccg");
 
-    passes.push(~"prune-eh");
-
-    passes.push(~"inline");
-
-    passes.push(~"functionattrs");
-
-    if level == Aggressive {
-        passes.push(~"argpromotion");
+    if level != No {
+        passes.push(~"prune-eh");
     }
 
-    passes.push(~"scalarrepl-ssa");
-    passes.push(~"early-cse");
-    passes.push(~"simplify-libcalls");
-    passes.push(~"jump-threading");
-    passes.push(~"correlated-propagation");
-    passes.push(~"simplifycfg");
-    passes.push(~"instcombine");
-
-    passes.push(~"tailcallelim");
-    passes.push(~"simplifycfg");
-    passes.push(~"reassociate");
-    passes.push(~"loop-rotate");
-    passes.push(~"licm");
-
-    passes.push(~"lcssa");
-    passes.push(~"loop-unswitch");
+    passes.push(~"inline-cost");
 
-    passes.push(~"instcombine");
-    passes.push(~"indvars");
-    passes.push(~"loop-idiom");
-    passes.push(~"loop-deletion");
-
-    if level == Aggressive {
-        passes.push(~"loop-vectorize");
+    if level == No || level == Less {
+        passes.push(~"always-inline");
+    } else {
+        passes.push(~"inline");
     }
 
-    passes.push(~"loop-unroll");
-
-    if level != Less {
-        passes.push(~"gvn");
+    if level != No {
+        passes.push(~"functionattrs");
+        if level == Aggressive {
+            passes.push(~"argpromotion");
+        }
+        passes.push(~"sroa");
+        passes.push(~"domtree");
+        passes.push(~"early-cse");
+        passes.push(~"simplify-libcalls");
+        passes.push(~"lazy-value-info");
+        passes.push(~"jump-threading");
+        passes.push(~"correlated-propagation");
+        passes.push(~"simplifycfg");
+        passes.push(~"instcombine");
+        passes.push(~"tailcallelim");
+        passes.push(~"simplifycfg");
+        passes.push(~"reassociate");
+        passes.push(~"domtree");
+        passes.push(~"loops");
+        passes.push(~"loop-simplify");
+        passes.push(~"lcssa");
+        passes.push(~"loop-rotate");
+        passes.push(~"licm");
+        passes.push(~"lcssa");
+        passes.push(~"loop-unswitch");
+        passes.push(~"instcombine");
+        passes.push(~"scalar-evolution");
+        passes.push(~"loop-simplify");
+        passes.push(~"lcssa");
+        passes.push(~"indvars");
+        passes.push(~"loop-idiom");
+        passes.push(~"loop-deletion");
+        if level == Aggressive {
+            passes.push(~"loop-simplify");
+            passes.push(~"lcssa");
+            passes.push(~"loop-vectorize");
+            passes.push(~"loop-simplify");
+            passes.push(~"lcssa");
+            passes.push(~"scalar-evolution");
+            passes.push(~"loop-simplify");
+            passes.push(~"lcssa");
+        }
+        if level != Less {
+            passes.push(~"loop-unroll");
+            passes.push(~"memdep");
+            passes.push(~"gvn");
+        }
+        passes.push(~"memdep");
+        passes.push(~"memcpyopt");
+        passes.push(~"sccp");
+        passes.push(~"instcombine");
+        passes.push(~"lazy-value-info");
+        passes.push(~"jump-threading");
+        passes.push(~"correlated-propagation");
+        passes.push(~"domtree");
+        passes.push(~"memdep");
+        passes.push(~"dse");
+        passes.push(~"adce");
+        passes.push(~"simplifycfg");
+        passes.push(~"instcombine");
+        // clang does `strip-dead-prototypes` here, since it does not emit them
     }
 
-    passes.push(~"memcpyopt");
-    passes.push(~"sccp");
-
-    passes.push(~"instcombine");
-    passes.push(~"jump-threading");
-    passes.push(~"correlated-propagation");
-    passes.push(~"dse");
-
-    passes.push(~"adce");
-    passes.push(~"simplifycfg");
-    passes.push(~"instsimplify");
+    // rustc emits dead prototypes, so always ask LLVM to strip them
+    passes.push(~"strip-dead-prototypes");
 
     if level != Less {
         passes.push(~"globaldce");
         passes.push(~"constmerge");
     }
 
-    return passes;
+    passes
 }
 
 pub fn populate_pass_manager(sess: Session, pm: &mut PassManager, pass_list:&[~str]) {
diff --git a/src/test/bench/noise.rs b/src/test/bench/noise.rs
index 25bdf7dc3fe..b65a6429f2c 100644
--- a/src/test/bench/noise.rs
+++ b/src/test/bench/noise.rs
@@ -118,10 +118,10 @@ fn main() {
         };
     };
 
-    /*for int::range(0, 256) |y| {
+    for int::range(0, 256) |y| {
         for int::range(0, 256) |x| {
-            io::print(symbols[pixels[y*256+x] / 0.2f32 as int]);
+            print(symbols[pixels[y*256+x] / 0.2f32 as int]);
         }
-        io::println("");
-    }*/
+        println("");
+    }
 }