diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp index 1cc3f0b81c20a..d55ad9e603ffa 100644 --- a/flang/lib/Optimizer/Passes/Pipelines.cpp +++ b/flang/lib/Optimizer/Passes/Pipelines.cpp @@ -245,7 +245,15 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, bool enableOpenMP, } pm.addPass(hlfir::createLowerHLFIROrderedAssignments()); pm.addPass(hlfir::createLowerHLFIRIntrinsics()); - pm.addPass(hlfir::createBufferizeHLFIR()); + + hlfir::BufferizeHLFIROptions bufferizeOptions; + // For opt-for-speed, avoid running any of the loops resulting + // from hlfir.elemental lowering, if the result is an empty array. + // This helps to avoid long running loops for elementals with + // shapes like (0, HUGE). + if (optLevel.isOptimizingForSpeed()) + bufferizeOptions.optimizeEmptyElementals = true; + pm.addPass(hlfir::createBufferizeHLFIR(bufferizeOptions)); // Run hlfir.assign inlining again after BufferizeHLFIR, // because the latter may introduce new hlfir.assign operations, // e.g. for copying an array into a temporary due to