forked from OSchip/llvm-project
[flang] fix LBOUND lowering with KIND and no DIM arguments
The lowering code was mistakenly assuming that the second argument in the signature provided by semantics is the DIM argument. This caused calls with a KIND argument but no DIM to be lowered as if the KIND argument was DIM. Differential Revision: https://reviews.llvm.org/D124243
This commit is contained in:
parent
34312f1f0c
commit
fca52e8218
|
@ -3363,7 +3363,7 @@ static mlir::Value computeLBOUND(fir::FirOpBuilder &builder, mlir::Location loc,
|
||||||
fir::ExtendedValue
|
fir::ExtendedValue
|
||||||
IntrinsicLibrary::genLbound(mlir::Type resultType,
|
IntrinsicLibrary::genLbound(mlir::Type resultType,
|
||||||
llvm::ArrayRef<fir::ExtendedValue> args) {
|
llvm::ArrayRef<fir::ExtendedValue> args) {
|
||||||
assert(args.size() > 0);
|
assert(args.size() == 2 || args.size() == 3);
|
||||||
const fir::ExtendedValue &array = args[0];
|
const fir::ExtendedValue &array = args[0];
|
||||||
if (const auto *boxValue = array.getBoxOf<fir::BoxValue>())
|
if (const auto *boxValue = array.getBoxOf<fir::BoxValue>())
|
||||||
if (boxValue->hasAssumedRank())
|
if (boxValue->hasAssumedRank())
|
||||||
|
@ -3372,7 +3372,10 @@ IntrinsicLibrary::genLbound(mlir::Type resultType,
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
mlir::Type indexType = builder.getIndexType();
|
mlir::Type indexType = builder.getIndexType();
|
||||||
|
|
||||||
if (isStaticallyAbsent(args, 1)) {
|
// Semantics builds signatures for LBOUND calls as either
|
||||||
|
// LBOUND(array, dim, [kind]) or LBOUND(array, [kind]).
|
||||||
|
if (args.size() == 2 || isStaticallyAbsent(args, 1)) {
|
||||||
|
// DIM is absent.
|
||||||
mlir::Type lbType = fir::unwrapSequenceType(resultType);
|
mlir::Type lbType = fir::unwrapSequenceType(resultType);
|
||||||
unsigned rank = array.rank();
|
unsigned rank = array.rank();
|
||||||
mlir::Type lbArrayType = fir::SequenceType::get(
|
mlir::Type lbArrayType = fir::SequenceType::get(
|
||||||
|
|
|
@ -52,3 +52,43 @@ subroutine lbound_test_3(a, dim, res)
|
||||||
! CHECK: fir.store %[[VAL_8]] to %arg2 : !fir.ref<i64>
|
! CHECK: fir.store %[[VAL_8]] to %arg2 : !fir.ref<i64>
|
||||||
res = lbound(a, dim, 8)
|
res = lbound(a, dim, 8)
|
||||||
end subroutine
|
end subroutine
|
||||||
|
|
||||||
|
! CHECK-LABEL: func @_QPlbound_test_4(
|
||||||
|
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<?x?xf32>> {fir.bindc_name = "a"},
|
||||||
|
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i64> {fir.bindc_name = "dim"},
|
||||||
|
! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<i64> {fir.bindc_name = "l1"},
|
||||||
|
! CHECK-SAME: %[[VAL_3:.*]]: !fir.ref<i64> {fir.bindc_name = "u1"},
|
||||||
|
! CHECK-SAME: %[[VAL_4:.*]]: !fir.ref<i64> {fir.bindc_name = "l2"},
|
||||||
|
! CHECK-SAME: %[[VAL_5:.*]]: !fir.ref<i64> {fir.bindc_name = "u2"}) {
|
||||||
|
subroutine lbound_test_4(a, dim, l1, u1, l2, u2)
|
||||||
|
integer(8):: dim, l1, u1, l2, u2
|
||||||
|
! CHECK: %[[VAL_6:.*]] = fir.alloca !fir.array<2xi32>
|
||||||
|
! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_2]] : !fir.ref<i64>
|
||||||
|
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i64) -> index
|
||||||
|
! CHECK: %[[VAL_17:.*]] = fir.load %[[VAL_4]] : !fir.ref<i64>
|
||||||
|
! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (i64) -> index
|
||||||
|
real, dimension(l1:u1, l2:u2) :: a
|
||||||
|
! BeginExternalListOutput
|
||||||
|
! CHECK: %[[VAL_32:.*]] = arith.constant 1 : i32
|
||||||
|
! CHECK: %[[VAL_33:.*]] = arith.constant 0 : index
|
||||||
|
! CHECK: %[[VAL_34:.*]] = arith.cmpi eq, %[[VAL_16:.*]], %[[VAL_33]] : index
|
||||||
|
! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_32]] : (i32) -> index
|
||||||
|
! CHECK: %[[VAL_36:.*]] = arith.select %[[VAL_34]], %[[VAL_35]], %[[VAL_8]] : index
|
||||||
|
! CHECK: %[[VAL_37:.*]] = fir.convert %[[VAL_36]] : (index) -> i32
|
||||||
|
! CHECK: %[[VAL_38:.*]] = arith.constant 0 : index
|
||||||
|
! CHECK: %[[VAL_39:.*]] = fir.coordinate_of %[[VAL_6]], %[[VAL_38]] : (!fir.ref<!fir.array<2xi32>>, index) -> !fir.ref<i32>
|
||||||
|
! CHECK: fir.store %[[VAL_37]] to %[[VAL_39]] : !fir.ref<i32>
|
||||||
|
! CHECK: %[[VAL_40:.*]] = arith.cmpi eq, %[[VAL_26:.*]], %[[VAL_33]] : index
|
||||||
|
! CHECK: %[[VAL_41:.*]] = fir.convert %[[VAL_32]] : (i32) -> index
|
||||||
|
! CHECK: %[[VAL_42:.*]] = arith.select %[[VAL_40]], %[[VAL_41]], %[[VAL_18]] : index
|
||||||
|
! CHECK: %[[VAL_43:.*]] = fir.convert %[[VAL_42]] : (index) -> i32
|
||||||
|
! CHECK: %[[VAL_44:.*]] = arith.constant 1 : index
|
||||||
|
! CHECK: %[[VAL_45:.*]] = fir.coordinate_of %[[VAL_6]], %[[VAL_44]] : (!fir.ref<!fir.array<2xi32>>, index) -> !fir.ref<i32>
|
||||||
|
! CHECK: fir.store %[[VAL_43]] to %[[VAL_45]] : !fir.ref<i32>
|
||||||
|
! CHECK: %[[VAL_46:.*]] = arith.constant 2 : index
|
||||||
|
! CHECK: %[[VAL_47:.*]] = fir.shape %[[VAL_46]] : (index) -> !fir.shape<1>
|
||||||
|
! CHECK: %[[VAL_48:.*]] = fir.embox %[[VAL_6]](%[[VAL_47]]) : (!fir.ref<!fir.array<2xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<2xi32>>
|
||||||
|
! CHECK: %[[VAL_49:.*]] = fir.convert %[[VAL_48]] : (!fir.box<!fir.array<2xi32>>) -> !fir.box<none>
|
||||||
|
! CHECK: fir.call @_FortranAioOutputDescriptor(%{{.*}}, %[[VAL_49]]) : (!fir.ref<i8>, !fir.box<none>) -> i1
|
||||||
|
print *, lbound(a, kind=4)
|
||||||
|
end subroutine
|
||||||
|
|
Loading…
Reference in New Issue