diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -4843,6 +4843,13 @@ // Get the DIM argument. mlir::Value dim = fir::getBase(args[1]); + if (std::optional cstDim = fir::getIntIfConstant(dim)) { + // If it is a compile time constant, skip the runtime call. + return builder.createConvert(loc, resultType, + fir::factory::readExtent(builder, loc, + fir::BoxValue{array}, + cstDim.value() - 1)); + } if (!fir::isa_ref_type(dim.getType())) return builder.createConvert( loc, resultType, fir::runtime::genSizeDim(builder, loc, array, dim));