[flang-commits] [flang] 036549f - [flang] Inline array size call when dim is compile time constant
Razvan Lupusoru via flang-commits
flang-commits at lists.llvm.org
Thu May 11 14:51:10 PDT 2023
Author: Razvan Lupusoru
Date: 2023-05-11T14:50:43-07:00
New Revision: 036549fc6c7cb9ecddd82c1401a2b50882a219f7
URL: https://github.com/llvm/llvm-project/commit/036549fc6c7cb9ecddd82c1401a2b50882a219f7
DIFF: https://github.com/llvm/llvm-project/commit/036549fc6c7cb9ecddd82c1401a2b50882a219f7.diff
LOG: [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
Added:
Modified:
flang/lib/Optimizer/Builder/IntrinsicCall.cpp
flang/test/Lower/Intrinsics/ubound.f90
Removed:
################################################################################
diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index dee08c7d85f8f..2ee6f404ceef1 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));
diff --git a/flang/test/Lower/Intrinsics/ubound.f90 b/flang/test/Lower/Intrinsics/ubound.f90
index 1883d5bf75231..8210ff38994b5 100644
--- a/flang/test/Lower/Intrinsics/ubound.f90
+++ b/flang/test/Lower/Intrinsics/ubound.f90
@@ -69,3 +69,15 @@ subroutine ubound_test_3(a, dim, res)
! CHECK: fir.store %[[VAL_16]] to %{{.*}} : !fir.ref<i64>
res = ubound(a, dim, 8)
end subroutine
+
+
+! CHECK-LABEL: func @_QPubound_test_const_dim(
+subroutine ubound_test_const_dim(array)
+ real :: array(11:)
+ integer :: res
+! Should not call _FortranASizeDim when dim is compile time constant. But instead load from descriptor directly.
+! CHECK: %[[C0:.*]] = arith.constant 0 : index
+! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %arg0, %[[C0]] : (!fir.box<!fir.array<?xf32>>, index) -> (index, index, index)
+! CHECK: %{{.*}} = fir.convert %[[DIMS]]#1 : (index) -> i32
+ res = ubound(array, 1)
+end subroutine
More information about the flang-commits
mailing list