@@ -55,12 +55,13 @@ impl PassManager {
55
55
56
56
pub fn populatePassManager ( pm : & mut PassManager , level : session:: OptLevel ) {
57
57
unsafe {
58
+ // We add a lot of normally-unused prototypes, so always strip them
59
+ // straight away, later passes will get rid of any that are optimized
60
+ // away
61
+ pm. addPass ( llvm:: LLVMCreateStripDeadPrototypesPass ( ) ) ;
58
62
if level == session:: No {
59
63
pm. addPass ( llvm:: LLVMCreateAlwaysInlinerPass ( ) ) ;
60
64
61
- // We add a lot of unused prototypes, so strip them no matter
62
- // what
63
- pm. addPass ( llvm:: LLVMCreateStripDeadPrototypesPass ( ) ) ;
64
65
return ;
65
66
}
66
67
@@ -81,6 +82,13 @@ pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
81
82
82
83
pm. addPass ( llvm:: LLVMCreatePruneEHPass ( ) ) ;
83
84
85
+ if level == session:: Aggressive {
86
+ // Do this before inlining, since inlining might
87
+ // make minor changes to functions that mean they
88
+ // can't be merged, despite being almost identical
89
+ pm. addPass ( llvm:: LLVMCreateMergeFunctionsPass ( ) ) ;
90
+ }
91
+
84
92
match level {
85
93
session:: Less => pm. addPass ( llvm:: LLVMCreateFunctionInliningPass ( 200 ) ) ,
86
94
session:: Default => pm. addPass ( llvm:: LLVMCreateFunctionInliningPass ( 225 ) ) ,
@@ -94,8 +102,6 @@ pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
94
102
pm. addPass ( llvm:: LLVMCreateArgumentPromotionPass ( ) ) ;
95
103
}
96
104
97
- pm. addPass ( llvm:: LLVMCreateSROAPass ( ) ) ;
98
-
99
105
pm. addPass ( llvm:: LLVMCreateEarlyCSEPass ( ) ) ;
100
106
pm. addPass ( llvm:: LLVMCreateSimplifyLibCallsPass ( ) ) ;
101
107
pm. addPass ( llvm:: LLVMCreateJumpThreadingPass ( ) ) ;
@@ -109,8 +115,6 @@ pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
109
115
pm. addPass ( llvm:: LLVMCreateLoopRotatePass ( ) ) ;
110
116
pm. addPass ( llvm:: LLVMCreateLICMPass ( ) ) ;
111
117
112
- pm. addPass ( llvm:: LLVMCreateLoopUnswitchPass ( ) ) ;
113
-
114
118
pm. addPass ( llvm:: LLVMCreateInstructionCombiningPass ( ) ) ;
115
119
pm. addPass ( llvm:: LLVMCreateIndVarSimplifyPass ( ) ) ;
116
120
pm. addPass ( llvm:: LLVMCreateLoopIdiomPass ( ) ) ;
@@ -134,16 +138,17 @@ pub fn populatePassManager(pm: &mut PassManager, level:session::OptLevel) {
134
138
135
139
pm. addPass ( llvm:: LLVMCreateBBVectorizePass ( ) ) ;
136
140
pm. addPass ( llvm:: LLVMCreateInstructionCombiningPass ( ) ) ;
141
+ pm. addPass ( llvm:: LLVMCreateEarlyCSEPass ( ) ) ;
142
+
143
+ pm. addPass ( llvm:: LLVMCreateLoopUnrollPass ( ) ) ;
144
+
145
+ pm. addPass ( llvm:: LLVMCreateAggressiveDCEPass ( ) ) ;
146
+ pm. addPass ( llvm:: LLVMCreateCFGSimplificationPass ( ) ) ;
147
+ pm. addPass ( llvm:: LLVMCreateInstructionSimplifierPass ( ) ) ;
148
+
137
149
if level != session:: Less {
138
150
pm. addPass ( llvm:: LLVMCreateGlobalDCEPass ( ) ) ;
139
151
pm. addPass ( llvm:: LLVMCreateConstantMergePass ( ) ) ;
140
152
}
141
-
142
- if level == session:: Aggressive {
143
- pm. addPass ( llvm:: LLVMCreateMergeFunctionsPass ( ) ) ;
144
- }
145
-
146
- pm. addPass ( llvm:: LLVMCreateStripDeadPrototypesPass ( ) ) ;
147
-
148
153
}
149
154
}
0 commit comments