Skip to content

Commit c5fc8ef

Browse files
committed
Do not run some MLIR passes when compiling with -Os/-Oz since they may result in an increase in code size
1 parent 2d755d7 commit c5fc8ef

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

flang/lib/Optimizer/Passes/Pipelines.cpp

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -169,28 +169,30 @@ void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config) {
169169
/// \param pm - MLIR pass manager that will hold the pipeline definition
170170
void 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

Comments
 (0)