Skip to content

Commit 81469a2

Browse files
authored
[flang] use hlfir base when translating assumed-rank entity to fir::ExtendedValue (#94822)
The hlfir::Entity to fir::ExtendedValue conversion usually uses the "fir base" output of hlfir.declare (which is the same as the input) to avoid introducing temporary descriptors for the sole purpose of introducing updating lower bound information. This is possible because local lower bounds, if any, are tracked in a vector inside the fir::ExtendedValue. With assumed-ranks, the lower bounds cannot be tracked inside the fir::ExtendedValue vector (their numbers is unknown at compile time). Hence, the fir.box/fir.class used in fir::ExtendedValue in lowering must always contain accurate local lower bound information.
1 parent 317ed77 commit 81469a2

File tree

5 files changed

+55
-50
lines changed

5 files changed

+55
-50
lines changed

flang/lib/Optimizer/Builder/HLFIRTools.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -882,10 +882,15 @@ static fir::ExtendedValue translateVariableToExtendedValue(
882882
mlir::Location loc, fir::FirOpBuilder &builder, hlfir::Entity variable,
883883
bool forceHlfirBase = false, bool contiguousHint = false) {
884884
assert(variable.isVariable() && "must be a variable");
885-
/// When going towards FIR, use the original base value to avoid
886-
/// introducing descriptors at runtime when they are not required.
887-
mlir::Value base =
888-
forceHlfirBase ? variable.getBase() : variable.getFirBase();
885+
// When going towards FIR, use the original base value to avoid
886+
// introducing descriptors at runtime when they are not required.
887+
// This is not done for assumed-rank since the fir::ExtendedValue cannot
888+
// held the related lower bounds in an vector. The lower bounds of the
889+
// descriptor must always be used instead.
890+
891+
mlir::Value base = (forceHlfirBase || variable.isAssumedRank())
892+
? variable.getBase()
893+
: variable.getFirBase();
889894
if (variable.isMutableBox())
890895
return fir::MutableBoxValue(base, getExplicitTypeParams(variable),
891896
fir::MutableProperties{});

flang/test/Lower/HLFIR/assumed-rank-inquiries-2.f90

+6-6
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ subroutine test_size_4(x)
2929
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<*:f32>> {fir.bindc_name = "x"}) {
3030
! CHECK: %[[VAL_1:.*]] = fir.dummy_scope : !fir.dscope
3131
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[VAL_1]] {uniq_name = "_QFtest_size_1Ex"} : (!fir.box<!fir.array<*:f32>>, !fir.dscope) -> (!fir.box<!fir.array<*:f32>>, !fir.box<!fir.array<*:f32>>)
32-
! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_2]]#1 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
32+
! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
3333
! CHECK: %[[VAL_7:.*]] = fir.call @_FortranASize(%[[VAL_5]]
3434
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i64) -> i32
3535
! CHECK: %[[VAL_9:.*]]:3 = hlfir.associate %[[VAL_8]] {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
@@ -49,13 +49,13 @@ subroutine test_size_4(x)
4949
! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i64
5050
! CHECK: %[[VAL_7:.*]] = arith.cmpi eq, %[[VAL_5]], %[[VAL_6]] : i64
5151
! CHECK: %[[VAL_8:.*]] = fir.if %[[VAL_7]] -> (i32) {
52-
! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_3]]#1 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
52+
! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
5353
! CHECK: %[[VAL_13:.*]] = fir.call @_FortranASize(%[[VAL_11]]
5454
! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i64) -> i32
5555
! CHECK: fir.result %[[VAL_14]] : i32
5656
! CHECK: } else {
5757
! CHECK: %[[VAL_15:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
58-
! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_3]]#1 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
58+
! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
5959
! CHECK: %[[VAL_20:.*]] = fir.call @_FortranASizeDim(%[[VAL_18]]
6060
! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> i32
6161
! CHECK: fir.result %[[VAL_21]] : i32
@@ -76,13 +76,13 @@ subroutine test_size_4(x)
7676
! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i64
7777
! CHECK: %[[VAL_7:.*]] = arith.cmpi eq, %[[VAL_5]], %[[VAL_6]] : i64
7878
! CHECK: %[[VAL_8:.*]] = fir.if %[[VAL_7]] -> (i32) {
79-
! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_4]]#1 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
79+
! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
8080
! CHECK: %[[VAL_13:.*]] = fir.call @_FortranASize(%[[VAL_11]],
8181
! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i64) -> i32
8282
! CHECK: fir.result %[[VAL_14]] : i32
8383
! CHECK: } else {
8484
! CHECK: %[[VAL_15:.*]] = fir.load %[[VAL_3]]#1 : !fir.ref<i32>
85-
! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_4]]#1 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
85+
! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.box<!fir.array<*:f32>>) -> !fir.box<none>
8686
! CHECK: %[[VAL_20:.*]] = fir.call @_FortranASizeDim(%[[VAL_18]]
8787
! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> i32
8888
! CHECK: fir.result %[[VAL_21]] : i32
@@ -97,7 +97,7 @@ subroutine test_size_4(x)
9797
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<*:f32>>>> {fir.bindc_name = "x"}) {
9898
! CHECK: %[[VAL_1:.*]] = fir.dummy_scope : !fir.dscope
9999
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[VAL_1]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest_size_4Ex"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<*:f32>>>>, !fir.dscope) -> (!fir.ref<!fir.box<!fir.heap<!fir.array<*:f32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<*:f32>>>>)
100-
! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_2]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<*:f32>>>>
100+
! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<*:f32>>>>
101101
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_3]] : (!fir.box<!fir.heap<!fir.array<*:f32>>>) -> !fir.box<none>
102102
! CHECK: %[[VAL_8:.*]] = fir.call @_FortranASize(%[[VAL_6]]
103103
! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> i32

0 commit comments

Comments
 (0)