xref: /llvm-project/flang/test/Lower/forall/forall-where.f90 (revision 12ba74e181bd6641b532e271f3bfabf53066b1c0)
1! Test forall lowering
2
3! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
4
5!*** Test a FORALL construct with a nested WHERE construct.
6!    This has both an explicit and implicit iteration space. The WHERE construct
7!    makes the assignments conditional and the where mask evaluation must happen
8!    prior to evaluating the array assignment statement.
9subroutine test_nested_forall_where(a,b)
10  type t
11     real data(100)
12  end type t
13  type(t) :: a(:,:), b(:,:)
14  forall (i=1:ubound(a,1), j=1:ubound(a,2))
15     where (b(j,i)%data > 0.0)
16        a(i,j)%data = b(j,i)%data / 3.14
17     elsewhere
18        a(i,j)%data = -b(j,i)%data
19     end where
20  end forall
21end subroutine test_nested_forall_where
22
23! CHECK-LABEL: func @_QPtest_nested_forall_where(
24! CHECK-SAME:    %[[VAL_0:.*]]: !fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>{{.*}}, %[[VAL_1:.*]]: !fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>{{.*}}) {
25! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
26! CHECK:         %[[VAL_3:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
27! CHECK:         %[[VAL_4:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
28! CHECK:         %[[VAL_5:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
29! CHECK:         %[[VAL_6:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
30! CHECK:         %[[VAL_7:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
31! CHECK:         %[[VAL_8:.*]] = fir.alloca tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>
32! CHECK:         %[[VAL_9:.*]] = arith.constant 0 : i32
33! CHECK:         %[[VAL_10:.*]] = arith.constant 0 : i64
34! CHECK:         %[[VAL_11:.*]] = fir.coordinate_of %[[VAL_8]], %[[VAL_9]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<i64>
35! CHECK:         fir.store %[[VAL_10]] to %[[VAL_11]] : !fir.ref<i64>
36! CHECK:         %[[VAL_12:.*]] = arith.constant 1 : i32
37! CHECK:         %[[VAL_13:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi8>>
38! CHECK:         %[[VAL_14:.*]] = fir.coordinate_of %[[VAL_8]], %[[VAL_12]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
39! CHECK:         fir.store %[[VAL_13]] to %[[VAL_14]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
40! CHECK:         %[[VAL_15:.*]] = arith.constant 2 : i32
41! CHECK:         %[[VAL_16:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi64>>
42! CHECK:         %[[VAL_17:.*]] = fir.coordinate_of %[[VAL_8]], %[[VAL_15]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi64>>>
43! CHECK:         fir.store %[[VAL_16]] to %[[VAL_17]] : !fir.ref<!fir.heap<!fir.array<?xi64>>>
44! CHECK:         %[[VAL_18:.*]] = arith.constant 1 : i32
45! CHECK:         %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> index
46! CHECK:         %[[VAL_20:.*]] = arith.constant 0 : index
47! CHECK:         %[[VAL_21:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_20]] : (!fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>, index) -> (index, index, index)
48! CHECK:         %[[VAL_22:.*]] = fir.convert %[[VAL_21]]#1 : (index) -> i64
49! CHECK:         %[[VAL_23:.*]] = arith.constant 1 : index
50! CHECK:         %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (index) -> i64
51! CHECK:         %[[VAL_25:.*]] = arith.addi %[[VAL_22]], %[[VAL_24]] : i64
52! CHECK:         %[[VAL_26:.*]] = arith.constant 1 : i64
53! CHECK:         %[[VAL_27:.*]] = arith.subi %[[VAL_25]], %[[VAL_26]] : i64
54! CHECK:         %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> i32
55! CHECK:         %[[VAL_29:.*]] = fir.convert %[[VAL_28]] : (i32) -> index
56! CHECK:         %[[VAL_30:.*]] = arith.constant 1 : index
57! CHECK:         %[[VAL_31:.*]] = arith.constant 1 : i32
58! CHECK:         %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i32) -> index
59! CHECK:         %[[VAL_33:.*]] = arith.constant 1 : index
60! CHECK:         %[[VAL_34:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_33]] : (!fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>, index) -> (index, index, index)
61! CHECK:         %[[VAL_35:.*]] = fir.convert %[[VAL_34]]#1 : (index) -> i64
62! CHECK:         %[[VAL_36:.*]] = arith.constant 1 : index
63! CHECK:         %[[VAL_37:.*]] = fir.convert %[[VAL_36]] : (index) -> i64
64! CHECK:         %[[VAL_38:.*]] = arith.addi %[[VAL_35]], %[[VAL_37]] : i64
65! CHECK:         %[[VAL_39:.*]] = arith.constant 1 : i64
66! CHECK:         %[[VAL_40:.*]] = arith.subi %[[VAL_38]], %[[VAL_39]] : i64
67! CHECK:         %[[VAL_41:.*]] = fir.convert %[[VAL_40]] : (i64) -> i32
68! CHECK:         %[[VAL_42:.*]] = fir.convert %[[VAL_41]] : (i32) -> index
69! CHECK:         %[[VAL_43:.*]] = arith.constant 1 : index
70! CHECK:         %[[VAL_44:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>) -> !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
71! CHECK:         %[[VAL_45:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>) -> !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
72! CHECK:         %[[VAL_46:.*]] = fir.do_loop %[[VAL_47:.*]] = %[[VAL_19]] to %[[VAL_29]] step %[[VAL_30]] unordered iter_args(%[[VAL_48:.*]] = %[[VAL_44]]) -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
73! CHECK:           %[[VAL_49:.*]] = fir.convert %[[VAL_47]] : (index) -> i32
74! CHECK:           fir.store %[[VAL_49]] to %[[VAL_7]] : !fir.ref<i32>
75! CHECK:           %[[VAL_50:.*]] = fir.do_loop %[[VAL_51:.*]] = %[[VAL_32]] to %[[VAL_42]] step %[[VAL_43]] unordered iter_args(%[[VAL_52:.*]] = %[[VAL_48]]) -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
76! CHECK:             %[[VAL_53:.*]] = fir.convert %[[VAL_51]] : (index) -> i32
77! CHECK:             fir.store %[[VAL_53]] to %[[VAL_6]] : !fir.ref<i32>
78! CHECK:             %[[VAL_54:.*]] = arith.constant 1 : i64
79! CHECK:             %[[VAL_55:.*]] = arith.constant 0 : i64
80! CHECK:             %[[VAL_56:.*]] = fir.convert %[[VAL_19]] : (index) -> i64
81! CHECK:             %[[VAL_57:.*]] = fir.convert %[[VAL_29]] : (index) -> i64
82! CHECK:             %[[VAL_58:.*]] = fir.convert %[[VAL_30]] : (index) -> i64
83! CHECK:             %[[VAL_59:.*]] = arith.subi %[[VAL_57]], %[[VAL_56]] : i64
84! CHECK:             %[[VAL_60:.*]] = arith.addi %[[VAL_59]], %[[VAL_58]] : i64
85! CHECK:             %[[VAL_61:.*]] = arith.divsi %[[VAL_60]], %[[VAL_58]] : i64
86! CHECK:             %[[VAL_62:.*]] = arith.cmpi sgt, %[[VAL_61]], %[[VAL_55]] : i64
87! CHECK:             %[[VAL_63:.*]] = arith.select %[[VAL_62]], %[[VAL_61]], %[[VAL_55]] : i64
88! CHECK:             %[[VAL_64:.*]] = arith.constant 0 : i64
89! CHECK:             %[[VAL_65:.*]] = fir.convert %[[VAL_32]] : (index) -> i64
90! CHECK:             %[[VAL_66:.*]] = fir.convert %[[VAL_42]] : (index) -> i64
91! CHECK:             %[[VAL_67:.*]] = fir.convert %[[VAL_43]] : (index) -> i64
92! CHECK:             %[[VAL_68:.*]] = arith.subi %[[VAL_66]], %[[VAL_65]] : i64
93! CHECK:             %[[VAL_69:.*]] = arith.addi %[[VAL_68]], %[[VAL_67]] : i64
94! CHECK:             %[[VAL_70:.*]] = arith.divsi %[[VAL_69]], %[[VAL_67]] : i64
95! CHECK:             %[[VAL_71:.*]] = arith.cmpi sgt, %[[VAL_70]], %[[VAL_64]] : i64
96! CHECK:             %[[VAL_72:.*]] = arith.select %[[VAL_71]], %[[VAL_70]], %[[VAL_64]] : i64
97! CHECK:             %[[VAL_73:.*]] = arith.constant 1 : i32
98! CHECK:             %[[VAL_74:.*]] = fir.coordinate_of %[[VAL_8]], %[[VAL_73]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
99! CHECK:             %[[VAL_75:.*]] = fir.load %[[VAL_74]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
100! CHECK:             %[[VAL_76:.*]] = fir.convert %[[VAL_75]] : (!fir.heap<!fir.array<?xi8>>) -> i64
101! CHECK:             %[[VAL_77:.*]] = arith.constant 0 : i64
102! CHECK:             %[[VAL_78:.*]] = arith.cmpi eq, %[[VAL_76]], %[[VAL_77]] : i64
103! CHECK:             fir.if %[[VAL_78]] {
104! CHECK:               %[[VAL_79:.*]] = arith.constant true
105! CHECK:               %[[VAL_80:.*]] = arith.constant 2 : i64
106! CHECK:               %[[VAL_81:.*]] = fir.allocmem !fir.array<2xi64>
107! CHECK:               %[[VAL_82:.*]] = arith.constant 0 : i32
108! CHECK:               %[[VAL_83:.*]] = fir.coordinate_of %[[VAL_81]], %[[VAL_82]] : (!fir.heap<!fir.array<2xi64>>, i32) -> !fir.ref<i64>
109! CHECK:               fir.store %[[VAL_63]] to %[[VAL_83]] : !fir.ref<i64>
110! CHECK:               %[[VAL_84:.*]] = arith.constant 1 : i32
111! CHECK:               %[[VAL_85:.*]] = fir.coordinate_of %[[VAL_81]], %[[VAL_84]] : (!fir.heap<!fir.array<2xi64>>, i32) -> !fir.ref<i64>
112! CHECK:               fir.store %[[VAL_72]] to %[[VAL_85]] : !fir.ref<i64>
113! CHECK:               %[[VAL_86:.*]] = fir.convert %[[VAL_8]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>) -> !fir.llvm_ptr<i8>
114! CHECK:               %[[VAL_87:.*]] = fir.convert %[[VAL_81]] : (!fir.heap<!fir.array<2xi64>>) -> !fir.ref<i64>
115! CHECK:               %[[VAL_88:.*]] = fir.call @_FortranARaggedArrayAllocate(%[[VAL_86]], %[[VAL_79]], %[[VAL_80]], %[[VAL_54]], %[[VAL_87]]) {{.*}}: (!fir.llvm_ptr<i8>, i1, i64, i64, !fir.ref<i64>) -> !fir.llvm_ptr<i8>
116! CHECK:             }
117! CHECK:             %[[VAL_89:.*]] = arith.subi %[[VAL_47]], %[[VAL_19]] : index
118! CHECK:             %[[VAL_90:.*]] = arith.divsi %[[VAL_89]], %[[VAL_30]] : index
119! CHECK:             %[[VAL_91:.*]] = arith.constant 1 : index
120! CHECK:             %[[VAL_92:.*]] = arith.addi %[[VAL_90]], %[[VAL_91]] : index
121! CHECK:             %[[VAL_93:.*]] = arith.subi %[[VAL_51]], %[[VAL_32]] : index
122! CHECK:             %[[VAL_94:.*]] = arith.divsi %[[VAL_93]], %[[VAL_43]] : index
123! CHECK:             %[[VAL_95:.*]] = arith.constant 1 : index
124! CHECK:             %[[VAL_96:.*]] = arith.addi %[[VAL_94]], %[[VAL_95]] : index
125! CHECK:             %[[VAL_97:.*]] = arith.constant 1 : i32
126! CHECK:             %[[VAL_98:.*]] = fir.coordinate_of %[[VAL_8]], %[[VAL_97]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
127! CHECK:             %[[VAL_99:.*]] = fir.load %[[VAL_98]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
128! CHECK:             %[[VAL_100:.*]] = fir.convert %[[VAL_99]] : (!fir.heap<!fir.array<?xi8>>) -> !fir.ref<!fir.array<?x?xtuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>>
129! CHECK:             %[[VAL_101:.*]] = fir.shape %[[VAL_63]], %[[VAL_72]] : (i64, i64) -> !fir.shape<2>
130! CHECK:             %[[VAL_102:.*]] = fir.array_coor %[[VAL_100]](%[[VAL_101]]) %[[VAL_92]], %[[VAL_96]] : (!fir.ref<!fir.array<?x?xtuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>>, !fir.shape<2>, index, index) -> !fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>
131! CHECK:             %[[VAL_103:.*]] = fir.load %[[VAL_6]] : !fir.ref<i32>
132! CHECK:             %[[VAL_104:.*]] = fir.convert %[[VAL_103]] : (i32) -> i64
133! CHECK:             %[[VAL_105:.*]] = arith.constant 1 : i64
134! CHECK:             %[[VAL_106:.*]] = arith.subi %[[VAL_104]], %[[VAL_105]] : i64
135! CHECK:             %[[VAL_107:.*]] = fir.load %[[VAL_7]] : !fir.ref<i32>
136! CHECK:             %[[VAL_108:.*]] = fir.convert %[[VAL_107]] : (i32) -> i64
137! CHECK:             %[[VAL_109:.*]] = arith.constant 1 : i64
138! CHECK:             %[[VAL_110:.*]] = arith.subi %[[VAL_108]], %[[VAL_109]] : i64
139! CHECK:             %[[VAL_111:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_106]], %[[VAL_110]] : (!fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>, i64, i64) -> !fir.ref<!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
140! CHECK:             %[[VAL_112:.*]] = fir.field_index data, !fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>
141! CHECK:             %[[VAL_113:.*]] = fir.coordinate_of %[[VAL_111]], %[[VAL_112]] : (!fir.ref<!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, !fir.field) -> !fir.ref<!fir.array<100xf32>>
142! CHECK:             %[[VAL_114:.*]] = arith.constant 100 : index
143! CHECK:             %[[VAL_115:.*]] = fir.shape %[[VAL_114]] : (index) -> !fir.shape<1>
144! CHECK:             %[[VAL_116:.*]] = fir.array_load %[[VAL_113]](%[[VAL_115]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32>
145! CHECK:             %[[VAL_117:.*]] = arith.constant 0.000000e+00 : f32
146! CHECK:             %[[VAL_118:.*]] = arith.constant 1 : i32
147! CHECK:             %[[VAL_119:.*]] = fir.coordinate_of %[[VAL_102]], %[[VAL_118]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
148! CHECK:             %[[VAL_120:.*]] = fir.load %[[VAL_119]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
149! CHECK:             %[[VAL_121:.*]] = fir.shape %[[VAL_114]] : (index) -> !fir.shape<1>
150! CHECK:             %[[VAL_122:.*]] = fir.array_load %[[VAL_120]](%[[VAL_121]]) : (!fir.heap<!fir.array<?xi8>>, !fir.shape<1>) -> !fir.array<?xi8>
151! CHECK:             %[[VAL_123:.*]] = arith.constant 1 : i64
152! CHECK:             %[[VAL_124:.*]] = arith.constant 1 : i32
153! CHECK:             %[[VAL_125:.*]] = fir.coordinate_of %[[VAL_102]], %[[VAL_124]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
154! CHECK:             %[[VAL_126:.*]] = fir.load %[[VAL_125]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
155! CHECK:             %[[VAL_127:.*]] = fir.convert %[[VAL_126]] : (!fir.heap<!fir.array<?xi8>>) -> i64
156! CHECK:             %[[VAL_128:.*]] = arith.constant 0 : i64
157! CHECK:             %[[VAL_129:.*]] = arith.cmpi eq, %[[VAL_127]], %[[VAL_128]] : i64
158! CHECK:             fir.if %[[VAL_129]] {
159! CHECK:               %[[VAL_130:.*]] = arith.constant false
160! CHECK:               %[[VAL_131:.*]] = arith.constant 1 : i64
161! CHECK:               %[[VAL_132:.*]] = fir.allocmem !fir.array<1xi64>
162! CHECK:               %[[VAL_133:.*]] = arith.constant 0 : i32
163! CHECK:               %[[VAL_134:.*]] = fir.coordinate_of %[[VAL_132]], %[[VAL_133]] : (!fir.heap<!fir.array<1xi64>>, i32) -> !fir.ref<i64>
164! CHECK:               %[[VAL_135:.*]] = fir.convert %[[VAL_114]] : (index) -> i64
165! CHECK:               fir.store %[[VAL_135]] to %[[VAL_134]] : !fir.ref<i64>
166! CHECK:               %[[VAL_136:.*]] = fir.convert %[[VAL_102]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>) -> !fir.llvm_ptr<i8>
167! CHECK:               %[[VAL_137:.*]] = fir.convert %[[VAL_132]] : (!fir.heap<!fir.array<1xi64>>) -> !fir.ref<i64>
168! CHECK:               %[[VAL_138:.*]] = fir.call @_FortranARaggedArrayAllocate(%[[VAL_136]], %[[VAL_130]], %[[VAL_131]], %[[VAL_123]], %[[VAL_137]]) {{.*}}: (!fir.llvm_ptr<i8>, i1, i64, i64, !fir.ref<i64>) -> !fir.llvm_ptr<i8>
169! CHECK:             }
170! CHECK:             %[[VAL_139:.*]] = arith.constant 1 : index
171! CHECK:             %[[VAL_140:.*]] = arith.constant 0 : index
172! CHECK:             %[[VAL_141:.*]] = arith.subi %[[VAL_114]], %[[VAL_139]] : index
173! CHECK:             %[[VAL_142:.*]] = fir.do_loop %[[VAL_143:.*]] = %[[VAL_140]] to %[[VAL_141]] step %[[VAL_139]] unordered iter_args(%[[VAL_144:.*]] = %[[VAL_122]]) -> (!fir.array<?xi8>) {
174! CHECK:               %[[VAL_145:.*]] = fir.array_fetch %[[VAL_116]], %[[VAL_143]] : (!fir.array<100xf32>, index) -> f32
175! CHECK:               %[[VAL_146:.*]] = arith.cmpf ogt, %[[VAL_145]], %[[VAL_117]] {{.*}} : f32
176! CHECK:               %[[VAL_147:.*]] = arith.constant 1 : i32
177! CHECK:               %[[VAL_148:.*]] = fir.coordinate_of %[[VAL_102]], %[[VAL_147]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
178! CHECK:               %[[VAL_149:.*]] = fir.load %[[VAL_148]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
179! CHECK:               %[[VAL_150:.*]] = fir.shape %[[VAL_114]] : (index) -> !fir.shape<1>
180! CHECK:               %[[VAL_151:.*]] = arith.constant 1 : index
181! CHECK:               %[[VAL_152:.*]] = arith.addi %[[VAL_143]], %[[VAL_151]] : index
182! CHECK:               %[[VAL_153:.*]] = fir.array_coor %[[VAL_149]](%[[VAL_150]]) %[[VAL_152]] : (!fir.heap<!fir.array<?xi8>>, !fir.shape<1>, index) -> !fir.ref<i8>
183! CHECK:               %[[VAL_154:.*]] = fir.convert %[[VAL_146]] : (i1) -> i8
184! CHECK:               fir.store %[[VAL_154]] to %[[VAL_153]] : !fir.ref<i8>
185! CHECK:               fir.result %[[VAL_144]] : !fir.array<?xi8>
186! CHECK:             }
187! CHECK:             fir.result %[[VAL_52]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
188! CHECK:           }
189! CHECK:           fir.result %[[VAL_155:.*]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
190! CHECK:         }
191! CHECK:         %[[VAL_156:.*]] = fir.do_loop %[[VAL_157:.*]] = %[[VAL_19]] to %[[VAL_29]] step %[[VAL_30]] unordered iter_args(%[[VAL_158:.*]] = %[[VAL_44]]) -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
192! CHECK:           %[[VAL_159:.*]] = fir.convert %[[VAL_157]] : (index) -> i32
193! CHECK:           fir.store %[[VAL_159]] to %[[VAL_5]] : !fir.ref<i32>
194! CHECK:           %[[VAL_160:.*]] = fir.do_loop %[[VAL_161:.*]] = %[[VAL_32]] to %[[VAL_42]] step %[[VAL_43]] unordered iter_args(%[[VAL_162:.*]] = %[[VAL_158]]) -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
195! CHECK:             %[[VAL_163:.*]] = fir.convert %[[VAL_161]] : (index) -> i32
196! CHECK:             fir.store %[[VAL_163]] to %[[VAL_4]] : !fir.ref<i32>
197! CHECK:             %[[VAL_164:.*]] = arith.constant 0 : i64
198! CHECK:             %[[VAL_165:.*]] = fir.convert %[[VAL_19]] : (index) -> i64
199! CHECK:             %[[VAL_166:.*]] = fir.convert %[[VAL_29]] : (index) -> i64
200! CHECK:             %[[VAL_167:.*]] = fir.convert %[[VAL_30]] : (index) -> i64
201! CHECK:             %[[VAL_168:.*]] = arith.subi %[[VAL_166]], %[[VAL_165]] : i64
202! CHECK:             %[[VAL_169:.*]] = arith.addi %[[VAL_168]], %[[VAL_167]] : i64
203! CHECK:             %[[VAL_170:.*]] = arith.divsi %[[VAL_169]], %[[VAL_167]] : i64
204! CHECK:             %[[VAL_171:.*]] = arith.cmpi sgt, %[[VAL_170]], %[[VAL_164]] : i64
205! CHECK:             %[[VAL_172:.*]] = arith.select %[[VAL_171]], %[[VAL_170]], %[[VAL_164]] : i64
206! CHECK:             %[[VAL_173:.*]] = arith.constant 0 : i64
207! CHECK:             %[[VAL_174:.*]] = fir.convert %[[VAL_32]] : (index) -> i64
208! CHECK:             %[[VAL_175:.*]] = fir.convert %[[VAL_42]] : (index) -> i64
209! CHECK:             %[[VAL_176:.*]] = fir.convert %[[VAL_43]] : (index) -> i64
210! CHECK:             %[[VAL_177:.*]] = arith.subi %[[VAL_175]], %[[VAL_174]] : i64
211! CHECK:             %[[VAL_178:.*]] = arith.addi %[[VAL_177]], %[[VAL_176]] : i64
212! CHECK:             %[[VAL_179:.*]] = arith.divsi %[[VAL_178]], %[[VAL_176]] : i64
213! CHECK:             %[[VAL_180:.*]] = arith.cmpi sgt, %[[VAL_179]], %[[VAL_173]] : i64
214! CHECK:             %[[VAL_181:.*]] = arith.select %[[VAL_180]], %[[VAL_179]], %[[VAL_173]] : i64
215! CHECK:             %[[VAL_182:.*]] = arith.subi %[[VAL_157]], %[[VAL_19]] : index
216! CHECK:             %[[VAL_183:.*]] = arith.divsi %[[VAL_182]], %[[VAL_30]] : index
217! CHECK:             %[[VAL_184:.*]] = arith.constant 1 : index
218! CHECK:             %[[VAL_185:.*]] = arith.addi %[[VAL_183]], %[[VAL_184]] : index
219! CHECK:             %[[VAL_186:.*]] = arith.subi %[[VAL_161]], %[[VAL_32]] : index
220! CHECK:             %[[VAL_187:.*]] = arith.divsi %[[VAL_186]], %[[VAL_43]] : index
221! CHECK:             %[[VAL_188:.*]] = arith.constant 1 : index
222! CHECK:             %[[VAL_189:.*]] = arith.addi %[[VAL_187]], %[[VAL_188]] : index
223! CHECK:             %[[VAL_190:.*]] = arith.constant 1 : i32
224! CHECK:             %[[VAL_191:.*]] = fir.coordinate_of %[[VAL_8]], %[[VAL_190]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
225! CHECK:             %[[VAL_192:.*]] = fir.load %[[VAL_191]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
226! CHECK:             %[[VAL_193:.*]] = fir.convert %[[VAL_192]] : (!fir.heap<!fir.array<?xi8>>) -> !fir.ref<!fir.array<?x?xtuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>>
227! CHECK:             %[[VAL_194:.*]] = fir.shape %[[VAL_172]], %[[VAL_181]] : (i64, i64) -> !fir.shape<2>
228! CHECK:             %[[VAL_195:.*]] = fir.array_coor %[[VAL_193]](%[[VAL_194]]) %[[VAL_185]], %[[VAL_189]] : (!fir.ref<!fir.array<?x?xtuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>>, !fir.shape<2>, index, index) -> !fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>
229! CHECK:             %[[VAL_196:.*]] = arith.constant 1 : i32
230! CHECK:             %[[VAL_197:.*]] = fir.coordinate_of %[[VAL_195]], %[[VAL_196]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
231! CHECK:             %[[VAL_198:.*]] = fir.load %[[VAL_197]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
232! CHECK:             %[[VAL_199:.*]] = fir.convert %[[VAL_198]] : (!fir.heap<!fir.array<?xi8>>) -> !fir.ref<!fir.array<?xi8>>
233! CHECK:             %[[VAL_200:.*]] = arith.constant 2 : i32
234! CHECK:             %[[VAL_201:.*]] = fir.coordinate_of %[[VAL_195]], %[[VAL_200]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi64>>>
235! CHECK:             %[[VAL_202:.*]] = fir.load %[[VAL_201]] : !fir.ref<!fir.heap<!fir.array<?xi64>>>
236! CHECK:             %[[VAL_203:.*]] = arith.constant 0 : i32
237! CHECK:             %[[VAL_204:.*]] = fir.coordinate_of %[[VAL_202]], %[[VAL_203]] : (!fir.heap<!fir.array<?xi64>>, i32) -> !fir.ref<i64>
238! CHECK:             %[[VAL_205:.*]] = fir.load %[[VAL_204]] : !fir.ref<i64>
239! CHECK:             %[[VAL_206:.*]] = fir.convert %[[VAL_205]] : (i64) -> index
240! CHECK:             %[[VAL_207:.*]] = fir.shape %[[VAL_206]] : (index) -> !fir.shape<1>
241! CHECK:             %[[VAL_208:.*]] = arith.constant 1 : index
242! CHECK:             %[[VAL_209:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
243! CHECK:             %[[VAL_210:.*]] = fir.convert %[[VAL_209]] : (i32) -> i64
244! CHECK:             %[[VAL_211:.*]] = fir.convert %[[VAL_210]] : (i64) -> index
245! CHECK:             %[[VAL_212:.*]] = arith.subi %[[VAL_211]], %[[VAL_208]] : index
246! CHECK:             %[[VAL_213:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
247! CHECK:             %[[VAL_214:.*]] = fir.convert %[[VAL_213]] : (i32) -> i64
248! CHECK:             %[[VAL_215:.*]] = fir.convert %[[VAL_214]] : (i64) -> index
249! CHECK:             %[[VAL_216:.*]] = arith.subi %[[VAL_215]], %[[VAL_208]] : index
250! CHECK:             %[[VAL_217:.*]] = fir.field_index data, !fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>
251! CHECK:             %[[VAL_218:.*]] = arith.constant 1 : index
252! CHECK:             %[[VAL_219:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
253! CHECK:             %[[VAL_220:.*]] = fir.convert %[[VAL_219]] : (i32) -> i64
254! CHECK:             %[[VAL_221:.*]] = fir.convert %[[VAL_220]] : (i64) -> index
255! CHECK:             %[[VAL_222:.*]] = arith.subi %[[VAL_221]], %[[VAL_218]] : index
256! CHECK:             %[[VAL_223:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
257! CHECK:             %[[VAL_224:.*]] = fir.convert %[[VAL_223]] : (i32) -> i64
258! CHECK:             %[[VAL_225:.*]] = fir.convert %[[VAL_224]] : (i64) -> index
259! CHECK:             %[[VAL_226:.*]] = arith.subi %[[VAL_225]], %[[VAL_218]] : index
260! CHECK:             %[[VAL_227:.*]] = fir.field_index data, !fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>
261! CHECK:             %[[VAL_228:.*]] = arith.constant 3.140000e+00 : f32
262! CHECK:             %[[VAL_229:.*]] = arith.constant 1 : index
263! CHECK:             %[[VAL_230:.*]] = arith.constant 0 : index
264! CHECK:             %[[VAL_231:.*]] = arith.subi %[[VAL_206]], %[[VAL_229]] : index
265! CHECK:             %[[VAL_232:.*]] = fir.do_loop %[[VAL_233:.*]] = %[[VAL_230]] to %[[VAL_231]] step %[[VAL_229]] unordered iter_args(%[[VAL_234:.*]] = %[[VAL_162]]) -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
266! CHECK:               %[[VAL_235:.*]] = arith.constant 1 : index
267! CHECK:               %[[VAL_236:.*]] = arith.addi %[[VAL_233]], %[[VAL_235]] : index
268! CHECK:               %[[VAL_237:.*]] = fir.array_coor %[[VAL_199]](%[[VAL_207]]) %[[VAL_236]] : (!fir.ref<!fir.array<?xi8>>, !fir.shape<1>, index) -> !fir.ref<i8>
269! CHECK:               %[[VAL_238:.*]] = fir.load %[[VAL_237]] : !fir.ref<i8>
270! CHECK:               %[[VAL_239:.*]] = fir.convert %[[VAL_238]] : (i8) -> i1
271! CHECK:               %[[VAL_240:.*]] = fir.if %[[VAL_239]] -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
272! CHECK:                 %[[VAL_241:.*]] = fir.array_fetch %[[VAL_45]], %[[VAL_222]], %[[VAL_226]], %[[VAL_227]], %[[VAL_233]] : (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, index, index, !fir.field, index) -> f32
273! CHECK:                 %[[VAL_242:.*]] = arith.divf %[[VAL_241]], %[[VAL_228]] {{.*}}: f32
274! CHECK:                 %[[VAL_243:.*]] = fir.array_update %[[VAL_234]], %[[VAL_242]], %[[VAL_212]], %[[VAL_216]], %[[VAL_217]], %[[VAL_233]] : (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, f32, index, index, !fir.field, index) -> !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
275! CHECK:                 fir.result %[[VAL_243]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
276! CHECK:               } else {
277! CHECK:                 fir.result %[[VAL_234]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
278! CHECK:               }
279! CHECK:               fir.result %[[VAL_244:.*]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
280! CHECK:             }
281! CHECK:             fir.result %[[VAL_245:.*]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
282! CHECK:           }
283! CHECK:           fir.result %[[VAL_246:.*]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
284! CHECK:         }
285! CHECK:         fir.array_merge_store %[[VAL_44]], %[[VAL_247:.*]] to %[[VAL_0]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, !fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>
286! CHECK:         %[[VAL_248:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>) -> !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
287! CHECK:         %[[VAL_249:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>) -> !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
288! CHECK:         %[[VAL_250:.*]] = fir.do_loop %[[VAL_251:.*]] = %[[VAL_19]] to %[[VAL_29]] step %[[VAL_30]] unordered iter_args(%[[VAL_252:.*]] = %[[VAL_248]]) -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
289! CHECK:           %[[VAL_253:.*]] = fir.convert %[[VAL_251]] : (index) -> i32
290! CHECK:           fir.store %[[VAL_253]] to %[[VAL_3]] : !fir.ref<i32>
291! CHECK:           %[[VAL_254:.*]] = fir.do_loop %[[VAL_255:.*]] = %[[VAL_32]] to %[[VAL_42]] step %[[VAL_43]] unordered iter_args(%[[VAL_256:.*]] = %[[VAL_252]]) -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
292! CHECK:             %[[VAL_257:.*]] = fir.convert %[[VAL_255]] : (index) -> i32
293! CHECK:             fir.store %[[VAL_257]] to %[[VAL_2]] : !fir.ref<i32>
294! CHECK:             %[[VAL_258:.*]] = arith.constant 0 : i64
295! CHECK:             %[[VAL_259:.*]] = fir.convert %[[VAL_19]] : (index) -> i64
296! CHECK:             %[[VAL_260:.*]] = fir.convert %[[VAL_29]] : (index) -> i64
297! CHECK:             %[[VAL_261:.*]] = fir.convert %[[VAL_30]] : (index) -> i64
298! CHECK:             %[[VAL_262:.*]] = arith.subi %[[VAL_260]], %[[VAL_259]] : i64
299! CHECK:             %[[VAL_263:.*]] = arith.addi %[[VAL_262]], %[[VAL_261]] : i64
300! CHECK:             %[[VAL_264:.*]] = arith.divsi %[[VAL_263]], %[[VAL_261]] : i64
301! CHECK:             %[[VAL_265:.*]] = arith.cmpi sgt, %[[VAL_264]], %[[VAL_258]] : i64
302! CHECK:             %[[VAL_266:.*]] = arith.select %[[VAL_265]], %[[VAL_264]], %[[VAL_258]] : i64
303! CHECK:             %[[VAL_267:.*]] = arith.constant 0 : i64
304! CHECK:             %[[VAL_268:.*]] = fir.convert %[[VAL_32]] : (index) -> i64
305! CHECK:             %[[VAL_269:.*]] = fir.convert %[[VAL_42]] : (index) -> i64
306! CHECK:             %[[VAL_270:.*]] = fir.convert %[[VAL_43]] : (index) -> i64
307! CHECK:             %[[VAL_271:.*]] = arith.subi %[[VAL_269]], %[[VAL_268]] : i64
308! CHECK:             %[[VAL_272:.*]] = arith.addi %[[VAL_271]], %[[VAL_270]] : i64
309! CHECK:             %[[VAL_273:.*]] = arith.divsi %[[VAL_272]], %[[VAL_270]] : i64
310! CHECK:             %[[VAL_274:.*]] = arith.cmpi sgt, %[[VAL_273]], %[[VAL_267]] : i64
311! CHECK:             %[[VAL_275:.*]] = arith.select %[[VAL_274]], %[[VAL_273]], %[[VAL_267]] : i64
312! CHECK:             %[[VAL_276:.*]] = arith.subi %[[VAL_251]], %[[VAL_19]] : index
313! CHECK:             %[[VAL_277:.*]] = arith.divsi %[[VAL_276]], %[[VAL_30]] : index
314! CHECK:             %[[VAL_278:.*]] = arith.constant 1 : index
315! CHECK:             %[[VAL_279:.*]] = arith.addi %[[VAL_277]], %[[VAL_278]] : index
316! CHECK:             %[[VAL_280:.*]] = arith.subi %[[VAL_255]], %[[VAL_32]] : index
317! CHECK:             %[[VAL_281:.*]] = arith.divsi %[[VAL_280]], %[[VAL_43]] : index
318! CHECK:             %[[VAL_282:.*]] = arith.constant 1 : index
319! CHECK:             %[[VAL_283:.*]] = arith.addi %[[VAL_281]], %[[VAL_282]] : index
320! CHECK:             %[[VAL_284:.*]] = arith.constant 1 : i32
321! CHECK:             %[[VAL_285:.*]] = fir.coordinate_of %[[VAL_8]], %[[VAL_284]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
322! CHECK:             %[[VAL_286:.*]] = fir.load %[[VAL_285]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
323! CHECK:             %[[VAL_287:.*]] = fir.convert %[[VAL_286]] : (!fir.heap<!fir.array<?xi8>>) -> !fir.ref<!fir.array<?x?xtuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>>
324! CHECK:             %[[VAL_288:.*]] = fir.shape %[[VAL_266]], %[[VAL_275]] : (i64, i64) -> !fir.shape<2>
325! CHECK:             %[[VAL_289:.*]] = fir.array_coor %[[VAL_287]](%[[VAL_288]]) %[[VAL_279]], %[[VAL_283]] : (!fir.ref<!fir.array<?x?xtuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>>, !fir.shape<2>, index, index) -> !fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>
326! CHECK:             %[[VAL_290:.*]] = arith.constant 1 : i32
327! CHECK:             %[[VAL_291:.*]] = fir.coordinate_of %[[VAL_289]], %[[VAL_290]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi8>>>
328! CHECK:             %[[VAL_292:.*]] = fir.load %[[VAL_291]] : !fir.ref<!fir.heap<!fir.array<?xi8>>>
329! CHECK:             %[[VAL_293:.*]] = fir.convert %[[VAL_292]] : (!fir.heap<!fir.array<?xi8>>) -> !fir.ref<!fir.array<?xi8>>
330! CHECK:             %[[VAL_294:.*]] = arith.constant 2 : i32
331! CHECK:             %[[VAL_295:.*]] = fir.coordinate_of %[[VAL_289]], %[[VAL_294]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>, i32) -> !fir.ref<!fir.heap<!fir.array<?xi64>>>
332! CHECK:             %[[VAL_296:.*]] = fir.load %[[VAL_295]] : !fir.ref<!fir.heap<!fir.array<?xi64>>>
333! CHECK:             %[[VAL_297:.*]] = arith.constant 0 : i32
334! CHECK:             %[[VAL_298:.*]] = fir.coordinate_of %[[VAL_296]], %[[VAL_297]] : (!fir.heap<!fir.array<?xi64>>, i32) -> !fir.ref<i64>
335! CHECK:             %[[VAL_299:.*]] = fir.load %[[VAL_298]] : !fir.ref<i64>
336! CHECK:             %[[VAL_300:.*]] = fir.convert %[[VAL_299]] : (i64) -> index
337! CHECK:             %[[VAL_301:.*]] = fir.shape %[[VAL_300]] : (index) -> !fir.shape<1>
338! CHECK:             %[[VAL_302:.*]] = arith.constant 1 : index
339! CHECK:             %[[VAL_303:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
340! CHECK:             %[[VAL_304:.*]] = fir.convert %[[VAL_303]] : (i32) -> i64
341! CHECK:             %[[VAL_305:.*]] = fir.convert %[[VAL_304]] : (i64) -> index
342! CHECK:             %[[VAL_306:.*]] = arith.subi %[[VAL_305]], %[[VAL_302]] : index
343! CHECK:             %[[VAL_307:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
344! CHECK:             %[[VAL_308:.*]] = fir.convert %[[VAL_307]] : (i32) -> i64
345! CHECK:             %[[VAL_309:.*]] = fir.convert %[[VAL_308]] : (i64) -> index
346! CHECK:             %[[VAL_310:.*]] = arith.subi %[[VAL_309]], %[[VAL_302]] : index
347! CHECK:             %[[VAL_311:.*]] = fir.field_index data, !fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>
348! CHECK:             %[[VAL_312:.*]] = arith.constant 1 : index
349! CHECK:             %[[VAL_313:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
350! CHECK:             %[[VAL_314:.*]] = fir.convert %[[VAL_313]] : (i32) -> i64
351! CHECK:             %[[VAL_315:.*]] = fir.convert %[[VAL_314]] : (i64) -> index
352! CHECK:             %[[VAL_316:.*]] = arith.subi %[[VAL_315]], %[[VAL_312]] : index
353! CHECK:             %[[VAL_317:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
354! CHECK:             %[[VAL_318:.*]] = fir.convert %[[VAL_317]] : (i32) -> i64
355! CHECK:             %[[VAL_319:.*]] = fir.convert %[[VAL_318]] : (i64) -> index
356! CHECK:             %[[VAL_320:.*]] = arith.subi %[[VAL_319]], %[[VAL_312]] : index
357! CHECK:             %[[VAL_321:.*]] = fir.field_index data, !fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>
358! CHECK:             %[[VAL_322:.*]] = arith.constant 1 : index
359! CHECK:             %[[VAL_323:.*]] = arith.constant 0 : index
360! CHECK:             %[[VAL_324:.*]] = arith.subi %[[VAL_300]], %[[VAL_322]] : index
361! CHECK:             %[[VAL_325:.*]] = fir.do_loop %[[VAL_326:.*]] = %[[VAL_323]] to %[[VAL_324]] step %[[VAL_322]] unordered iter_args(%[[VAL_327:.*]] = %[[VAL_256]]) -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
362! CHECK:               %[[VAL_328:.*]] = arith.constant 1 : index
363! CHECK:               %[[VAL_329:.*]] = arith.addi %[[VAL_326]], %[[VAL_328]] : index
364! CHECK:               %[[VAL_330:.*]] = fir.array_coor %[[VAL_293]](%[[VAL_301]]) %[[VAL_329]] : (!fir.ref<!fir.array<?xi8>>, !fir.shape<1>, index) -> !fir.ref<i8>
365! CHECK:               %[[VAL_331:.*]] = fir.load %[[VAL_330]] : !fir.ref<i8>
366! CHECK:               %[[VAL_332:.*]] = fir.convert %[[VAL_331]] : (i8) -> i1
367! CHECK:               %[[VAL_333:.*]] = fir.if %[[VAL_332]] -> (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>) {
368! CHECK:                 fir.result %[[VAL_327]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
369! CHECK:               } else {
370! CHECK:                 %[[VAL_334:.*]] = fir.array_fetch %[[VAL_249]], %[[VAL_316]], %[[VAL_320]], %[[VAL_321]], %[[VAL_326]] : (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, index, index, !fir.field, index) -> f32
371! CHECK:                 %[[VAL_335:.*]] = arith.negf %[[VAL_334]] {{.*}}: f32
372! CHECK:                 %[[VAL_336:.*]] = fir.array_update %[[VAL_327]], %[[VAL_335]], %[[VAL_306]], %[[VAL_310]], %[[VAL_311]], %[[VAL_326]] : (!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, f32, index, index, !fir.field, index) -> !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
373! CHECK:                 fir.result %[[VAL_336]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
374! CHECK:               }
375! CHECK:               fir.result %[[VAL_337:.*]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
376! CHECK:             }
377! CHECK:             fir.result %[[VAL_338:.*]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
378! CHECK:           }
379! CHECK:           fir.result %[[VAL_339:.*]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>
380! CHECK:         }
381! CHECK:         fir.array_merge_store %[[VAL_248]], %[[VAL_340:.*]] to %[[VAL_0]] : !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, !fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>, !fir.box<!fir.array<?x?x!fir.type<_QFtest_nested_forall_whereTt{data:!fir.array<100xf32>}>>>
382! CHECK:         %[[VAL_341:.*]] = fir.convert %[[VAL_8]] : (!fir.ref<tuple<i64, !fir.heap<!fir.array<?xi8>>, !fir.heap<!fir.array<?xi64>>>>) -> !fir.llvm_ptr<i8>
383! CHECK:         fir.call @_FortranARaggedArrayDeallocate(%[[VAL_341]]) {{.*}}: (!fir.llvm_ptr<i8>) -> ()
384! CHECK:         return
385! CHECK:       }
386