Skip to content

Commit 7154eb8

Browse files
author
Tarun Prabhu
committed
Use explicit speedup and size levels since isOptimizingForSize assumes that speedLevel == 0, when, in fact, sizeLevel > 1 => speedupLevel == 2.
1 parent c5fc8ef commit 7154eb8

File tree

1 file changed

+25
-18
lines changed

1 file changed

+25
-18
lines changed

flang/lib/Optimizer/Passes/Pipelines.cpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void addCfgConversionPass(mlir::PassManager &pm,
5656

5757
void 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) {
170170
void 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,
250251
void 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,
360365
void 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

Comments
 (0)