@@ -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
149168pub fn populate_pass_manager ( sess : Session , pm : & mut PassManager , pass_list : & [ ~str ] ) {
0 commit comments