@@ -120,9 +120,69 @@ 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- bool include_loop_unroll,
125- SSARewriteMode ssa_rewrite_mode) {
123+ Optimizer& Optimizer::RegisterLegalizationPasses (bool preserve_interface) {
124+ return
125+ // Wrap OpKill instructions so all other code can be inlined.
126+ RegisterPass (CreateWrapOpKillPass ())
127+ // Remove unreachable block so that merge return works.
128+ .RegisterPass (CreateDeadBranchElimPass ())
129+ // Merge the returns so we can inline.
130+ .RegisterPass (CreateMergeReturnPass ())
131+ // Make sure uses and definitions are in the same function.
132+ .RegisterPass (CreateInlineExhaustivePass ())
133+ // Make private variable function scope
134+ .RegisterPass (CreateEliminateDeadFunctionsPass ())
135+ .RegisterPass (CreatePrivateToLocalPass ())
136+ // Fix up the storage classes that DXC may have purposely generated
137+ // incorrectly. All functions are inlined, and a lot of dead code has
138+ // been removed.
139+ .RegisterPass (CreateFixStorageClassPass ())
140+ // Propagate the value stored to the loads in very simple cases.
141+ .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
142+ .RegisterPass (CreateLocalSingleStoreElimPass ())
143+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
144+ // Split up aggregates so they are easier to deal with.
145+ .RegisterPass (CreateScalarReplacementPass (0 ))
146+ // Remove loads and stores so everything is in intermediate values.
147+ // Takes care of copy propagation of non-members.
148+ .RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
149+ .RegisterPass (CreateLocalSingleStoreElimPass ())
150+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
151+ .RegisterPass (CreateLocalMultiStoreElimPass ())
152+ .RegisterPass (CreateCombineAccessChainsPass ())
153+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface))
154+ .RegisterPass (CreateLegalizeMultidimArrayPass ())
155+ // Propagate constants to get as many constant conditions on branches
156+ // 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 ());
177+ }
178+
179+ Optimizer& Optimizer::RegisterLegalizationPasses () {
180+ return RegisterLegalizationPasses (false );
181+ }
182+
183+ Optimizer& Optimizer::RegisterLegalizationPassesFastCompile (
184+ bool preserve_interface, bool include_loop_unroll,
185+ SSARewriteMode ssa_rewrite_mode) {
126186 auto & optimizer =
127187 // Wrap OpKill instructions so all other code can be inlined.
128188 RegisterPass (CreateWrapOpKillPass ())
@@ -132,38 +192,38 @@ Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface,
132192 .RegisterPass (CreateMergeReturnPass ())
133193 // Make sure uses and definitions are in the same function.
134194 .RegisterPass (CreateInlineExhaustivePass ())
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));
195+ .RegisterPass (CreateEliminateDeadFunctionsPass ());
196+ optimizer.RegisterPass (CreatePrivateToLocalPass ());
197+ // Fix up the storage classes that DXC may have purposely generated
198+ // incorrectly. All functions are inlined, and a lot of dead code has
199+ // been removed.
200+ optimizer.RegisterPass (CreateFixStorageClassPass ());
201+ // Propagate the value stored to the loads in very simple cases.
202+ optimizer.RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
203+ .RegisterPass (CreateLocalSingleStoreElimPass ())
204+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface));
205+ optimizer
206+ // Split up aggregates so they are easier to deal with.
207+ .RegisterPass (CreateScalarReplacementPass (0 ));
208+ // Remove loads and stores so everything is in intermediate values.
209+ // Takes care of copy propagation of non-members.
210+ optimizer.RegisterPass (CreateLocalSingleBlockLoadStoreElimPass ())
211+ .RegisterPass (CreateLocalSingleStoreElimPass ())
212+ .RegisterPass (CreateAggressiveDCEPass (preserve_interface));
213+ if (ssa_rewrite_mode != SSARewriteMode::None) {
214+ optimizer.RegisterPass (CreateSSARewritePass (ssa_rewrite_mode));
155215 }
156- optimizer
157- // Propagate constants to get as many constant conditions on branches
158- // as possible.
159- .RegisterPass (CreateCCPPass ());
216+ optimizer
217+ // Propagate constants to get as many constant conditions on branches
218+ // as possible.
219+ .RegisterPass (CreateCCPPass ());
160220 if (include_loop_unroll) {
161221 optimizer.RegisterPass (CreateLoopUnrollPass (true ));
162222 }
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 ());
223+ optimizer.RegisterPass (CreateDeadBranchElimPass ())
224+ // Copy propagate members. Cleans up code sequences generated by scalar
225+ // replacement. Also important for removing OpPhi nodes.
226+ .RegisterPass (CreateSimplificationPass ());
167227 return optimizer
168228 // May need loop unrolling here see
169229 // https://github.com/Microsoft/DirectXShaderCompiler/pull/930
@@ -179,13 +239,9 @@ Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface,
179239 .RegisterPass (CreateOpExtInstWithForwardReferenceFixupPass ());
180240}
181241
182- Optimizer& Optimizer::RegisterLegalizationPasses () {
183- return RegisterLegalizationPasses (false , true , SSARewriteMode::All);
184- }
185-
186- Optimizer& Optimizer::RegisterLegalizationPasses (bool preserve_interface) {
187- return RegisterLegalizationPasses (preserve_interface, true ,
188- SSARewriteMode::All);
242+ Optimizer& Optimizer::RegisterLegalizationPassesFastCompile () {
243+ return RegisterLegalizationPassesFastCompile (false , true ,
244+ SSARewriteMode::All);
189245}
190246
191247Optimizer& Optimizer::RegisterPerformancePasses (bool preserve_interface) {
@@ -461,6 +517,8 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag,
461517 RegisterPass (CreateFoldSpecConstantOpAndCompositePass ());
462518 } else if (pass_name == " loop-unswitch" ) {
463519 RegisterPass (CreateLoopUnswitchPass ());
520+ } else if (pass_name == " legalize-multidim-array" ) {
521+ RegisterPass (CreateLegalizeMultidimArrayPass ());
464522 } else if (pass_name == " scalar-replacement" ) {
465523 if (pass_args.size () == 0 ) {
466524 RegisterPass (CreateScalarReplacementPass (0 ));
@@ -1023,6 +1081,11 @@ Optimizer::PassToken CreateLoopUnswitchPass() {
10231081 MakeUnique<opt::LoopUnswitchPass>());
10241082}
10251083
1084+ Optimizer::PassToken CreateLegalizeMultidimArrayPass () {
1085+ return MakeUnique<Optimizer::PassToken::Impl>(
1086+ MakeUnique<opt::LegalizeMultidimArrayPass>());
1087+ }
1088+
10261089Optimizer::PassToken CreateRedundancyEliminationPass () {
10271090 return MakeUnique<Optimizer::PassToken::Impl>(
10281091 MakeUnique<opt::RedundancyEliminationPass>());
@@ -1072,9 +1135,14 @@ Optimizer::PassToken CreateLoopUnrollPass(bool fully_unroll, int factor) {
10721135 MakeUnique<opt::LoopUnroller>(fully_unroll, factor));
10731136}
10741137
1075- Optimizer::PassToken CreateSSARewritePass (SSARewriteMode mode) {
1138+ Optimizer::PassToken CreateSSARewritePass () {
1139+ return MakeUnique<Optimizer::PassToken::Impl>(
1140+ MakeUnique<opt::SSARewritePass>());
1141+ }
1142+
1143+ Optimizer::PassToken CreateSSARewritePass (SSARewriteMode mode) {
10761144 return MakeUnique<Optimizer::PassToken::Impl>(
1077- MakeUnique<opt::SSARewritePass>(mode));
1145+ MakeUnique<opt::SSARewritePass>(mode));
10781146}
10791147
10801148Optimizer::PassToken CreateCopyPropagateArraysPass () {
0 commit comments