Mercurial > projects > ldc
comparison gen/optimizer.cpp @ 1506:76936858d1c6
Return `void*` from _d_allocclass so LLVM doesn't do weird things with it...
This allows `-instcombine` followed by `-gvn` to do devirtualization, so add
`-gvn` in strategic places in the default pass order.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sat, 20 Jun 2009 11:39:13 +0200 |
parents | ef76f6e1693c |
children | f86fd3b77285 |
comparison
equal
deleted
inserted
replaced
1505:1e5a14691e77 | 1506:76936858d1c6 |
---|---|
133 addPass(pm, createCFGSimplificationPass()); | 133 addPass(pm, createCFGSimplificationPass()); |
134 addPass(pm, createPruneEHPass()); | 134 addPass(pm, createPruneEHPass()); |
135 addPass(pm, createFunctionAttrsPass()); | 135 addPass(pm, createFunctionAttrsPass()); |
136 addPass(pm, createTailCallEliminationPass()); | 136 addPass(pm, createTailCallEliminationPass()); |
137 addPass(pm, createCFGSimplificationPass()); | 137 addPass(pm, createCFGSimplificationPass()); |
138 addPass(pm, createGVNPass()); | |
138 } | 139 } |
139 | 140 |
140 // -inline | 141 // -inline |
141 if (doInline()) { | 142 if (doInline()) { |
142 addPass(pm, createFunctionInliningPass()); | 143 addPass(pm, createFunctionInliningPass()); |
143 | 144 |
144 if (optimizeLevel >= 2) { | 145 if (optimizeLevel >= 2) { |
145 // Run some optimizations to clean up after inlining. | 146 // Run some optimizations to clean up after inlining. |
146 addPass(pm, createScalarReplAggregatesPass()); | 147 addPass(pm, createScalarReplAggregatesPass()); |
147 addPass(pm, createInstructionCombiningPass()); | 148 addPass(pm, createInstructionCombiningPass()); |
148 | 149 // -instcombine + gvn == devirtualization :) |
149 // Inline again, to catch things like foreach delegates | 150 addPass(pm, createGVNPass()); |
150 // passed to inlined opApply's where the function wasn't | 151 |
151 // known during the first inliner pass. | 152 // Inline again, to catch things like now nonvirtual |
153 // function calls, foreach delegates passed to inlined | |
154 // opApply's, etc. where the actual function being called | |
155 // wasn't known during the first inliner pass. | |
152 addPass(pm, createFunctionInliningPass()); | 156 addPass(pm, createFunctionInliningPass()); |
153 | 157 |
154 // Run clean-up again. | 158 // Run clean-up again. |
155 addPass(pm, createScalarReplAggregatesPass()); | 159 addPass(pm, createScalarReplAggregatesPass()); |
156 addPass(pm, createInstructionCombiningPass()); | 160 addPass(pm, createInstructionCombiningPass()); |