@@ -122,7 +122,7 @@ Optimizer& Optimizer::RegisterPass(PassToken&& p) {
122122// or enable more copy propagation.
123123Optimizer& Optimizer::RegisterLegalizationPasses (bool preserve_interface,
124124 bool include_loop_unroll,
125- bool include_ssa_rewrite ) {
125+ SSARewriteMode ssa_rewrite_mode ) {
126126 auto & optimizer =
127127 // Wrap OpKill instructions so all other code can be inlined.
128128 RegisterPass (CreateWrapOpKillPass ())
@@ -132,45 +132,39 @@ Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface,
132132 .RegisterPass (CreateMergeReturnPass ())
133133 // Make sure uses and definitions are in the same function.
134134 .RegisterPass (CreateInlineExhaustivePass ())
135- // Make private variable function scope
136- .RegisterPass (CreateEliminateDeadFunctionsPass ())
137- . RegisterPass ( CreatePrivateToLocalPass ())
138- // Fix up the storage classes that DXC may have purposely generated
139- // incorrectly. All functions are inlined, and a lot of dead code has
140- // been removed.
141- . RegisterPass ( CreateFixStorageClassPass ())
142- // Propagate the value stored to the loads in very simple cases.
143- .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
144- .RegisterPass (CreateLocalSingleStoreElimPass ())
145- . RegisterPass ( CreateAggressiveDCEPass (preserve_interface))
146- // Split up aggregates so they are easier to deal with.
147- .RegisterPass (CreateScalarReplacementPass (0 ))
148- // Remove loads and stores so everything is in intermediate values.
149- // Takes care of copy propagation of non-members.
150- .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
151- .RegisterPass (CreateLocalSingleStoreElimPass ())
152- .RegisterPass (CreateAggressiveDCEPass (preserve_interface));
153- if (include_ssa_rewrite ) {
154- optimizer.RegisterPass (CreateLocalMultiStoreElimPass ( ));
135+ . RegisterPass ( CreateEliminateDeadFunctionsPass ());
136+ optimizer .RegisterPass (CreatePrivateToLocalPass ());
137+ // Fix up the storage classes that DXC may have purposely generated
138+ // incorrectly. All functions are inlined, and a lot of dead code has
139+ // been removed.
140+ optimizer. RegisterPass ( CreateFixStorageClassPass ());
141+ // Propagate the value stored to the loads in very simple cases.
142+ optimizer. RegisterPass ( CreateLocalSingleBlockLoadStoreElimPass ())
143+ .RegisterPass (CreateLocalSingleStoreElimPass ())
144+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface));
145+ optimizer
146+ // Split up aggregates so they are easier to deal with.
147+ .RegisterPass (CreateScalarReplacementPass (0 ));
148+ // Remove loads and stores so everything is in intermediate values.
149+ // Takes care of copy propagation of non-members.
150+ optimizer .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
151+ .RegisterPass (CreateLocalSingleStoreElimPass ())
152+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface));
153+ if (ssa_rewrite_mode != SSARewriteMode::None ) {
154+ optimizer.RegisterPass (CreateSSARewritePass (ssa_rewrite_mode ));
155155 }
156- optimizer.RegisterPass (CreateCombineAccessChainsPass ());
157- if (include_ssa_rewrite) {
158- optimizer.RegisterPass (CreateAggressiveDCEPass (preserve_interface));
159- }
160- optimizer.RegisterPass (CreateLegalizeMultidimArrayPass ())
161- // Propagate constants to get as many constant conditions on branches
162- // as possible.
163- .RegisterPass (CreateCCPPass ());
156+ optimizer
157+ // Propagate constants to get as many constant conditions on branches
158+ // as possible.
159+ .RegisterPass (CreateCCPPass ());
164160 if (include_loop_unroll) {
165161 optimizer.RegisterPass (CreateLoopUnrollPass (true ));
166162 }
163+ optimizer.RegisterPass (CreateDeadBranchElimPass ())
164+ // Copy propagate members. Cleans up code sequences generated by scalar
165+ // replacement. Also important for removing OpPhi nodes.
166+ .RegisterPass (CreateSimplificationPass ());
167167 return optimizer
168- .RegisterPass (CreateDeadBranchElimPass ())
169- // Copy propagate members. Cleans up code sequences generated by
170- // scalar replacement. Also important for removing OpPhi nodes.
171- .RegisterPass (CreateSimplificationPass ())
172- .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
173- .RegisterPass (CreateCopyPropagateArraysPass ())
174168 // May need loop unrolling here see
175169 // https://github.com/Microsoft/DirectXShaderCompiler/pull/930
176170 // Get rid of unused code that contain traces of illegal code
@@ -186,11 +180,12 @@ Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface,
186180}
187181
188182Optimizer& Optimizer::RegisterLegalizationPasses () {
189- return RegisterLegalizationPasses (false , true , true );
183+ return RegisterLegalizationPasses (false , true , SSARewriteMode::All );
190184}
191185
192186Optimizer& Optimizer::RegisterLegalizationPasses (bool preserve_interface) {
193- return RegisterLegalizationPasses (preserve_interface, true , true );
187+ return RegisterLegalizationPasses (preserve_interface, true ,
188+ SSARewriteMode::All);
194189}
195190
196191Optimizer& Optimizer::RegisterPerformancePasses (bool preserve_interface) {
@@ -199,20 +194,21 @@ Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
199194 .RegisterPass (CreateMergeReturnPass ())
200195 .RegisterPass (CreateInlineExhaustivePass ())
201196 .RegisterPass (CreateEliminateDeadFunctionsPass ())
202- .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
203197 .RegisterPass (CreatePrivateToLocalPass ())
204198 .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
205199 .RegisterPass (CreateLocalSingleStoreElimPass ())
206200 .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
207201 .RegisterPass (CreateScalarReplacementPass (0 ))
208- .RegisterPass (CreateLocalAccessChainConvertPass ())
209- .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
202+ .RegisterPass (CreateLocalAccessChainConvertPass ());
203+ optimizer .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
210204 .RegisterPass (CreateLocalSingleStoreElimPass ())
211- .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
212- .RegisterPass (CreateLocalMultiStoreElimPass ())
213- .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
214- .RegisterPass (CreateCCPPass ())
215205 .RegisterPass (CreateAggressiveDCEPass (preserve_interface));
206+ optimizer.RegisterPass (CreateCCPPass ())
207+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface));
208+ // Preserve LoopControl::Unroll in the IR instead of always materializing
209+ // it here. The optimizer-side full unroll is very costly on large modules
210+ // with many tiny [unroll]-annotated loops, while the hint remains available
211+ // to downstream consumers in the final SPIR-V.
216212 optimizer.RegisterPass (CreateDeadBranchElimPass ());
217213 optimizer.RegisterPass (CreateLocalRedundancyEliminationPass ());
218214 optimizer.RegisterPass (CreateCombineAccessChainsPass ())
@@ -222,7 +218,7 @@ Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
222218 .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
223219 .RegisterPass (CreateLocalSingleStoreElimPass ())
224220 .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
225- .RegisterPass (CreateSSARewritePass ())
221+ .RegisterPass (CreateSSARewritePass (SSARewriteMode::SpecialTypes ))
226222 .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
227223 .RegisterPass (CreateVectorDCEPass ())
228224 .RegisterPass (CreateDeadInsertElimPass ())
@@ -413,8 +409,6 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag,
413409 RegisterPass (CreateFoldSpecConstantOpAndCompositePass ());
414410 } else if (pass_name == " loop-unswitch" ) {
415411 RegisterPass (CreateLoopUnswitchPass ());
416- } else if (pass_name == " legalize-multidim-array" ) {
417- RegisterPass (CreateLegalizeMultidimArrayPass ());
418412 } else if (pass_name == " scalar-replacement" ) {
419413 if (pass_args.size () == 0 ) {
420414 RegisterPass (CreateScalarReplacementPass (0 ));
@@ -977,11 +971,6 @@ Optimizer::PassToken CreateLoopUnswitchPass() {
977971 MakeUnique<opt::LoopUnswitchPass>());
978972}
979973
980- Optimizer::PassToken CreateLegalizeMultidimArrayPass () {
981- return MakeUnique<Optimizer::PassToken::Impl>(
982- MakeUnique<opt::LegalizeMultidimArrayPass>());
983- }
984-
985974Optimizer::PassToken CreateRedundancyEliminationPass () {
986975 return MakeUnique<Optimizer::PassToken::Impl>(
987976 MakeUnique<opt::RedundancyEliminationPass>());
@@ -1031,9 +1020,9 @@ Optimizer::PassToken CreateLoopUnrollPass(bool fully_unroll, int factor) {
10311020 MakeUnique<opt::LoopUnroller>(fully_unroll, factor));
10321021}
10331022
1034- Optimizer::PassToken CreateSSARewritePass () {
1023+ Optimizer::PassToken CreateSSARewritePass (SSARewriteMode mode ) {
10351024 return MakeUnique<Optimizer::PassToken::Impl>(
1036- MakeUnique<opt::SSARewritePass>());
1025+ MakeUnique<opt::SSARewritePass>(mode ));
10371026}
10381027
10391028Optimizer::PassToken CreateCopyPropagateArraysPass () {
0 commit comments