Skip to content

Commit ff3e75f

Browse files
banach-spacejeanPerierschweitzpgipsteinfeld
committed
[flang][lowering] Add support for lowering of the {l|u}bound intrinsics
This patch adds support for lowering of the `{l|u}bound` intrinsics from Fortran to the FIR dialect of MLIR. Note that `ubound` is already supported, but the test was missing (added here). This is part of the upstreaming effort from the `fir-dev` branch in [1]. [1] https://github.com/flang-compiler/f18-llvm-project Differential Revision: https://reviews.llvm.org/D121926 Co-authored-by: Jean Perier <[email protected]> Co-authored-by: Eric Schweitz <[email protected]> Co-authored-by: Peter Steinfeld <[email protected]>
1 parent 74992f4 commit ff3e75f

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

flang/lib/Lower/IntrinsicCall.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,10 @@ static constexpr IntrinsicHandler handlers[]{
737737
{"kind", asValue}}}},
738738
{"ishft", &I::genIshft},
739739
{"ishftc", &I::genIshftc},
740+
{"lbound",
741+
&I::genLbound,
742+
{{{"array", asInquired}, {"dim", asValue}, {"kind", asValue}}},
743+
/*isElemental=*/false},
740744
{"len",
741745
&I::genLen,
742746
{{{"string", asInquired}, {"kind", asValue}}},
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
! RUN: bbc -emit-fir %s -o - | FileCheck %s
2+
! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s
3+
4+
5+
! CHECK-LABEL: func @_QPlbound_test(
6+
! CHECK: %[[VAL_0:.*]] = fir.load %arg1 : !fir.ref<i64>
7+
! CHECK: %[[VAL_1:.*]] = fir.rebox %arg0 : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<!fir.array<?x?xf32>>
8+
subroutine lbound_test(a, dim, res)
9+
real, dimension(:, :) :: a
10+
integer(8):: dim, res
11+
! CHECK: %[[VAL_2:.*]] = fir.address_of(
12+
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_1]] : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<none>
13+
! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (i64) -> i32
14+
! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_2]]
15+
! CHECK: %[[VAL_6:.*]] = fir.call @_FortranALboundDim(%[[VAL_3]], %[[VAL_4]], %[[VAL_5]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
16+
! CHECK: fir.store %[[VAL_6]] to %arg2 : !fir.ref<i64>
17+
res = lbound(a, dim, 8)
18+
end subroutine
19+
20+
! CHECK-LABEL: func @_QPlbound_test_2(
21+
! CHECK: %[[VAL_c1_i64:.*]] = arith.constant 1 : i64
22+
! CHECK: %[[VAL_0:.*]] = fir.convert %[[VAL_c1_i64]] : (i64) -> index
23+
! CHECK: %[[VAL_c2_i64:.*]] = arith.constant 2 : i64
24+
! CHECK: %[[VAL_1:.*]] = fir.convert %[[VAL_c2_i64]] : (i64) -> index
25+
! CHECK: %[[VAL_2:.*]] = fir.load %arg1 : !fir.ref<i64>
26+
subroutine lbound_test_2(a, dim, res)
27+
real, dimension(:, 2:) :: a
28+
integer(8):: dim, res
29+
! CHECK: %[[VAL_3:.*]] = fir.shift %[[VAL_0]], %[[VAL_1]] : (index, index) -> !fir.shift<2>
30+
! CHECK: %[[VAL_4:.*]] = fir.rebox %arg0(%[[VAL_3]]) : (!fir.box<!fir.array<?x?xf32>>, !fir.shift<2>) -> !fir.box<!fir.array<?x?xf32>>
31+
! CHECK: %[[VAL_5:.*]] = fir.address_of(
32+
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_4]] : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<none>
33+
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_2]] : (i64) -> i32
34+
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_5]]
35+
! CHECK: %[[VAL_9:.*]] = fir.call @_FortranALboundDim(%[[VAL_6]], %[[VAL_7]], %[[VAL_8]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
36+
! CHECK: fir.store %[[VAL_9]] to %arg2 : !fir.ref<i64>
37+
res = lbound(a, dim, 8)
38+
end subroutine
39+
40+
! CHECK: %[[VAL_0:.*]] = fir.undefined index
41+
subroutine lbound_test_3(a, dim, res)
42+
real, dimension(2:10, 3:*) :: a
43+
integer(8):: dim, res
44+
! CHECK: %[[VAL_1:.*]] = fir.load %arg1 : !fir.ref<i64>
45+
! CHECK: %[[VAL_2:.*]] = fir.shape_shift %{{.*}}, %{{.*}}, %{{.*}}, %[[VAL_0]] : (index, index, index, index) -> !fir.shapeshift<2>
46+
! CHECK: %[[VAL_3:.*]] = fir.embox %arg0(%[[VAL_2]]) : (!fir.ref<!fir.array<9x?xf32>>, !fir.shapeshift<2>) -> !fir.box<!fir.array<9x?xf32>>
47+
! CHECK: %[[VAL_4:.*]] = fir.address_of(
48+
! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_3]] : (!fir.box<!fir.array<9x?xf32>>) -> !fir.box<none>
49+
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_1]] : (i64) -> i32
50+
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_4]]
51+
! CHECK: %[[VAL_8:.*]] = fir.call @_FortranALboundDim(%[[VAL_5]], %[[VAL_6]], %[[VAL_7]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
52+
! CHECK: fir.store %[[VAL_8]] to %arg2 : !fir.ref<i64>
53+
res = lbound(a, dim, 8)
54+
end subroutine
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
! RUN: bbc -emit-fir %s -o - | FileCheck %s
2+
! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s
3+
4+
! CHECK-LABEL: func @_QPubound_test(
5+
subroutine ubound_test(a, dim, res)
6+
real, dimension(:, :) :: a
7+
integer(8):: dim, res
8+
! CHECK: %[[VAL_0:.*]] = fir.load
9+
! CHECK: %[[VAL_1:.*]] = fir.address_of(
10+
! CHECK: %[[VAL_2:.*]] = fir.convert
11+
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_0]] : (i64) -> i32
12+
! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_1]]
13+
! CHECK: %[[VAL_5:.*]] = fir.call @_FortranASizeDim(%[[VAL_2]], %[[VAL_3]], %[[VAL_4]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
14+
! CHECK: %[[VAL_6:.*]] = fir.address_of(
15+
! CHECK: %[[VAL_7:.*]] = fir.convert %{{.*}} : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<none>
16+
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_0]] : (i64) -> i32
17+
! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_6]]
18+
! CHECK: %[[VAL_10:.*]] = fir.call @_FortranALboundDim(%[[VAL_7]], %[[VAL_8]], %[[VAL_9]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
19+
! CHECK: %[[VAL_11:.*]] = arith.subi %[[VAL_10]], %c1_i64 : i64
20+
! CHECK: %[[VAL_12:.*]] = arith.addi %[[VAL_11]], %[[VAL_5]] : i64
21+
22+
! CHECK: fir.store %[[VAL_12]] to %{{.*}} : !fir.ref<i64>
23+
res = ubound(a, dim, 8)
24+
end subroutine
25+
26+
! CHECK-LABEL: func @_QPubound_test_2(
27+
subroutine ubound_test_2(a, dim, res)
28+
real, dimension(2:, 3:) :: a
29+
integer(8):: dim, res
30+
! CHECK: %[[VAL_0:.*]] = fir.load %{{.*}} : !fir.ref<i64>
31+
! CHECK: %[[VAL_1:.*]] = fir.address_of(
32+
! CHECK: %[[VAL_2:.*]] = fir.convert %{{.*}} : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<none>
33+
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_0]] : (i64) -> i32
34+
! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_1]]
35+
! CHECK: %[[VAL_5:.*]] = fir.call @_FortranASizeDim(%[[VAL_2]], %[[VAL_3]], %[[VAL_4]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
36+
! CHECK: %[[VAL_6:.*]] = fir.address_of(
37+
! CHECK: %[[VAL_7:.*]] = fir.convert %{{.*}} : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<none>
38+
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_0]] : (i64) -> i32
39+
! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_6]]
40+
! CHECK: %[[VAL_10:.*]] = fir.call @_FortranALboundDim(%[[VAL_7]], %[[VAL_8]], %[[VAL_9]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
41+
! CHECK: %[[VAL_11:.*]] = arith.subi %[[VAL_10]], %{{.*}} : i64
42+
! CHECK: %[[VAL_12:.*]] = arith.addi %[[VAL_11]], %[[VAL_5]] : i64
43+
! CHECK: fir.store %[[VAL_12]] to %{{.*}} : !fir.ref<i64>
44+
res = ubound(a, dim, 8)
45+
end subroutine
46+
47+
! CHECK-LABEL: func @_QPubound_test_3(
48+
subroutine ubound_test_3(a, dim, res)
49+
real, dimension(10, 20, *) :: a
50+
integer(8):: dim, res
51+
! CHECK: %[[VAL_0:.*]] = fir.undefined index
52+
! CHECK: %[[VAL_1:.*]] = fir.shape %{{.*}}, %{{.*}}, %[[VAL_0]] : (index, index, index) -> !fir.shape<3>
53+
! CHECK: %[[VAL_2:.*]] = fir.embox %{{.*}}(%[[VAL_1]]) : (!fir.ref<!fir.array<10x20x?xf32>>, !fir.shape<3>) -> !fir.box<!fir.array<10x20x?xf32>>
54+
! CHECK: %[[VAL_3:.*]] = fir.load %{{.*}} : !fir.ref<i64>
55+
! CHECK: %[[VAL_4:.*]] = fir.address_of(
56+
! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_2]] : (!fir.box<!fir.array<10x20x?xf32>>) -> !fir.box<none>
57+
58+
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_3]] : (i64) -> i32
59+
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_4]]
60+
! CHECK: %[[VAL_8:.*]] = fir.call @_FortranASizeDim(%[[VAL_5]], %[[VAL_6]], %[[VAL_7]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
61+
! CHECK: %[[VAL_9:.*]] = fir.rebox %[[VAL_2]] : (!fir.box<!fir.array<10x20x?xf32>>) -> !fir.box<!fir.array<10x20x?xf32>>
62+
! CHECK: %[[VAL_10:.*]] = fir.address_of(
63+
! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_9]] : (!fir.box<!fir.array<10x20x?xf32>>) -> !fir.box<none>
64+
! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_3]]
65+
! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_10]]
66+
! CHECK: %[[VAL_14:.*]] = fir.call @_FortranALboundDim(%[[VAL_11]], %[[VAL_12]], %[[VAL_13]], %{{.*}}) : (!fir.box<none>, i32, !fir.ref<i8>, i32) -> i64
67+
! CHECK: %[[VAL_15:.*]] = arith.subi %[[VAL_14]], %{{.*}} : i64
68+
! CHECK: %[[VAL_16:.*]] = arith.addi %[[VAL_15]], %[[VAL_8]] : i64
69+
! CHECK: fir.store %[[VAL_16]] to %{{.*}} : !fir.ref<i64>
70+
res = ubound(a, dim, 8)
71+
end subroutine

0 commit comments

Comments
 (0)