1*aa0e167fSKiran Chandramohan! RUN: bbc -emit-fir -o - %s | FileCheck %s
2*aa0e167fSKiran Chandramohan! RUN: %flang_fc1 -emit-fir -o - %s | FileCheck %s
3*aa0e167fSKiran Chandramohan
4*aa0e167fSKiran Chandramohan! Tests for unstructured loops.
5*aa0e167fSKiran Chandramohan
6*aa0e167fSKiran Chandramohan! Test a simple unstructured loop. Test for the existence of,
7*aa0e167fSKiran Chandramohan! -> The initialization of the trip-count and loop-variable
8*aa0e167fSKiran Chandramohan! -> The branch to the body or the exit inside the header
9*aa0e167fSKiran Chandramohan! -> The increment of the trip-count and the loop-variable inside the body
10*aa0e167fSKiran Chandramohansubroutine simple_unstructured()
11*aa0e167fSKiran Chandramohan  integer :: i
12*aa0e167fSKiran Chandramohan  do i=1,100
13*aa0e167fSKiran Chandramohan    goto 404
14*aa0e167fSKiran Chandramohan    404 continue
15*aa0e167fSKiran Chandramohan  end do
16*aa0e167fSKiran Chandramohanend subroutine
17*aa0e167fSKiran Chandramohan! CHECK-LABEL: simple_unstructured
18*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_REF:.*]] = fir.alloca i32
19*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_unstructuredEi"}
20*aa0e167fSKiran Chandramohan! CHECK:   %[[ONE:.*]] = arith.constant 1 : i32
21*aa0e167fSKiran Chandramohan! CHECK:   %[[HUNDRED:.*]] = arith.constant 100 : i32
22*aa0e167fSKiran Chandramohan! CHECK:   %[[STEP_ONE:.*]] = arith.constant 1 : i32
23*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP1:.*]] = arith.subi %[[HUNDRED]], %[[ONE]] : i32
24*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[STEP_ONE]] : i32
25*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[STEP_ONE]] : i32
26*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>
27*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[ONE]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>
28*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER:.*]]
29*aa0e167fSKiran Chandramohan! CHECK: ^[[HEADER]]:
30*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>
31*aa0e167fSKiran Chandramohan! CHECK:   %[[ZERO:.*]] = arith.constant 0 : i32
32*aa0e167fSKiran Chandramohan! CHECK:   %[[COND:.*]] = arith.cmpi sgt, %[[TRIP_VAR]], %[[ZERO]] : i32
33*aa0e167fSKiran Chandramohan! CHECK:   cf.cond_br %[[COND]], ^[[BODY:.*]], ^[[EXIT:.*]]
34*aa0e167fSKiran Chandramohan! CHECK: ^[[BODY]]:
35*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>
36*aa0e167fSKiran Chandramohan! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i32
37*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_NEXT:.*]] = arith.subi %[[TRIP_VAR]], %[[ONE_1]] : i32
38*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_VAR_NEXT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>
39*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR:.*]] = fir.load %[[LOOP_VAR_REF]] : !fir.ref<i32>
40*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_NEXT:.*]] = arith.addi %[[LOOP_VAR]], %[[STEP_ONE]] : i32
41*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[LOOP_VAR_NEXT]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>
42*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER]]
43*aa0e167fSKiran Chandramohan! CHECK: ^[[EXIT]]:
44*aa0e167fSKiran Chandramohan! CHECK:   return
45*aa0e167fSKiran Chandramohan
46*aa0e167fSKiran Chandramohan! Test an unstructured loop with a step. Mostly similar to the previous one.
47*aa0e167fSKiran Chandramohan! Only difference is a non-unit step.
48*aa0e167fSKiran Chandramohansubroutine simple_unstructured_with_step()
49*aa0e167fSKiran Chandramohan  integer :: i
50*aa0e167fSKiran Chandramohan  do i=1,100,2
51*aa0e167fSKiran Chandramohan    goto 404
52*aa0e167fSKiran Chandramohan    404 continue
53*aa0e167fSKiran Chandramohan  end do
54*aa0e167fSKiran Chandramohanend subroutine
55*aa0e167fSKiran Chandramohan! CHECK-LABEL: simple_unstructured_with_step
56*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_REF:.*]] = fir.alloca i32
57*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_unstructured_with_stepEi"}
58*aa0e167fSKiran Chandramohan! CHECK:   %[[ONE:.*]] = arith.constant 1 : i32
59*aa0e167fSKiran Chandramohan! CHECK:   %[[HUNDRED:.*]] = arith.constant 100 : i32
60*aa0e167fSKiran Chandramohan! CHECK:   %[[STEP:.*]] = arith.constant 2 : i32
61*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP1:.*]] = arith.subi %[[HUNDRED]], %[[ONE]] : i32
62*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[STEP]] : i32
63*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[STEP]] : i32
64*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>
65*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[ONE]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>
66*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER:.*]]
67*aa0e167fSKiran Chandramohan! CHECK: ^[[HEADER]]:
68*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>
69*aa0e167fSKiran Chandramohan! CHECK:   %[[ZERO:.*]] = arith.constant 0 : i32
70*aa0e167fSKiran Chandramohan! CHECK:   %[[COND:.*]] = arith.cmpi sgt, %[[TRIP_VAR]], %[[ZERO]] : i32
71*aa0e167fSKiran Chandramohan! CHECK:   cf.cond_br %[[COND]], ^[[BODY:.*]], ^[[EXIT:.*]]
72*aa0e167fSKiran Chandramohan! CHECK: ^[[BODY]]:
73*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>
74*aa0e167fSKiran Chandramohan! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i32
75*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_NEXT:.*]] = arith.subi %[[TRIP_VAR]], %[[ONE_1]] : i32
76*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_VAR_NEXT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>
77*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR:.*]] = fir.load %[[LOOP_VAR_REF]] : !fir.ref<i32>
78*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_NEXT:.*]] = arith.addi %[[LOOP_VAR]], %[[STEP]] : i32
79*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[LOOP_VAR_NEXT]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>
80*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER]]
81*aa0e167fSKiran Chandramohan! CHECK: ^[[EXIT]]:
82*aa0e167fSKiran Chandramohan! CHECK:   return
83*aa0e167fSKiran Chandramohan
84*aa0e167fSKiran Chandramohan! Test a three nested unstructured loop. Three nesting is the basic case where
85*aa0e167fSKiran Chandramohan! we have loops that are neither innermost or outermost.
86*aa0e167fSKiran Chandramohansubroutine nested_unstructured()
87*aa0e167fSKiran Chandramohan  integer :: i, j, k
88*aa0e167fSKiran Chandramohan  do i=1,100
89*aa0e167fSKiran Chandramohan    do j=1,200
90*aa0e167fSKiran Chandramohan      do k=1,300
91*aa0e167fSKiran Chandramohan        goto 404
92*aa0e167fSKiran Chandramohan        404 continue
93*aa0e167fSKiran Chandramohan      end do
94*aa0e167fSKiran Chandramohan    end do
95*aa0e167fSKiran Chandramohan  end do
96*aa0e167fSKiran Chandramohanend subroutine
97*aa0e167fSKiran Chandramohan! CHECK-LABEL: nested_unstructured
98*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_K_REF:.*]] = fir.alloca i32
99*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_J_REF:.*]] = fir.alloca i32
100*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_I_REF:.*]] = fir.alloca i32
101*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFnested_unstructuredEi"}
102*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_J_REF:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFnested_unstructuredEj"}
103*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_K_REF:.*]] = fir.alloca i32 {bindc_name = "k", uniq_name = "_QFnested_unstructuredEk"}
104*aa0e167fSKiran Chandramohan! CHECK:   %[[I_START:.*]] = arith.constant 1 : i32
105*aa0e167fSKiran Chandramohan! CHECK:   %[[I_END:.*]] = arith.constant 100 : i32
106*aa0e167fSKiran Chandramohan! CHECK:   %[[I_STEP:.*]] = arith.constant 1 : i32
107*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP1:.*]] = arith.subi %[[I_END]], %[[I_START]] : i32
108*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[I_STEP]] : i32
109*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_COUNT_I:.*]] = arith.divsi %[[TMP2]], %[[I_STEP]] : i32
110*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_COUNT_I]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
111*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[I_START]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
112*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER_I:.*]]
113*aa0e167fSKiran Chandramohan! CHECK: ^[[HEADER_I]]:
114*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
115*aa0e167fSKiran Chandramohan! CHECK:   %[[ZERO_1:.*]] = arith.constant 0 : i32
116*aa0e167fSKiran Chandramohan! CHECK:   %[[COND_I:.*]] = arith.cmpi sgt, %[[TRIP_VAR_I]], %[[ZERO_1]] : i32
117*aa0e167fSKiran Chandramohan! CHECK:   cf.cond_br %[[COND_I]], ^[[BODY_I:.*]], ^[[EXIT_I:.*]]
118*aa0e167fSKiran Chandramohan! CHECK: ^[[BODY_I]]:
119*aa0e167fSKiran Chandramohan! CHECK:   %[[J_START:.*]] = arith.constant 1 : i32
120*aa0e167fSKiran Chandramohan! CHECK:   %[[J_END:.*]] = arith.constant 200 : i32
121*aa0e167fSKiran Chandramohan! CHECK:   %[[J_STEP:.*]] = arith.constant 1 : i32
122*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP3:.*]] = arith.subi %[[J_END]], %[[J_START]] : i32
123*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP4:.*]] = arith.addi %[[TMP3]], %[[J_STEP]] : i32
124*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_COUNT_J:.*]] = arith.divsi %[[TMP4]], %[[J_STEP]] : i32
125*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_COUNT_J]] to %[[TRIP_VAR_J_REF]] : !fir.ref<i32>
126*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[J_START]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
127*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER_J:.*]]
128*aa0e167fSKiran Chandramohan! CHECK: ^[[HEADER_J]]:
129*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_J:.*]] = fir.load %[[TRIP_VAR_J_REF]] : !fir.ref<i32>
130*aa0e167fSKiran Chandramohan! CHECK:   %[[ZERO_2:.*]] = arith.constant 0 : i32
131*aa0e167fSKiran Chandramohan! CHECK:   %[[COND_J:.*]] = arith.cmpi sgt, %[[TRIP_VAR_J]], %[[ZERO_2]] : i32
132*aa0e167fSKiran Chandramohan! CHECK:   cf.cond_br %[[COND_J]], ^[[BODY_J:.*]], ^[[EXIT_J:.*]]
133*aa0e167fSKiran Chandramohan! CHECK: ^[[BODY_J]]:
134*aa0e167fSKiran Chandramohan! CHECK:   %[[K_START:.*]] = arith.constant 1 : i32
135*aa0e167fSKiran Chandramohan! CHECK:   %[[K_END:.*]] = arith.constant 300 : i32
136*aa0e167fSKiran Chandramohan! CHECK:   %[[K_STEP:.*]] = arith.constant 1 : i32
137*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP3:.*]] = arith.subi %[[K_END]], %[[K_START]] : i32
138*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP4:.*]] = arith.addi %[[TMP3]], %[[K_STEP]] : i32
139*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_COUNT_K:.*]] = arith.divsi %[[TMP4]], %[[K_STEP]] : i32
140*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_COUNT_K]] to %[[TRIP_VAR_K_REF]] : !fir.ref<i32>
141*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[K_START]] to %[[LOOP_VAR_K_REF]] : !fir.ref<i32>
142*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER_K:.*]]
143*aa0e167fSKiran Chandramohan! CHECK: ^[[HEADER_K]]:
144*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_K:.*]] = fir.load %[[TRIP_VAR_K_REF]] : !fir.ref<i32>
145*aa0e167fSKiran Chandramohan! CHECK:   %[[ZERO_2:.*]] = arith.constant 0 : i32
146*aa0e167fSKiran Chandramohan! CHECK:   %[[COND_K:.*]] = arith.cmpi sgt, %[[TRIP_VAR_K]], %[[ZERO_2]] : i32
147*aa0e167fSKiran Chandramohan! CHECK:   cf.cond_br %[[COND_K]], ^[[BODY_K:.*]], ^[[EXIT_K:.*]]
148*aa0e167fSKiran Chandramohan! CHECK: ^[[BODY_K]]:
149*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_K:.*]] = fir.load %[[TRIP_VAR_K_REF]] : !fir.ref<i32>
150*aa0e167fSKiran Chandramohan! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i32
151*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_K_NEXT:.*]] = arith.subi %[[TRIP_VAR_K]], %[[ONE_1]] : i32
152*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_VAR_K_NEXT]] to %[[TRIP_VAR_K_REF]] : !fir.ref<i32>
153*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_K:.*]] = fir.load %[[LOOP_VAR_K_REF]] : !fir.ref<i32>
154*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_K_NEXT:.*]] = arith.addi %[[LOOP_VAR_K]], %[[K_STEP]] : i32
155*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[LOOP_VAR_K_NEXT]] to %[[LOOP_VAR_K_REF]] : !fir.ref<i32>
156*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER_K]]
157*aa0e167fSKiran Chandramohan! CHECK: ^[[EXIT_K]]:
158*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_J:.*]] = fir.load %[[TRIP_VAR_J_REF]] : !fir.ref<i32>
159*aa0e167fSKiran Chandramohan! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i32
160*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_J_NEXT:.*]] = arith.subi %[[TRIP_VAR_J]], %[[ONE_1]] : i32
161*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_VAR_J_NEXT]] to %[[TRIP_VAR_J_REF]] : !fir.ref<i32>
162*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_J:.*]] = fir.load %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
163*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_J_NEXT:.*]] = arith.addi %[[LOOP_VAR_J]], %[[J_STEP]] : i32
164*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[LOOP_VAR_J_NEXT]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
165*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER_J]]
166*aa0e167fSKiran Chandramohan! CHECK: ^[[EXIT_J]]:
167*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
168*aa0e167fSKiran Chandramohan! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i32
169*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_I_NEXT:.*]] = arith.subi %[[TRIP_VAR_I]], %[[ONE_1]] : i32
170*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_VAR_I_NEXT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
171*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_I:.*]] = fir.load %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
172*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_I_NEXT:.*]] = arith.addi %[[LOOP_VAR_I]], %[[I_STEP]] : i32
173*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[LOOP_VAR_I_NEXT]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
174*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER_I]]
175*aa0e167fSKiran Chandramohan! CHECK: ^[[EXIT_I]]:
176*aa0e167fSKiran Chandramohan! CHECK:   return
177*aa0e167fSKiran Chandramohan
178*aa0e167fSKiran Chandramohan! Test the existence of a structured loop inside an unstructured loop.
179*aa0e167fSKiran Chandramohan! Only minimal checks are inserted for the structured loop.
180*aa0e167fSKiran Chandramohansubroutine nested_structured_in_unstructured()
181*aa0e167fSKiran Chandramohan  integer :: i, j
182*aa0e167fSKiran Chandramohan  do i=1,100
183*aa0e167fSKiran Chandramohan    do j=1,100
184*aa0e167fSKiran Chandramohan    end do
185*aa0e167fSKiran Chandramohan    goto 404
186*aa0e167fSKiran Chandramohan    404 continue
187*aa0e167fSKiran Chandramohan  end do
188*aa0e167fSKiran Chandramohanend subroutine
189*aa0e167fSKiran Chandramohan! CHECK-LABEL: nested_structured_in_unstructured
190*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_I_REF:.*]] = fir.alloca i32
191*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFnested_structured_in_unstructuredEi"}
192*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_J_REF:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFnested_structured_in_unstructuredEj"}
193*aa0e167fSKiran Chandramohan! CHECK:   %[[I_START:.*]] = arith.constant 1 : i32
194*aa0e167fSKiran Chandramohan! CHECK:   %[[I_END:.*]] = arith.constant 100 : i32
195*aa0e167fSKiran Chandramohan! CHECK:   %[[I_STEP:.*]] = arith.constant 1 : i32
196*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP1:.*]] = arith.subi %[[I_END]], %[[I_START]] : i32
197*aa0e167fSKiran Chandramohan! CHECK:   %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[I_STEP]] : i32
198*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[I_STEP]] : i32
199*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
200*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[I_START]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
201*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER:.*]]
202*aa0e167fSKiran Chandramohan! CHECK: ^[[HEADER]]:
203*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
204*aa0e167fSKiran Chandramohan! CHECK:   %[[ZERO:.*]] = arith.constant 0 : i32
205*aa0e167fSKiran Chandramohan! CHECK:   %[[COND:.*]] = arith.cmpi sgt, %[[TRIP_VAR]], %[[ZERO]] : i32
206*aa0e167fSKiran Chandramohan! CHECK:   cf.cond_br %[[COND]], ^[[BODY:.*]], ^[[EXIT:.*]]
207*aa0e167fSKiran Chandramohan! CHECK: ^[[BODY]]:
208*aa0e167fSKiran Chandramohan! CHECK:   %{{.*}} = fir.do_loop %[[J_INDEX:.*]] = %{{.*}} to %{{.*}} step %{{.*}} -> index {
209*aa0e167fSKiran Chandramohan! CHECK:     %[[J_INDEX_CVT:.*]] = fir.convert %[[J_INDEX]] : (index) -> i32
210*aa0e167fSKiran Chandramohan! CHECK:     fir.store %[[J_INDEX_CVT]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
211*aa0e167fSKiran Chandramohan! CHECK:   }
212*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
213*aa0e167fSKiran Chandramohan! CHECK:   %[[C1_3:.*]] = arith.constant 1 : i32
214*aa0e167fSKiran Chandramohan! CHECK:   %[[TRIP_VAR_I_NEXT:.*]] = arith.subi %[[TRIP_VAR_I]], %[[C1_3]] : i32
215*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[TRIP_VAR_I_NEXT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
216*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_I:.*]] = fir.load %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
217*aa0e167fSKiran Chandramohan! CHECK:   %[[LOOP_VAR_I_NEXT:.*]] = arith.addi %[[LOOP_VAR_I]], %c1_i32_0 : i32
218*aa0e167fSKiran Chandramohan! CHECK:   fir.store %[[LOOP_VAR_I_NEXT]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
219*aa0e167fSKiran Chandramohan! CHECK:   cf.br ^[[HEADER]]
220*aa0e167fSKiran Chandramohan! CHECK: ^[[EXIT]]:
221*aa0e167fSKiran Chandramohan! CHECK:   return
222