summaryrefslogtreecommitdiff
path: root/flang/lib
diff options
context:
space:
mode:
authorRazvan Lupusoru <rlupusoru@nvidia.com>2023-05-11 10:42:37 -0700
committerRazvan Lupusoru <rlupusoru@nvidia.com>2023-05-11 14:50:43 -0700
commit036549fc6c7cb9ecddd82c1401a2b50882a219f7 (patch)
tree52c79b849825ae863687a929ba86ace95ec39e05 /flang/lib
parente19387e6936c9ccc6200b32f3affea7b1020664c (diff)
downloadllvm-036549fc6c7cb9ecddd82c1401a2b50882a219f7.tar.gz
[flang] Inline array size call when dim is compile time constant
Instead of calling _FortranASizeDim, we can instead load extent directly from descriptor. Add this support for cases where dim is a known constant at compile time. Reviewed By: clementval Differential Revision: https://reviews.llvm.org/D150385
Diffstat (limited to 'flang/lib')
-rw-r--r--flang/lib/Optimizer/Builder/IntrinsicCall.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index dee08c7d85f8..2ee6f404ceef 100644
--- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
+++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
@@ -4907,6 +4907,13 @@ IntrinsicLibrary::genSize(mlir::Type resultType,
// Get the DIM argument.
mlir::Value dim = fir::getBase(args[1]);
+ if (std::optional<std::int64_t> 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));