xref: /llvm-project/flang/test/Lower/HLFIR/array-ctor-index.f90 (revision 1710c8cf0f8def4984893e9dd646579de5528d95)
1! Check that the implied-do index value is converted to proper type.
2! RUN: bbc -emit-hlfir -o - %s | FileCheck %s
3
4function test1(k)
5  integer*1 :: k
6  integer*1 :: test1(4)
7  test1 = ([(i*k, integer(8)::i=1,4)])
8end function test1
9! CHECK-LABEL:   func.func @_QPtest1(
10! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<i8> {fir.bindc_name = "k"}) -> !fir.array<4xi8> {
11! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} {uniq_name = "_QFtest1Ek"} : (!fir.ref<i8>, !fir.dscope) -> (!fir.ref<i8>, !fir.ref<i8>)
12! CHECK:           %[[VAL_2:.*]] = arith.constant 4 : index
13! CHECK:           %[[VAL_3:.*]] = fir.alloca !fir.array<4xi8> {bindc_name = "test1", uniq_name = "_QFtest1Etest1"}
14! CHECK:           %[[VAL_4:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>
15! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3]](%[[VAL_4]]) {uniq_name = "_QFtest1Etest1"} : (!fir.ref<!fir.array<4xi8>>, !fir.shape<1>) -> (!fir.ref<!fir.array<4xi8>>, !fir.ref<!fir.array<4xi8>>)
16! CHECK:           %[[VAL_6:.*]] = arith.constant 4 : index
17! CHECK:           %[[VAL_7:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
18! CHECK:           %[[VAL_8:.*]] = arith.constant 1 : i64
19! CHECK:           %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
20! CHECK:           %[[VAL_10:.*]] = arith.constant 1 : i64
21! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
22! CHECK:           %[[VAL_12:.*]] = arith.constant 1 : index
23! CHECK:           %[[VAL_13:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi64> {
24! CHECK:           ^bb0(%[[VAL_14:.*]]: index):
25! CHECK:             %[[VAL_15:.*]] = arith.subi %[[VAL_14]], %[[VAL_12]] : index
26! CHECK:             %[[VAL_16:.*]] = arith.muli %[[VAL_15]], %[[VAL_11]] : index
27! CHECK:             %[[VAL_17:.*]] = arith.addi %[[VAL_9]], %[[VAL_16]] : index
28! CHECK:             %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (index) -> i64
29! CHECK:             %[[VAL_19:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i8>
30! CHECK:             %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i8) -> i64
31! CHECK:             %[[VAL_21:.*]] = arith.muli %[[VAL_18]], %[[VAL_20]] : i64
32! CHECK:             hlfir.yield_element %[[VAL_21]] : i64
33! CHECK:           }
34! CHECK:           %[[VAL_22:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi64> {
35! CHECK:           ^bb0(%[[VAL_23:.*]]: index):
36! CHECK:             %[[VAL_24:.*]] = hlfir.apply %[[VAL_25:.*]], %[[VAL_23]] : (!hlfir.expr<4xi64>, index) -> i64
37! CHECK:             %[[VAL_26:.*]] = hlfir.no_reassoc %[[VAL_24]] : i64
38! CHECK:             hlfir.yield_element %[[VAL_26]] : i64
39! CHECK:           }
40! CHECK:           %[[VAL_27:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi8> {
41! CHECK:           ^bb0(%[[VAL_28:.*]]: index):
42! CHECK:             %[[VAL_29:.*]] = hlfir.apply %[[VAL_30:.*]], %[[VAL_28]] : (!hlfir.expr<4xi64>, index) -> i64
43! CHECK:             %[[VAL_31:.*]] = fir.convert %[[VAL_29]] : (i64) -> i8
44! CHECK:             hlfir.yield_element %[[VAL_31]] : i8
45! CHECK:           }
46! CHECK:           hlfir.assign %[[VAL_32:.*]] to %[[VAL_5]]#0 : !hlfir.expr<4xi8>, !fir.ref<!fir.array<4xi8>>
47! CHECK:           hlfir.destroy %[[VAL_32]] : !hlfir.expr<4xi8>
48! CHECK:           hlfir.destroy %[[VAL_33:.*]] : !hlfir.expr<4xi64>
49! CHECK:           hlfir.destroy %[[VAL_34:.*]] : !hlfir.expr<4xi64>
50! CHECK:           %[[VAL_35:.*]] = fir.load %[[VAL_5]]#1 : !fir.ref<!fir.array<4xi8>>
51! CHECK:           return %[[VAL_35]] : !fir.array<4xi8>
52! CHECK:         }
53
54function test2(k)
55  integer*2 :: k
56  integer*2 :: test2(4)
57  test2 = ([(i*k, integer(8)::i=1,4)])
58end function test2
59! CHECK-LABEL:   func.func @_QPtest2(
60! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<i16> {fir.bindc_name = "k"}) -> !fir.array<4xi16> {
61! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} {uniq_name = "_QFtest2Ek"} : (!fir.ref<i16>, !fir.dscope) -> (!fir.ref<i16>, !fir.ref<i16>)
62! CHECK:           %[[VAL_2:.*]] = arith.constant 4 : index
63! CHECK:           %[[VAL_3:.*]] = fir.alloca !fir.array<4xi16> {bindc_name = "test2", uniq_name = "_QFtest2Etest2"}
64! CHECK:           %[[VAL_4:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>
65! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3]](%[[VAL_4]]) {uniq_name = "_QFtest2Etest2"} : (!fir.ref<!fir.array<4xi16>>, !fir.shape<1>) -> (!fir.ref<!fir.array<4xi16>>, !fir.ref<!fir.array<4xi16>>)
66! CHECK:           %[[VAL_6:.*]] = arith.constant 4 : index
67! CHECK:           %[[VAL_7:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
68! CHECK:           %[[VAL_8:.*]] = arith.constant 1 : i64
69! CHECK:           %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
70! CHECK:           %[[VAL_10:.*]] = arith.constant 1 : i64
71! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
72! CHECK:           %[[VAL_12:.*]] = arith.constant 1 : index
73! CHECK:           %[[VAL_13:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi64> {
74! CHECK:           ^bb0(%[[VAL_14:.*]]: index):
75! CHECK:             %[[VAL_15:.*]] = arith.subi %[[VAL_14]], %[[VAL_12]] : index
76! CHECK:             %[[VAL_16:.*]] = arith.muli %[[VAL_15]], %[[VAL_11]] : index
77! CHECK:             %[[VAL_17:.*]] = arith.addi %[[VAL_9]], %[[VAL_16]] : index
78! CHECK:             %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (index) -> i64
79! CHECK:             %[[VAL_19:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i16>
80! CHECK:             %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i16) -> i64
81! CHECK:             %[[VAL_21:.*]] = arith.muli %[[VAL_18]], %[[VAL_20]] : i64
82! CHECK:             hlfir.yield_element %[[VAL_21]] : i64
83! CHECK:           }
84! CHECK:           %[[VAL_22:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi64> {
85! CHECK:           ^bb0(%[[VAL_23:.*]]: index):
86! CHECK:             %[[VAL_24:.*]] = hlfir.apply %[[VAL_25:.*]], %[[VAL_23]] : (!hlfir.expr<4xi64>, index) -> i64
87! CHECK:             %[[VAL_26:.*]] = hlfir.no_reassoc %[[VAL_24]] : i64
88! CHECK:             hlfir.yield_element %[[VAL_26]] : i64
89! CHECK:           }
90! CHECK:           %[[VAL_27:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi16> {
91! CHECK:           ^bb0(%[[VAL_28:.*]]: index):
92! CHECK:             %[[VAL_29:.*]] = hlfir.apply %[[VAL_30:.*]], %[[VAL_28]] : (!hlfir.expr<4xi64>, index) -> i64
93! CHECK:             %[[VAL_31:.*]] = fir.convert %[[VAL_29]] : (i64) -> i16
94! CHECK:             hlfir.yield_element %[[VAL_31]] : i16
95! CHECK:           }
96! CHECK:           hlfir.assign %[[VAL_32:.*]] to %[[VAL_5]]#0 : !hlfir.expr<4xi16>, !fir.ref<!fir.array<4xi16>>
97! CHECK:           hlfir.destroy %[[VAL_32]] : !hlfir.expr<4xi16>
98! CHECK:           hlfir.destroy %[[VAL_33:.*]] : !hlfir.expr<4xi64>
99! CHECK:           hlfir.destroy %[[VAL_34:.*]] : !hlfir.expr<4xi64>
100! CHECK:           %[[VAL_35:.*]] = fir.load %[[VAL_5]]#1 : !fir.ref<!fir.array<4xi16>>
101! CHECK:           return %[[VAL_35]] : !fir.array<4xi16>
102! CHECK:         }
103
104function test3(k)
105  integer*4 :: k
106  integer*4 :: test3(4)
107  test3 = ([(i*k, integer(8)::i=1,4)])
108end function test3
109! CHECK-LABEL:   func.func @_QPtest3(
110! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "k"}) -> !fir.array<4xi32> {
111! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} {uniq_name = "_QFtest3Ek"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
112! CHECK:           %[[VAL_2:.*]] = arith.constant 4 : index
113! CHECK:           %[[VAL_3:.*]] = fir.alloca !fir.array<4xi32> {bindc_name = "test3", uniq_name = "_QFtest3Etest3"}
114! CHECK:           %[[VAL_4:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>
115! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3]](%[[VAL_4]]) {uniq_name = "_QFtest3Etest3"} : (!fir.ref<!fir.array<4xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<4xi32>>, !fir.ref<!fir.array<4xi32>>)
116! CHECK:           %[[VAL_6:.*]] = arith.constant 4 : index
117! CHECK:           %[[VAL_7:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
118! CHECK:           %[[VAL_8:.*]] = arith.constant 1 : i64
119! CHECK:           %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
120! CHECK:           %[[VAL_10:.*]] = arith.constant 1 : i64
121! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
122! CHECK:           %[[VAL_12:.*]] = arith.constant 1 : index
123! CHECK:           %[[VAL_13:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi64> {
124! CHECK:           ^bb0(%[[VAL_14:.*]]: index):
125! CHECK:             %[[VAL_15:.*]] = arith.subi %[[VAL_14]], %[[VAL_12]] : index
126! CHECK:             %[[VAL_16:.*]] = arith.muli %[[VAL_15]], %[[VAL_11]] : index
127! CHECK:             %[[VAL_17:.*]] = arith.addi %[[VAL_9]], %[[VAL_16]] : index
128! CHECK:             %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (index) -> i64
129! CHECK:             %[[VAL_19:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i32>
130! CHECK:             %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i64
131! CHECK:             %[[VAL_21:.*]] = arith.muli %[[VAL_18]], %[[VAL_20]] : i64
132! CHECK:             hlfir.yield_element %[[VAL_21]] : i64
133! CHECK:           }
134! CHECK:           %[[VAL_22:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi64> {
135! CHECK:           ^bb0(%[[VAL_23:.*]]: index):
136! CHECK:             %[[VAL_24:.*]] = hlfir.apply %[[VAL_25:.*]], %[[VAL_23]] : (!hlfir.expr<4xi64>, index) -> i64
137! CHECK:             %[[VAL_26:.*]] = hlfir.no_reassoc %[[VAL_24]] : i64
138! CHECK:             hlfir.yield_element %[[VAL_26]] : i64
139! CHECK:           }
140! CHECK:           %[[VAL_27:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi32> {
141! CHECK:           ^bb0(%[[VAL_28:.*]]: index):
142! CHECK:             %[[VAL_29:.*]] = hlfir.apply %[[VAL_30:.*]], %[[VAL_28]] : (!hlfir.expr<4xi64>, index) -> i64
143! CHECK:             %[[VAL_31:.*]] = fir.convert %[[VAL_29]] : (i64) -> i32
144! CHECK:             hlfir.yield_element %[[VAL_31]] : i32
145! CHECK:           }
146! CHECK:           hlfir.assign %[[VAL_32:.*]] to %[[VAL_5]]#0 : !hlfir.expr<4xi32>, !fir.ref<!fir.array<4xi32>>
147! CHECK:           hlfir.destroy %[[VAL_32]] : !hlfir.expr<4xi32>
148! CHECK:           hlfir.destroy %[[VAL_33:.*]] : !hlfir.expr<4xi64>
149! CHECK:           hlfir.destroy %[[VAL_34:.*]] : !hlfir.expr<4xi64>
150! CHECK:           %[[VAL_35:.*]] = fir.load %[[VAL_5]]#1 : !fir.ref<!fir.array<4xi32>>
151! CHECK:           return %[[VAL_35]] : !fir.array<4xi32>
152! CHECK:         }
153
154function test4(k)
155  integer*8 :: k
156  integer*8 :: test4(4)
157  test4 = ([(i*k, integer(8)::i=1,4)])
158end function test4
159! CHECK-LABEL:   func.func @_QPtest4(
160! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<i64> {fir.bindc_name = "k"}) -> !fir.array<4xi64> {
161! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} {uniq_name = "_QFtest4Ek"} : (!fir.ref<i64>, !fir.dscope) -> (!fir.ref<i64>, !fir.ref<i64>)
162! CHECK:           %[[VAL_2:.*]] = arith.constant 4 : index
163! CHECK:           %[[VAL_3:.*]] = fir.alloca !fir.array<4xi64> {bindc_name = "test4", uniq_name = "_QFtest4Etest4"}
164! CHECK:           %[[VAL_4:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>
165! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3]](%[[VAL_4]]) {uniq_name = "_QFtest4Etest4"} : (!fir.ref<!fir.array<4xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<4xi64>>, !fir.ref<!fir.array<4xi64>>)
166! CHECK:           %[[VAL_6:.*]] = arith.constant 4 : index
167! CHECK:           %[[VAL_7:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
168! CHECK:           %[[VAL_8:.*]] = arith.constant 1 : i64
169! CHECK:           %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
170! CHECK:           %[[VAL_10:.*]] = arith.constant 1 : i64
171! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
172! CHECK:           %[[VAL_12:.*]] = arith.constant 1 : index
173! CHECK:           %[[VAL_13:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi64> {
174! CHECK:           ^bb0(%[[VAL_14:.*]]: index):
175! CHECK:             %[[VAL_15:.*]] = arith.subi %[[VAL_14]], %[[VAL_12]] : index
176! CHECK:             %[[VAL_16:.*]] = arith.muli %[[VAL_15]], %[[VAL_11]] : index
177! CHECK:             %[[VAL_17:.*]] = arith.addi %[[VAL_9]], %[[VAL_16]] : index
178! CHECK:             %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (index) -> i64
179! CHECK:             %[[VAL_19:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i64>
180! CHECK:             %[[VAL_20:.*]] = arith.muli %[[VAL_18]], %[[VAL_19]] : i64
181! CHECK:             hlfir.yield_element %[[VAL_20]] : i64
182! CHECK:           }
183! CHECK:           %[[VAL_21:.*]] = hlfir.elemental %[[VAL_7]] unordered : (!fir.shape<1>) -> !hlfir.expr<4xi64> {
184! CHECK:           ^bb0(%[[VAL_22:.*]]: index):
185! CHECK:             %[[VAL_23:.*]] = hlfir.apply %[[VAL_24:.*]], %[[VAL_22]] : (!hlfir.expr<4xi64>, index) -> i64
186! CHECK:             %[[VAL_25:.*]] = hlfir.no_reassoc %[[VAL_23]] : i64
187! CHECK:             hlfir.yield_element %[[VAL_25]] : i64
188! CHECK:           }
189! CHECK:           hlfir.assign %[[VAL_26:.*]] to %[[VAL_5]]#0 : !hlfir.expr<4xi64>, !fir.ref<!fir.array<4xi64>>
190! CHECK:           hlfir.destroy %[[VAL_26]] : !hlfir.expr<4xi64>
191! CHECK:           hlfir.destroy %[[VAL_27:.*]] : !hlfir.expr<4xi64>
192! CHECK:           %[[VAL_28:.*]] = fir.load %[[VAL_5]]#1 : !fir.ref<!fir.array<4xi64>>
193! CHECK:           return %[[VAL_28]] : !fir.array<4xi64>
194! CHECK:         }
195