Skip to content

Commit 665463c

Browse files
committed
PR1302 fix: lost minus one on DIM in lbound
I forgot to push a PR fix that makes DIM zero based before using it in a fir.coordinate_of in LBOUND implementation.
1 parent 916ef33 commit 665463c

File tree

3 files changed

+24
-14
lines changed

3 files changed

+24
-14
lines changed

flang/lib/Lower/IntrinsicCall.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3087,8 +3087,12 @@ IntrinsicLibrary::genLbound(mlir::Type resultType,
30873087
mlir::Value lbValue = builder.createConvert(loc, resultType, lb.value());
30883088
builder.create<fir::StoreOp>(loc, lbValue, lbAddr);
30893089
}
3090-
mlir::Value resAddr = builder.create<fir::CoordinateOp>(
3091-
loc, lbAddrType, lbArray, fir::getBase(args[1]));
3090+
mlir::Value dimArg = fir::getBase(args[1]);
3091+
mlir::Value one = builder.createIntegerConstant(loc, dimArg.getType(), 1);
3092+
mlir::Value zeroBasedDim =
3093+
builder.create<mlir::arith::SubIOp>(loc, dimArg, one);
3094+
mlir::Value resAddr =
3095+
builder.create<fir::CoordinateOp>(loc, lbAddrType, lbArray, zeroBasedDim);
30923096
return builder.create<fir::LoadOp>(loc, resAddr);
30933097
}
30943098

flang/test/Lower/intrinsic-procedures/lbound.f90

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ subroutine lbound_test_2(a, dim, res)
3434
! CHECK: %[[VAL_13:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_12]] : (!fir.ref<!fir.array<2xi64>>, index) -> !fir.ref<i64>
3535
! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_7]] : (index) -> i64
3636
! CHECK: fir.store %[[VAL_14]] to %[[VAL_13]] : !fir.ref<i64>
37-
! CHECK: %[[VAL_15:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_8]] : (!fir.ref<!fir.array<2xi64>>, i64) -> !fir.ref<i64>
38-
! CHECK: %[[VAL_16:.*]] = fir.load %[[VAL_15]] : !fir.ref<i64>
39-
! CHECK: fir.store %[[VAL_16]] to %[[VAL_2]] : !fir.ref<i64>
37+
! CHECK: %[[VAL_15:.*]] = arith.constant 1 : i64
38+
! CHECK: %[[VAL_16:.*]] = arith.subi %[[VAL_8]], %[[VAL_15]] : i64
39+
! CHECK: %[[VAL_17:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_16]] : (!fir.ref<!fir.array<2xi64>>, i64) -> !fir.ref<i64>
40+
! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_17]] : !fir.ref<i64>
41+
! CHECK: fir.store %[[VAL_18]] to %[[VAL_2]] : !fir.ref<i64>
4042
res = lbound(a, dim, 8)
4143
end subroutine
4244

@@ -59,8 +61,10 @@ subroutine lbound_test_3(a, dim, res)
5961
! CHECK: %[[VAL_11:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_10]] : (!fir.ref<!fir.array<2xi64>>, index) -> !fir.ref<i64>
6062
! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_5]] : (index) -> i64
6163
! CHECK: fir.store %[[VAL_12]] to %[[VAL_11]] : !fir.ref<i64>
62-
! CHECK: %[[VAL_13:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_6]] : (!fir.ref<!fir.array<2xi64>>, i64) -> !fir.ref<i64>
63-
! CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_13]] : !fir.ref<i64>
64-
! CHECK: fir.store %[[VAL_14]] to %[[VAL_2]] : !fir.ref<i64>
64+
! CHECK: %[[VAL_13:.*]] = arith.constant 1 : i64
65+
! CHECK: %[[VAL_14:.*]] = arith.subi %[[VAL_6]], %[[VAL_13]] : i64
66+
! CHECK: %[[VAL_15:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_14]] : (!fir.ref<!fir.array<2xi64>>, i64) -> !fir.ref<i64>
67+
! CHECK: %[[VAL_16:.*]] = fir.load %[[VAL_15]] : !fir.ref<i64>
68+
! CHECK: fir.store %[[VAL_16]] to %[[VAL_2]] : !fir.ref<i64>
6569
res = lbound(a, dim, 8)
6670
end subroutine

flang/test/Lower/intrinsic-procedures/ubound.f90

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@ subroutine ubound_test_2(a, dim, res)
4848
! CHECK: %[[VAL_18:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_17]] : (!fir.ref<!fir.array<2xi64>>, index) -> !fir.ref<i64>
4949
! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_7]] : (index) -> i64
5050
! CHECK: fir.store %[[VAL_19]] to %[[VAL_18]] : !fir.ref<i64>
51-
! CHECK: %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_8]] : (!fir.ref<!fir.array<2xi64>>, i64) -> !fir.ref<i64>
52-
! CHECK: %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<i64>
53-
! CHECK: %[[VAL_22:.*]] = arith.constant 1 : i64
54-
! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_21]], %[[VAL_22]] : i64
55-
! CHECK: %[[VAL_24:.*]] = arith.addi %[[VAL_23]], %[[VAL_13]] : i64
56-
! CHECK: fir.store %[[VAL_24]] to %[[VAL_2]] : !fir.ref<i64>
51+
! CHECK: %[[VAL_20:.*]] = arith.constant 1 : i64
52+
! CHECK: %[[VAL_21:.*]] = arith.subi %[[VAL_8]], %[[VAL_20]] : i64
53+
! CHECK: %[[VAL_22:.*]] = fir.coordinate_of %[[VAL_3]], %[[VAL_21]] : (!fir.ref<!fir.array<2xi64>>, i64) -> !fir.ref<i64>
54+
! CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_22]] : !fir.ref<i64>
55+
! CHECK: %[[VAL_24:.*]] = arith.constant 1 : i64
56+
! CHECK: %[[VAL_25:.*]] = arith.subi %[[VAL_23]], %[[VAL_24]] : i64
57+
! CHECK: %[[VAL_26:.*]] = arith.addi %[[VAL_25]], %[[VAL_13]] : i64
58+
! CHECK: fir.store %[[VAL_26]] to %[[VAL_2]] : !fir.ref<i64>
5759
res = ubound(a, dim, 8)
5860
end subroutine
5961

0 commit comments

Comments
 (0)