Skip to content

Commit 2bdc88b

Browse files
committed
copy the optimization passes from clang
1 parent 4e4e2f7 commit 2bdc88b

File tree

2 files changed

+91
-72
lines changed

2 files changed

+91
-72
lines changed

src/librustc/back/passes.rs

Lines changed: 87 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -60,90 +60,109 @@ impl PassManager {
6060
}
6161
}
6262

63-
pub fn create_standard_passes(level:OptLevel) -> ~[~str] {
64-
let mut passes = ~[~"strip-dead-prototypes"];
65-
66-
if level == No {
67-
passes.push(~"always-inline");
68-
return passes;
63+
pub fn create_standard_passes(level: OptLevel) -> ~[~str] {
64+
let mut passes = ~[];
65+
66+
// mostly identical to clang 3.3, all differences are documented with comments
67+
68+
if level != No {
69+
passes.push(~"targetlibinfo");
70+
passes.push(~"no-aa");
71+
// "tbaa" omitted, we don't emit clang-style type-based alias analysis information
72+
passes.push(~"basicaa");
73+
passes.push(~"globalopt");
74+
passes.push(~"ipsccp");
75+
passes.push(~"deadargelim");
76+
passes.push(~"instcombine");
77+
passes.push(~"simplifycfg");
6978
}
7079

71-
passes.push(~"targetlibinfo");
72-
73-
passes.push(~"scev-aa");
74-
passes.push(~"basicaa");
75-
76-
passes.push(~"instcombine");
77-
passes.push(~"simplifycfg");
78-
passes.push(~"scalarrepl-ssa");
79-
passes.push(~"early-cse");
80-
81-
passes.push(~"globalopt");
82-
passes.push(~"ipsccp");
83-
passes.push(~"deadargelim");
84-
passes.push(~"instcombine");
85-
passes.push(~"simplifycfg");
80+
passes.push(~"basiccg");
8681

87-
passes.push(~"prune-eh");
88-
89-
passes.push(~"inline");
90-
91-
passes.push(~"functionattrs");
92-
93-
if level == Aggressive {
94-
passes.push(~"argpromotion");
82+
if level != No {
83+
passes.push(~"prune-eh");
9584
}
9685

97-
passes.push(~"scalarrepl-ssa");
98-
passes.push(~"early-cse");
99-
passes.push(~"simplify-libcalls");
100-
passes.push(~"jump-threading");
101-
passes.push(~"correlated-propagation");
102-
passes.push(~"simplifycfg");
103-
passes.push(~"instcombine");
104-
105-
passes.push(~"tailcallelim");
106-
passes.push(~"simplifycfg");
107-
passes.push(~"reassociate");
108-
passes.push(~"loop-rotate");
109-
passes.push(~"licm");
110-
111-
passes.push(~"lcssa");
112-
passes.push(~"loop-unswitch");
86+
passes.push(~"inline-cost");
11387

114-
passes.push(~"instcombine");
115-
passes.push(~"indvars");
116-
passes.push(~"loop-idiom");
117-
passes.push(~"loop-deletion");
118-
119-
if level == Aggressive {
120-
passes.push(~"loop-vectorize");
88+
if level == No || level == Less {
89+
passes.push(~"always-inline");
90+
} else {
91+
passes.push(~"inline");
12192
}
12293

123-
passes.push(~"loop-unroll");
124-
125-
if level != Less {
126-
passes.push(~"gvn");
94+
if level != No {
95+
passes.push(~"functionattrs");
96+
if level == Aggressive {
97+
passes.push(~"argpromotion");
98+
}
99+
passes.push(~"sroa");
100+
passes.push(~"domtree");
101+
passes.push(~"early-cse");
102+
passes.push(~"simplify-libcalls");
103+
passes.push(~"lazy-value-info");
104+
passes.push(~"jump-threading");
105+
passes.push(~"correlated-propagation");
106+
passes.push(~"simplifycfg");
107+
passes.push(~"instcombine");
108+
passes.push(~"tailcallelim");
109+
passes.push(~"simplifycfg");
110+
passes.push(~"reassociate");
111+
passes.push(~"domtree");
112+
passes.push(~"loops");
113+
passes.push(~"loop-simplify");
114+
passes.push(~"lcssa");
115+
passes.push(~"loop-rotate");
116+
passes.push(~"licm");
117+
passes.push(~"lcssa");
118+
passes.push(~"loop-unswitch");
119+
passes.push(~"instcombine");
120+
passes.push(~"scalar-evolution");
121+
passes.push(~"loop-simplify");
122+
passes.push(~"lcssa");
123+
passes.push(~"indvars");
124+
passes.push(~"loop-idiom");
125+
passes.push(~"loop-deletion");
126+
if level == Aggressive {
127+
passes.push(~"loop-simplify");
128+
passes.push(~"lcssa");
129+
passes.push(~"loop-vectorize");
130+
passes.push(~"loop-simplify");
131+
passes.push(~"lcssa");
132+
passes.push(~"scalar-evolution");
133+
passes.push(~"loop-simplify");
134+
passes.push(~"lcssa");
135+
}
136+
if level != Less {
137+
passes.push(~"loop-unroll");
138+
passes.push(~"memdep");
139+
passes.push(~"gvn");
140+
}
141+
passes.push(~"memdep");
142+
passes.push(~"memcpyopt");
143+
passes.push(~"sccp");
144+
passes.push(~"instcombine");
145+
passes.push(~"lazy-value-info");
146+
passes.push(~"jump-threading");
147+
passes.push(~"correlated-propagation");
148+
passes.push(~"domtree");
149+
passes.push(~"memdep");
150+
passes.push(~"dse");
151+
passes.push(~"adce");
152+
passes.push(~"simplifycfg");
153+
passes.push(~"instcombine");
154+
// clang does `strip-dead-prototypes` here, since it does not emit them
127155
}
128156

129-
passes.push(~"memcpyopt");
130-
passes.push(~"sccp");
131-
132-
passes.push(~"instcombine");
133-
passes.push(~"jump-threading");
134-
passes.push(~"correlated-propagation");
135-
passes.push(~"dse");
136-
137-
passes.push(~"adce");
138-
passes.push(~"simplifycfg");
139-
passes.push(~"instsimplify");
157+
// rustc emits dead prototypes, so always ask LLVM to strip them
158+
passes.push(~"strip-dead-prototypes");
140159

141160
if level != Less {
142161
passes.push(~"globaldce");
143162
passes.push(~"constmerge");
144163
}
145164

146-
return passes;
165+
passes
147166
}
148167

149168
pub fn populate_pass_manager(sess: Session, pm: &mut PassManager, pass_list:&[~str]) {

src/test/bench/noise.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,10 @@ fn main() {
118118
};
119119
};
120120

121-
/*for int::range(0, 256) |y| {
121+
for int::range(0, 256) |y| {
122122
for int::range(0, 256) |x| {
123-
io::print(symbols[pixels[y*256+x] / 0.2f32 as int]);
123+
print(symbols[pixels[y*256+x] / 0.2f32 as int]);
124124
}
125-
io::println("");
126-
}*/
125+
println("");
126+
}
127127
}

0 commit comments

Comments
 (0)