Skip to content

Commit ba0550d

Browse files
committed
Remove overly conservative TODO message. Vector subscripts with slice
operations were being lowered correctly. Vector subscripts with sliced vector subscripts (recursively), crash the parser and never get to lowering. (They are accepted by ifx, ifort, gfortran, etc.)
1 parent 3bfb33b commit ba0550d

File tree

2 files changed

+108
-2
lines changed

2 files changed

+108
-2
lines changed

flang/lib/Lower/ConvertExpr.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5099,8 +5099,6 @@ class ArrayExprLowering {
50995099
"fir.box cannot be created with vector subscripts");
51005100
if (Fortran::evaluate::HasVectorSubscript(toEvExpr(e)))
51015101
TODO(loc, "vector subscript of vector subscript");
5102-
if (hasEvArrayRef(e))
5103-
TODO(loc, "vector subscript with slice subscript");
51045102
auto base = x.base();
51055103
auto exv = genArrayBase(base);
51065104
auto arrExpr = ignoreEvConvert(e);
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
! RUN: bbc --emit-fir %s -o - | FileCheck %s
2+
3+
! CHECK-LABEL: func @_QPtest1a(
4+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10xi32>>,
5+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi32>>,
6+
! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<20xi32>>) {
7+
! CHECK: %[[VAL_3:.*]] = constant 10 : index
8+
! CHECK: %[[VAL_4:.*]] = constant 10 : index
9+
! CHECK: %[[VAL_5:.*]] = constant 20 : index
10+
! CHECK: %[[VAL_6:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
11+
! CHECK: %[[VAL_7:.*]] = fir.array_load %[[VAL_0]](%[[VAL_6]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
12+
! CHECK: %[[VAL_8:.*]] = constant 10 : i64
13+
! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
14+
! CHECK: %[[VAL_10:.*]] = constant 1 : index
15+
! CHECK: %[[VAL_11:.*]] = constant 1 : i64
16+
! CHECK: %[[VAL_12:.*]] = constant 20 : i64
17+
! CHECK: %[[VAL_13:.*]] = constant 2 : i64
18+
! CHECK: %[[VAL_14:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>
19+
! CHECK: %[[VAL_15:.*]] = fir.slice %[[VAL_11]], %[[VAL_12]], %[[VAL_13]] : (i64, i64, i64) -> !fir.slice<1>
20+
! CHECK: %[[VAL_16:.*]] = fir.array_load %[[VAL_2]](%[[VAL_14]]) {{\[}}%[[VAL_15]]] : (!fir.ref<!fir.array<20xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<20xi32>
21+
! CHECK: %[[VAL_17:.*]] = constant 0 : index
22+
! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_11]] : (i64) -> index
23+
! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_12]] : (i64) -> index
24+
! CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_13]] : (i64) -> index
25+
! CHECK: %[[VAL_21:.*]] = subi %[[VAL_19]], %[[VAL_18]] : index
26+
! CHECK: %[[VAL_22:.*]] = addi %[[VAL_21]], %[[VAL_20]] : index
27+
! CHECK: %[[VAL_23:.*]] = divi_signed %[[VAL_22]], %[[VAL_20]] : index
28+
! CHECK: %[[VAL_24:.*]] = cmpi sgt, %[[VAL_23]], %[[VAL_17]] : index
29+
! CHECK: %[[VAL_25:.*]] = select %[[VAL_24]], %[[VAL_23]], %[[VAL_17]] : index
30+
! CHECK: %[[VAL_26:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
31+
! CHECK: %[[VAL_27:.*]] = fir.slice %[[VAL_10]], %[[VAL_25]], %[[VAL_10]] : (index, index, index) -> !fir.slice<1>
32+
! CHECK: %[[VAL_28:.*]] = fir.array_load %[[VAL_1]](%[[VAL_26]]) {{\[}}%[[VAL_27]]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<10xi32>
33+
! CHECK: %[[VAL_29:.*]] = constant 1 : index
34+
! CHECK: %[[VAL_30:.*]] = constant 0 : index
35+
! CHECK: %[[VAL_31:.*]] = subi %[[VAL_9]], %[[VAL_29]] : index
36+
! CHECK: %[[VAL_32:.*]] = fir.do_loop %[[VAL_33:.*]] = %[[VAL_30]] to %[[VAL_31]] step %[[VAL_29]] unordered iter_args(%[[VAL_34:.*]] = %[[VAL_7]]) -> (!fir.array<10xi32>) {
37+
! CHECK: %[[VAL_35:.*]] = fir.array_fetch %[[VAL_16]], %[[VAL_33]] : (!fir.array<20xi32>, index) -> i32
38+
! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_35]] : (i32) -> index
39+
! CHECK: %[[VAL_37:.*]] = subi %[[VAL_36]], %[[VAL_10]] : index
40+
! CHECK: %[[VAL_38:.*]] = fir.array_fetch %[[VAL_28]], %[[VAL_37]] : (!fir.array<10xi32>, index) -> i32
41+
! CHECK: %[[VAL_39:.*]] = fir.array_update %[[VAL_34]], %[[VAL_38]], %[[VAL_33]] : (!fir.array<10xi32>, i32, index) -> !fir.array<10xi32>
42+
! CHECK: fir.result %[[VAL_39]] : !fir.array<10xi32>
43+
! CHECK: }
44+
! CHECK: fir.array_merge_store %[[VAL_7]], %[[VAL_40:.*]] to %[[VAL_0]] : !fir.array<10xi32>, !fir.array<10xi32>, !fir.ref<!fir.array<10xi32>>
45+
! CHECK: return
46+
! CHECK: }
47+
subroutine test1a(a,b,c)
48+
integer :: a(10), b(10), c(20)
49+
50+
a = b(c(1:20:2))
51+
end subroutine test1a
52+
53+
! CHECK-LABEL: func @_QPtest1b(
54+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10xi32>>,
55+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi32>>,
56+
! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<20xi32>>) {
57+
! CHECK: %[[VAL_3:.*]] = constant 10 : index
58+
! CHECK: %[[VAL_4:.*]] = constant 10 : index
59+
! CHECK: %[[VAL_5:.*]] = constant 20 : index
60+
! CHECK: %[[VAL_6:.*]] = constant 1 : index
61+
! CHECK: %[[VAL_7:.*]] = constant 1 : i64
62+
! CHECK: %[[VAL_8:.*]] = constant 20 : i64
63+
! CHECK: %[[VAL_9:.*]] = constant 2 : i64
64+
! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>
65+
! CHECK: %[[VAL_11:.*]] = fir.slice %[[VAL_7]], %[[VAL_8]], %[[VAL_9]] : (i64, i64, i64) -> !fir.slice<1>
66+
! CHECK: %[[VAL_12:.*]] = fir.array_load %[[VAL_2]](%[[VAL_10]]) {{\[}}%[[VAL_11]]] : (!fir.ref<!fir.array<20xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<20xi32>
67+
! CHECK: %[[VAL_13:.*]] = constant 0 : index
68+
! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_7]] : (i64) -> index
69+
! CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
70+
! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_9]] : (i64) -> index
71+
! CHECK: %[[VAL_17:.*]] = subi %[[VAL_15]], %[[VAL_14]] : index
72+
! CHECK: %[[VAL_18:.*]] = addi %[[VAL_17]], %[[VAL_16]] : index
73+
! CHECK: %[[VAL_19:.*]] = divi_signed %[[VAL_18]], %[[VAL_16]] : index
74+
! CHECK: %[[VAL_20:.*]] = cmpi sgt, %[[VAL_19]], %[[VAL_13]] : index
75+
! CHECK: %[[VAL_21:.*]] = select %[[VAL_20]], %[[VAL_19]], %[[VAL_13]] : index
76+
! CHECK: %[[VAL_22:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
77+
! CHECK: %[[VAL_23:.*]] = fir.slice %[[VAL_6]], %[[VAL_21]], %[[VAL_6]] : (index, index, index) -> !fir.slice<1>
78+
! CHECK: %[[VAL_24:.*]] = fir.array_load %[[VAL_1]](%[[VAL_22]]) {{\[}}%[[VAL_23]]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<10xi32>
79+
! CHECK: %[[VAL_25:.*]] = constant 10 : i64
80+
! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i64) -> index
81+
! CHECK: %[[VAL_27:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
82+
! CHECK: %[[VAL_28:.*]] = fir.array_load %[[VAL_0]](%[[VAL_27]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
83+
! CHECK: %[[VAL_29:.*]] = constant 1 : index
84+
! CHECK: %[[VAL_30:.*]] = constant 0 : index
85+
! CHECK: %[[VAL_31:.*]] = subi %[[VAL_26]], %[[VAL_29]] : index
86+
! CHECK: %[[VAL_32:.*]] = fir.do_loop %[[VAL_33:.*]] = %[[VAL_30]] to %[[VAL_31]] step %[[VAL_29]] unordered iter_args(%[[VAL_34:.*]] = %[[VAL_24]]) -> (!fir.array<10xi32>) {
87+
! CHECK: %[[VAL_35:.*]] = fir.array_fetch %[[VAL_28]], %[[VAL_33]] : (!fir.array<10xi32>, index) -> i32
88+
! CHECK: %[[VAL_36:.*]] = fir.array_fetch %[[VAL_12]], %[[VAL_33]] : (!fir.array<20xi32>, index) -> i32
89+
! CHECK: %[[VAL_37:.*]] = fir.convert %[[VAL_36]] : (i32) -> index
90+
! CHECK: %[[VAL_38:.*]] = subi %[[VAL_37]], %[[VAL_6]] : index
91+
! CHECK: %[[VAL_39:.*]] = fir.array_update %[[VAL_34]], %[[VAL_35]], %[[VAL_38]] : (!fir.array<10xi32>, i32, index) -> !fir.array<10xi32>
92+
! CHECK: fir.result %[[VAL_39]] : !fir.array<10xi32>
93+
! CHECK: }
94+
! CHECK: fir.array_merge_store %[[VAL_24]], %[[VAL_40:.*]] to %[[VAL_1]]{{\[}}%[[VAL_23]]] : !fir.array<10xi32>, !fir.array<10xi32>, !fir.ref<!fir.array<10xi32>>, !fir.slice<1>
95+
! CHECK: return
96+
! CHECK: }
97+
subroutine test1b(a,b,c)
98+
integer :: a(10), b(10), c(20)
99+
100+
b(c(1:20:2)) = a
101+
end subroutine test1b
102+
103+
subroutine test1c(a,b,c,d)
104+
integer :: a(10), b(10), d(10), c(20)
105+
106+
! flang: parser FAIL (final position)
107+
!a = b(d(c(1:20:2))
108+
end subroutine test1c

0 commit comments

Comments
 (0)