@@ -56,7 +56,7 @@ void addCfgConversionPass(mlir::PassManager &pm,
5656
5757void addAVC (mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel) {
5858 ArrayValueCopyOptions options;
59- options.optimizeConflicts = optLevel. isOptimizingForSpeed () ;
59+ options.optimizeConflicts = optLevel != llvm::OptimizationLevel::O0 ;
6060 addNestedPassConditionally<mlir::func::FuncOp>(
6161 pm, disableFirAvc, [&]() { return createArrayValueCopyPass (options); });
6262}
@@ -170,6 +170,8 @@ void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config) {
170170void createDefaultFIROptimizerPassPipeline (mlir::PassManager &pm,
171171 MLIRToLLVMPassPipelineConfig &pc) {
172172 llvm::OptimizationLevel optLevel = pc.OptLevel ;
173+ unsigned speedupLevel = optLevel.getSpeedupLevel ();
174+ unsigned sizeLevel = optLevel.getSizeLevel ();
173175
174176 // Early Optimizer EP Callback
175177 pc.invokeFIROptEarlyEPCallbacks (pm, optLevel);
@@ -184,15 +186,15 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
184186 pm, fir::createCharacterConversion);
185187 pm.addPass (mlir::createCanonicalizerPass (config));
186188 pm.addPass (fir::createSimplifyRegionLite ());
187- if (optLevel. isOptimizingForSpeed () && !optLevel. isOptimizingForSize () ) {
189+ if (speedupLevel && !sizeLevel ) {
188190 // These passes may increase code size.
189191 pm.addPass (fir::createSimplifyIntrinsics ());
190192 pm.addPass (fir::createAlgebraicSimplificationPass (config));
191193 if (enableConstantArgumentGlobalisation)
192194 pm.addPass (fir::createConstantArgumentGlobalisationOpt ());
193195 }
194196
195- if (pc.LoopVersioning && !optLevel. isOptimizingForSize () )
197+ if (pc.LoopVersioning && !sizeLevel )
196198 pm.addPass (fir::createLoopVersioning ());
197199
198200 pm.addPass (mlir::createCSEPass ());
@@ -214,13 +216,12 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
214216
215217 // Optimize redundant array repacking operations,
216218 // if the source is known to be contiguous.
217- if (optLevel. isOptimizingForSpeed () )
219+ if (speedupLevel )
218220 pm.addPass (fir::createOptimizeArrayRepacking ());
219221 pm.addPass (fir::createLowerRepackArraysPass ());
220222 // Expand FIR operations that may use SCF dialect for their
221223 // implementation. This is a mandatory pass.
222- bool preferInlineImplementation =
223- optLevel.isOptimizingForSpeed () && !optLevel.isOptimizingForSize ();
224+ bool preferInlineImplementation = speedupLevel && !sizeLevel;
224225 pm.addPass (fir::createSimplifyFIROperations ({preferInlineImplementation}));
225226
226227 addNestedPassToAllTopLevelOperations<PassConstructor>(
@@ -235,7 +236,7 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
235236 pm.addPass (fir::createConvertComplexPow ());
236237 pm.addPass (mlir::createCSEPass ());
237238
238- if (optLevel. isOptimizingForSpeed () )
239+ if (speedupLevel )
239240 pm.addPass (fir::createSetRuntimeCallAttributes ());
240241
241242 // Last Optimizer EP Callback
@@ -250,19 +251,24 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
250251void createHLFIRToFIRPassPipeline (mlir::PassManager &pm,
251252 EnableOpenMP enableOpenMP,
252253 llvm::OptimizationLevel optLevel) {
253- if (optLevel.getSizeLevel () > 0 || optLevel.getSpeedupLevel () > 0 ) {
254+ // if sizeLevel > 0 (this is the case when either -Os or -Oz is provided on
255+ // the command line), the speedupLevel is guaranteed to be 2.
256+ unsigned speedupLevel = optLevel.getSpeedupLevel ();
257+ unsigned sizeLevel = optLevel.getSizeLevel ();
258+
259+ if (speedupLevel) {
254260 addNestedPassToAllTopLevelOperations<PassConstructor>(
255261 pm, hlfir::createExpressionSimplification);
256262 }
257- if (optLevel. isOptimizingForSpeed () ) {
263+ if (speedupLevel ) {
258264 addCanonicalizerPassWithoutRegionSimplification (pm);
259265 addNestedPassToAllTopLevelOperations<PassConstructor>(
260266 pm, hlfir::createSimplifyHLFIRIntrinsics);
261267 }
262- if (!optLevel. isOptimizingForSize () )
268+ if (!sizeLevel )
263269 addNestedPassToAllTopLevelOperations<PassConstructor>(
264270 pm, hlfir::createInlineElementals);
265- if (optLevel. isOptimizingForSpeed () ) {
271+ if (speedupLevel ) {
266272 addCanonicalizerPassWithoutRegionSimplification (pm);
267273 pm.addPass (mlir::createCSEPass ());
268274 // Run SimplifyHLFIRIntrinsics pass late after CSE,
@@ -275,8 +281,7 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
275281 pm, hlfir::createPropagateFortranVariableAttributes);
276282 addNestedPassToAllTopLevelOperations<PassConstructor>(
277283 pm, hlfir::createOptimizedBufferization);
278-
279- if (!optLevel.isOptimizingForSize ())
284+ if (!sizeLevel)
280285 addNestedPassToAllTopLevelOperations<PassConstructor>(
281286 pm, hlfir::createInlineHLFIRAssign);
282287
@@ -293,7 +298,7 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
293298 // from hlfir.elemental lowering, if the result is an empty array.
294299 // This helps to avoid long running loops for elementals with
295300 // shapes like (0, HUGE).
296- if (optLevel. isOptimizingForSpeed () )
301+ if (speedupLevel )
297302 bufferizeOptions.optimizeEmptyElementals = true ;
298303 pm.addPass (hlfir::createBufferizeHLFIR (bufferizeOptions));
299304 // Run hlfir.assign inlining again after BufferizeHLFIR,
@@ -303,7 +308,7 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
303308 // TODO: we can remove the previous InlineHLFIRAssign, when
304309 // FIR AliasAnalysis is good enough to say that a temporary
305310 // array does not alias with any user object.
306- if (optLevel. isOptimizingForSpeed () && !optLevel. isOptimizingForSize () )
311+ if (speedupLevel && !sizeLevel )
307312 addNestedPassToAllTopLevelOperations<PassConstructor>(
308313 pm, hlfir::createInlineHLFIRAssign);
309314 pm.addPass (hlfir::createConvertHLFIRtoFIR ());
@@ -360,10 +365,12 @@ void createDebugPasses(mlir::PassManager &pm,
360365void createDefaultFIRCodeGenPassPipeline (mlir::PassManager &pm,
361366 MLIRToLLVMPassPipelineConfig config,
362367 llvm::StringRef inputFilename) {
368+ unsigned speedupLevel = config.OptLevel .getSpeedupLevel ();
369+
363370 pm.addPass (fir::createMIFOpConversion ());
364371 fir::addBoxedProcedurePass (pm);
365- if (config. OptLevel . isOptimizingForSpeed () && config.AliasAnalysis &&
366- !disableFirAliasTags && ! useOldAliasTags)
372+ if (speedupLevel && config.AliasAnalysis && !disableFirAliasTags &&
373+ !useOldAliasTags)
367374 pm.addPass (fir::createAddAliasTags ());
368375 addNestedPassToAllTopLevelOperations<PassConstructor>(
369376 pm, fir::createAbstractResultOpt);
@@ -395,7 +402,7 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
395402 // TODO: re-enable setNoAlias by default (when optimizing for speed) once
396403 // function specialization is fixed.
397404 bool setNoAlias = forceNoAlias;
398- bool setNoCapture = config. OptLevel . isOptimizingForSpeed () ;
405+ bool setNoCapture = speedupLevel ;
399406
400407 pm.addPass (fir::createFunctionAttr (
401408 {framePointerKind, config.InstrumentFunctionEntry ,
0 commit comments