@@ -120,8 +120,9 @@ Optimizer& Optimizer::RegisterPass(PassToken&& p) {
120120// The legalization problem is essentially a very general copy propagation
121121// problem. The optimization we use are all used to either do copy propagation
122122// or enable more copy propagation.
123- Optimizer& Optimizer::RegisterLegalizationPasses (bool preserve_interface) {
124- return
123+ Optimizer& Optimizer::RegisterLegalizationPasses (bool preserve_interface,
124+ bool include_loop_unroll) {
125+ auto & optimizer =
125126 // Wrap OpKill instructions so all other code can be inlined.
126127 RegisterPass (CreateWrapOpKillPass ())
127128 // Remove unreachable block so that merge return works.
@@ -154,34 +155,41 @@ Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface) {
154155 .RegisterPass (CreateLegalizeMultidimArrayPass ())
155156 // Propagate constants to get as many constant conditions on branches
156157 // as possible.
157- .RegisterPass (CreateCCPPass ())
158- .RegisterPass (CreateLoopUnrollPass (true ))
159- .RegisterPass (CreateDeadBranchElimPass ())
160- // Copy propagate members. Cleans up code sequences generated by
161- // scalar replacement. Also important for removing OpPhi nodes.
162- .RegisterPass (CreateSimplificationPass ())
163- .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
164- .RegisterPass (CreateCopyPropagateArraysPass ())
165- // May need loop unrolling here see
166- // https://github.com/Microsoft/DirectXShaderCompiler/pull/930
167- // Get rid of unused code that contain traces of illegal code
168- // or unused references to unbound external objects
169- .RegisterPass (CreateVectorDCEPass ())
170- .RegisterPass (CreateDeadInsertElimPass ())
171- .RegisterPass (CreateReduceLoadSizePass ())
172- .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
173- .RegisterPass (CreateRemoveUnusedInterfaceVariablesPass ())
174- .RegisterPass (CreateInterpolateFixupPass ())
175- .RegisterPass (CreateInvocationInterlockPlacementPass ())
176- .RegisterPass (CreateOpExtInstWithForwardReferenceFixupPass ());
158+ .RegisterPass (CreateCCPPass ());
159+ if (include_loop_unroll) {
160+ optimizer.RegisterPass (CreateLoopUnrollPass (true ));
161+ }
162+ return optimizer
163+ .RegisterPass (CreateDeadBranchElimPass ())
164+ // Copy propagate members. Cleans up code sequences generated by
165+ // scalar replacement. Also important for removing OpPhi nodes.
166+ .RegisterPass (CreateSimplificationPass ())
167+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
168+ .RegisterPass (CreateCopyPropagateArraysPass ())
169+ // May need loop unrolling here see
170+ // https://github.com/Microsoft/DirectXShaderCompiler/pull/930
171+ // Get rid of unused code that contain traces of illegal code
172+ // or unused references to unbound external objects
173+ .RegisterPass (CreateVectorDCEPass ())
174+ .RegisterPass (CreateDeadInsertElimPass ())
175+ .RegisterPass (CreateReduceLoadSizePass ())
176+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
177+ .RegisterPass (CreateRemoveUnusedInterfaceVariablesPass ())
178+ .RegisterPass (CreateInterpolateFixupPass ())
179+ .RegisterPass (CreateInvocationInterlockPlacementPass ())
180+ .RegisterPass (CreateOpExtInstWithForwardReferenceFixupPass ());
177181}
178182
179183Optimizer& Optimizer::RegisterLegalizationPasses () {
180- return RegisterLegalizationPasses (false );
184+ return RegisterLegalizationPasses (false , true );
185+ }
186+
187+ Optimizer& Optimizer::RegisterLegalizationPasses (bool preserve_interface) {
188+ return RegisterLegalizationPasses (preserve_interface, true );
181189}
182190
183191Optimizer& Optimizer::RegisterPerformancePasses (bool preserve_interface) {
184- return RegisterPass (CreateWrapOpKillPass ())
192+ auto & optimizer = RegisterPass (CreateWrapOpKillPass ())
185193 .RegisterPass (CreateDeadBranchElimPass ())
186194 .RegisterPass (CreateMergeReturnPass ())
187195 .RegisterPass (CreateInlineExhaustivePass ())
@@ -199,11 +207,10 @@ Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
199207 .RegisterPass (CreateLocalMultiStoreElimPass ())
200208 .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
201209 .RegisterPass (CreateCCPPass ())
202- .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
203- .RegisterPass (CreateLoopUnrollPass (true ))
204- .RegisterPass (CreateDeadBranchElimPass ())
205- .RegisterPass (CreateRedundancyEliminationPass ())
206- .RegisterPass (CreateCombineAccessChainsPass ())
210+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface));
211+ optimizer.RegisterPass (CreateDeadBranchElimPass ());
212+ optimizer.RegisterPass (CreateLocalRedundancyEliminationPass ());
213+ optimizer.RegisterPass (CreateCombineAccessChainsPass ())
207214 .RegisterPass (CreateSimplificationPass ())
208215 .RegisterPass (CreateScalarReplacementPass (0 ))
209216 .RegisterPass (CreateLocalAccessChainConvertPass ())
@@ -220,9 +227,9 @@ Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
220227 .RegisterPass (CreateCopyPropagateArraysPass ())
221228 .RegisterPass (CreateReduceLoadSizePass ())
222229 .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
223- .RegisterPass (CreateBlockMergePass ())
224- .RegisterPass (CreateRedundancyEliminationPass ())
225- .RegisterPass (CreateDeadBranchElimPass ())
230+ .RegisterPass (CreateBlockMergePass ());
231+ optimizer .RegisterPass (CreateLocalRedundancyEliminationPass ());
232+ return optimizer .RegisterPass (CreateDeadBranchElimPass ())
226233 .RegisterPass (CreateBlockMergePass ())
227234 .RegisterPass (CreateSimplificationPass ());
228235}
0 commit comments