@@ -60,90 +60,109 @@ impl PassManager {
60
60
}
61
61
}
62
62
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") ;
69
78
}
70
79
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") ;
86
81
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") ;
95
84
}
96
85
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") ;
113
87
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") ;
121
92
}
122
93
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
127
155
}
128
156
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") ;
140
159
141
160
if level != Less {
142
161
passes. push ( ~"globaldce") ;
143
162
passes. push ( ~"constmerge") ;
144
163
}
145
164
146
- return passes;
165
+ passes
147
166
}
148
167
149
168
pub fn populate_pass_manager ( sess : Session , pm : & mut PassManager , pass_list : & [ ~str ] ) {
0 commit comments