@@ -169,28 +169,30 @@ void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config) {
169169// / \param pm - MLIR pass manager that will hold the pipeline definition
170170void createDefaultFIROptimizerPassPipeline (mlir::PassManager &pm,
171171 MLIRToLLVMPassPipelineConfig &pc) {
172+ llvm::OptimizationLevel optLevel = pc.OptLevel ;
173+
172174 // Early Optimizer EP Callback
173- pc.invokeFIROptEarlyEPCallbacks (pm, pc. OptLevel );
175+ pc.invokeFIROptEarlyEPCallbacks (pm, optLevel );
174176
175177 // simplify the IR
176178 mlir::GreedyRewriteConfig config;
177179 config.setRegionSimplificationLevel (
178180 mlir::GreedySimplifyRegionLevel::Disabled);
179181 pm.addPass (mlir::createCSEPass ());
180- fir::addAVC (pm, pc. OptLevel );
182+ fir::addAVC (pm, optLevel );
181183 addNestedPassToAllTopLevelOperations<PassConstructor>(
182184 pm, fir::createCharacterConversion);
183185 pm.addPass (mlir::createCanonicalizerPass (config));
184186 pm.addPass (fir::createSimplifyRegionLite ());
185- if (pc. OptLevel . isOptimizingForSpeed ()) {
187+ if (optLevel. isOptimizingForSpeed () && !optLevel. isOptimizingForSize ()) {
186188 // These passes may increase code size.
187189 pm.addPass (fir::createSimplifyIntrinsics ());
188190 pm.addPass (fir::createAlgebraicSimplificationPass (config));
189191 if (enableConstantArgumentGlobalisation)
190192 pm.addPass (fir::createConstantArgumentGlobalisationOpt ());
191193 }
192194
193- if (pc.LoopVersioning )
195+ if (pc.LoopVersioning && !optLevel. isOptimizingForSize () )
194196 pm.addPass (fir::createLoopVersioning ());
195197
196198 pm.addPass (mlir::createCSEPass ());
@@ -201,7 +203,7 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
201203 fir::addMemoryAllocationOpt (pm);
202204
203205 // FIR Inliner Callback
204- pc.invokeFIRInlinerCallback (pm, pc. OptLevel );
206+ pc.invokeFIRInlinerCallback (pm, optLevel );
205207
206208 pm.addPass (fir::createSimplifyRegionLite ());
207209 pm.addPass (mlir::createCSEPass ());
@@ -212,13 +214,14 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
212214
213215 // Optimize redundant array repacking operations,
214216 // if the source is known to be contiguous.
215- if (pc. OptLevel .isOptimizingForSpeed ())
217+ if (optLevel .isOptimizingForSpeed ())
216218 pm.addPass (fir::createOptimizeArrayRepacking ());
217219 pm.addPass (fir::createLowerRepackArraysPass ());
218220 // Expand FIR operations that may use SCF dialect for their
219221 // implementation. This is a mandatory pass.
220- pm.addPass (fir::createSimplifyFIROperations (
221- {/* preferInlineImplementation=*/ pc.OptLevel .isOptimizingForSpeed ()}));
222+ bool preferInlineImplementation =
223+ optLevel.isOptimizingForSpeed () && !optLevel.isOptimizingForSize ();
224+ pm.addPass (fir::createSimplifyFIROperations ({preferInlineImplementation}));
222225
223226 addNestedPassToAllTopLevelOperations<PassConstructor>(
224227 pm, fir::createStackReclaim);
@@ -232,11 +235,11 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
232235 pm.addPass (fir::createConvertComplexPow ());
233236 pm.addPass (mlir::createCSEPass ());
234237
235- if (pc. OptLevel .isOptimizingForSpeed ())
238+ if (optLevel .isOptimizingForSpeed ())
236239 pm.addPass (fir::createSetRuntimeCallAttributes ());
237240
238241 // Last Optimizer EP Callback
239- pc.invokeFIROptLastEPCallbacks (pm, pc. OptLevel );
242+ pc.invokeFIROptLastEPCallbacks (pm, optLevel );
240243}
241244
242245// / Create a pass pipeline for lowering from HLFIR to FIR
@@ -256,8 +259,9 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
256259 addNestedPassToAllTopLevelOperations<PassConstructor>(
257260 pm, hlfir::createSimplifyHLFIRIntrinsics);
258261 }
259- addNestedPassToAllTopLevelOperations<PassConstructor>(
260- pm, hlfir::createInlineElementals);
262+ if (!optLevel.isOptimizingForSize ())
263+ addNestedPassToAllTopLevelOperations<PassConstructor>(
264+ pm, hlfir::createInlineElementals);
261265 if (optLevel.isOptimizingForSpeed ()) {
262266 addCanonicalizerPassWithoutRegionSimplification (pm);
263267 pm.addPass (mlir::createCSEPass ());
@@ -271,8 +275,10 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
271275 pm, hlfir::createPropagateFortranVariableAttributes);
272276 addNestedPassToAllTopLevelOperations<PassConstructor>(
273277 pm, hlfir::createOptimizedBufferization);
274- addNestedPassToAllTopLevelOperations<PassConstructor>(
275- pm, hlfir::createInlineHLFIRAssign);
278+
279+ if (!optLevel.isOptimizingForSize ())
280+ addNestedPassToAllTopLevelOperations<PassConstructor>(
281+ pm, hlfir::createInlineHLFIRAssign);
276282
277283 if (optLevel == llvm::OptimizationLevel::O3) {
278284 addNestedPassToAllTopLevelOperations<PassConstructor>(
@@ -297,7 +303,7 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
297303 // TODO: we can remove the previous InlineHLFIRAssign, when
298304 // FIR AliasAnalysis is good enough to say that a temporary
299305 // array does not alias with any user object.
300- if (optLevel.isOptimizingForSpeed ())
306+ if (optLevel.isOptimizingForSpeed () && !optLevel. isOptimizingForSize () )
301307 addNestedPassToAllTopLevelOperations<PassConstructor>(
302308 pm, hlfir::createInlineHLFIRAssign);
303309 pm.addPass (hlfir::createConvertHLFIRtoFIR ());
0 commit comments