xref: /aosp_15_r20/external/llvm/test/Transforms/IRCE/with-parent-loops.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -verify-loop-info -irce-print-changed-loops -irce < %s 2>&1 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; This test checks if we update the LoopInfo correctly in the presence
4*9880d681SAndroid Build Coastguard Worker; of parents, uncles and cousins.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Function Attrs: alwaysinline
7*9880d681SAndroid Build Coastguard Workerdefine void @inner_loop(i32* %arr, i32* %a_len_ptr, i32 %n) #0 {
8*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function inner_loop: constrained Loop at depth 1 containing: %loop<header><exiting>,%in.bounds<latch><exiting>
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  %len = load i32, i32* %a_len_ptr, !range !0
12*9880d681SAndroid Build Coastguard Worker  %first.itr.check = icmp sgt i32 %n, 0
13*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check, label %loop, label %exit
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerloop:                                             ; preds = %in.bounds, %entry
16*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ 0, %entry ], [ %idx.next, %in.bounds ]
17*9880d681SAndroid Build Coastguard Worker  %idx.next = add i32 %idx, 1
18*9880d681SAndroid Build Coastguard Worker  %abc = icmp slt i32 %idx, %len
19*9880d681SAndroid Build Coastguard Worker  br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerin.bounds:                                        ; preds = %loop
22*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* %arr, i32 %idx
23*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr
24*9880d681SAndroid Build Coastguard Worker  %next = icmp slt i32 %idx.next, %n
25*9880d681SAndroid Build Coastguard Worker  br i1 %next, label %loop, label %exit
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerout.of.bounds:                                    ; preds = %loop
28*9880d681SAndroid Build Coastguard Worker  ret void
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerexit:                                             ; preds = %in.bounds, %entry
31*9880d681SAndroid Build Coastguard Worker  ret void
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker; Function Attrs: alwaysinline
35*9880d681SAndroid Build Coastguard Workerdefine void @with_parent(i32* %arr, i32* %a_len_ptr, i32 %n, i32 %parent.count) #0 {
36*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function with_parent: constrained Loop at depth 2 containing: %loop.i<header><exiting>,%in.bounds.i<latch><exiting>
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerentry:
39*9880d681SAndroid Build Coastguard Worker  br label %loop
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerloop:                                             ; preds = %inner_loop.exit, %entry
42*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ 0, %entry ], [ %idx.next, %inner_loop.exit ]
43*9880d681SAndroid Build Coastguard Worker  %idx.next = add i32 %idx, 1
44*9880d681SAndroid Build Coastguard Worker  %next = icmp ult i32 %idx.next, %parent.count
45*9880d681SAndroid Build Coastguard Worker  %len.i = load i32, i32* %a_len_ptr, !range !0
46*9880d681SAndroid Build Coastguard Worker  %first.itr.check.i = icmp sgt i32 %n, 0
47*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check.i, label %loop.i, label %exit.i
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerloop.i:                                           ; preds = %in.bounds.i, %loop
50*9880d681SAndroid Build Coastguard Worker  %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %in.bounds.i ]
51*9880d681SAndroid Build Coastguard Worker  %idx.next.i = add i32 %idx.i, 1
52*9880d681SAndroid Build Coastguard Worker  %abc.i = icmp slt i32 %idx.i, %len.i
53*9880d681SAndroid Build Coastguard Worker  br i1 %abc.i, label %in.bounds.i, label %out.of.bounds.i, !prof !1
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerin.bounds.i:                                      ; preds = %loop.i
56*9880d681SAndroid Build Coastguard Worker  %addr.i = getelementptr i32, i32* %arr, i32 %idx.i
57*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr.i
58*9880d681SAndroid Build Coastguard Worker  %next.i = icmp slt i32 %idx.next.i, %n
59*9880d681SAndroid Build Coastguard Worker  br i1 %next.i, label %loop.i, label %exit.i
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerout.of.bounds.i:                                  ; preds = %loop.i
62*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerexit.i:                                           ; preds = %in.bounds.i, %loop
65*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerinner_loop.exit:                                  ; preds = %exit.i, %out.of.bounds.i
68*9880d681SAndroid Build Coastguard Worker  br i1 %next, label %loop, label %exit
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerexit:                                             ; preds = %inner_loop.exit
71*9880d681SAndroid Build Coastguard Worker  ret void
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker; Function Attrs: alwaysinline
75*9880d681SAndroid Build Coastguard Workerdefine void @with_grandparent(i32* %arr, i32* %a_len_ptr, i32 %n, i32 %parent.count, i32 %grandparent.count) #0 {
76*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function with_grandparent: constrained Loop at depth 3 containing: %loop.i.i<header><exiting>,%in.bounds.i.i<latch><exiting>
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerentry:
79*9880d681SAndroid Build Coastguard Worker  br label %loop
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerloop:                                             ; preds = %with_parent.exit, %entry
82*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ 0, %entry ], [ %idx.next, %with_parent.exit ]
83*9880d681SAndroid Build Coastguard Worker  %idx.next = add i32 %idx, 1
84*9880d681SAndroid Build Coastguard Worker  %next = icmp ult i32 %idx.next, %grandparent.count
85*9880d681SAndroid Build Coastguard Worker  br label %loop.i
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerloop.i:                                           ; preds = %inner_loop.exit.i, %loop
88*9880d681SAndroid Build Coastguard Worker  %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %inner_loop.exit.i ]
89*9880d681SAndroid Build Coastguard Worker  %idx.next.i = add i32 %idx.i, 1
90*9880d681SAndroid Build Coastguard Worker  %next.i = icmp ult i32 %idx.next.i, %parent.count
91*9880d681SAndroid Build Coastguard Worker  %len.i.i = load i32, i32* %a_len_ptr, !range !0
92*9880d681SAndroid Build Coastguard Worker  %first.itr.check.i.i = icmp sgt i32 %n, 0
93*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check.i.i, label %loop.i.i, label %exit.i.i
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerloop.i.i:                                         ; preds = %in.bounds.i.i, %loop.i
96*9880d681SAndroid Build Coastguard Worker  %idx.i.i = phi i32 [ 0, %loop.i ], [ %idx.next.i.i, %in.bounds.i.i ]
97*9880d681SAndroid Build Coastguard Worker  %idx.next.i.i = add i32 %idx.i.i, 1
98*9880d681SAndroid Build Coastguard Worker  %abc.i.i = icmp slt i32 %idx.i.i, %len.i.i
99*9880d681SAndroid Build Coastguard Worker  br i1 %abc.i.i, label %in.bounds.i.i, label %out.of.bounds.i.i, !prof !1
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerin.bounds.i.i:                                    ; preds = %loop.i.i
102*9880d681SAndroid Build Coastguard Worker  %addr.i.i = getelementptr i32, i32* %arr, i32 %idx.i.i
103*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr.i.i
104*9880d681SAndroid Build Coastguard Worker  %next.i.i = icmp slt i32 %idx.next.i.i, %n
105*9880d681SAndroid Build Coastguard Worker  br i1 %next.i.i, label %loop.i.i, label %exit.i.i
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerout.of.bounds.i.i:                                ; preds = %loop.i.i
108*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit.i
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerexit.i.i:                                         ; preds = %in.bounds.i.i, %loop.i
111*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit.i
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerinner_loop.exit.i:                                ; preds = %exit.i.i, %out.of.bounds.i.i
114*9880d681SAndroid Build Coastguard Worker  br i1 %next.i, label %loop.i, label %with_parent.exit
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerwith_parent.exit:                                 ; preds = %inner_loop.exit.i
117*9880d681SAndroid Build Coastguard Worker  br i1 %next, label %loop, label %exit
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerexit:                                             ; preds = %with_parent.exit
120*9880d681SAndroid Build Coastguard Worker  ret void
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; Function Attrs: alwaysinline
124*9880d681SAndroid Build Coastguard Workerdefine void @with_sibling(i32* %arr, i32* %a_len_ptr, i32 %n, i32 %parent.count) #0 {
125*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function with_sibling: constrained Loop at depth 2 containing: %loop.i<header><exiting>,%in.bounds.i<latch><exiting>
126*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function with_sibling: constrained Loop at depth 2 containing: %loop.i6<header><exiting>,%in.bounds.i9<latch><exiting>
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerentry:
129*9880d681SAndroid Build Coastguard Worker  br label %loop
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerloop:                                             ; preds = %inner_loop.exit12, %entry
132*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ 0, %entry ], [ %idx.next, %inner_loop.exit12 ]
133*9880d681SAndroid Build Coastguard Worker  %idx.next = add i32 %idx, 1
134*9880d681SAndroid Build Coastguard Worker  %next = icmp ult i32 %idx.next, %parent.count
135*9880d681SAndroid Build Coastguard Worker  %len.i = load i32, i32* %a_len_ptr, !range !0
136*9880d681SAndroid Build Coastguard Worker  %first.itr.check.i = icmp sgt i32 %n, 0
137*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check.i, label %loop.i, label %exit.i
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerloop.i:                                           ; preds = %in.bounds.i, %loop
140*9880d681SAndroid Build Coastguard Worker  %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %in.bounds.i ]
141*9880d681SAndroid Build Coastguard Worker  %idx.next.i = add i32 %idx.i, 1
142*9880d681SAndroid Build Coastguard Worker  %abc.i = icmp slt i32 %idx.i, %len.i
143*9880d681SAndroid Build Coastguard Worker  br i1 %abc.i, label %in.bounds.i, label %out.of.bounds.i, !prof !1
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerin.bounds.i:                                      ; preds = %loop.i
146*9880d681SAndroid Build Coastguard Worker  %addr.i = getelementptr i32, i32* %arr, i32 %idx.i
147*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr.i
148*9880d681SAndroid Build Coastguard Worker  %next.i = icmp slt i32 %idx.next.i, %n
149*9880d681SAndroid Build Coastguard Worker  br i1 %next.i, label %loop.i, label %exit.i
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerout.of.bounds.i:                                  ; preds = %loop.i
152*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerexit.i:                                           ; preds = %in.bounds.i, %loop
155*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerinner_loop.exit:                                  ; preds = %exit.i, %out.of.bounds.i
158*9880d681SAndroid Build Coastguard Worker  %len.i1 = load i32, i32* %a_len_ptr, !range !0
159*9880d681SAndroid Build Coastguard Worker  %first.itr.check.i2 = icmp sgt i32 %n, 0
160*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check.i2, label %loop.i6, label %exit.i11
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerloop.i6:                                          ; preds = %in.bounds.i9, %inner_loop.exit
163*9880d681SAndroid Build Coastguard Worker  %idx.i3 = phi i32 [ 0, %inner_loop.exit ], [ %idx.next.i4, %in.bounds.i9 ]
164*9880d681SAndroid Build Coastguard Worker  %idx.next.i4 = add i32 %idx.i3, 1
165*9880d681SAndroid Build Coastguard Worker  %abc.i5 = icmp slt i32 %idx.i3, %len.i1
166*9880d681SAndroid Build Coastguard Worker  br i1 %abc.i5, label %in.bounds.i9, label %out.of.bounds.i10, !prof !1
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerin.bounds.i9:                                     ; preds = %loop.i6
169*9880d681SAndroid Build Coastguard Worker  %addr.i7 = getelementptr i32, i32* %arr, i32 %idx.i3
170*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr.i7
171*9880d681SAndroid Build Coastguard Worker  %next.i8 = icmp slt i32 %idx.next.i4, %n
172*9880d681SAndroid Build Coastguard Worker  br i1 %next.i8, label %loop.i6, label %exit.i11
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerout.of.bounds.i10:                                ; preds = %loop.i6
175*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit12
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerexit.i11:                                         ; preds = %in.bounds.i9, %inner_loop.exit
178*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit12
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerinner_loop.exit12:                                ; preds = %exit.i11, %out.of.bounds.i10
181*9880d681SAndroid Build Coastguard Worker  br i1 %next, label %loop, label %exit
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workerexit:                                             ; preds = %inner_loop.exit12
184*9880d681SAndroid Build Coastguard Worker  ret void
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; Function Attrs: alwaysinline
188*9880d681SAndroid Build Coastguard Workerdefine void @with_cousin(i32* %arr, i32* %a_len_ptr, i32 %n, i32 %parent.count, i32 %grandparent.count) #0 {
189*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function with_cousin: constrained Loop at depth 3 containing: %loop.i.i<header><exiting>,%in.bounds.i.i<latch><exiting>
190*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function with_cousin: constrained Loop at depth 3 containing: %loop.i.i10<header><exiting>,%in.bounds.i.i13<latch><exiting>
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerentry:
193*9880d681SAndroid Build Coastguard Worker  br label %loop
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerloop:                                             ; preds = %with_parent.exit17, %entry
196*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ 0, %entry ], [ %idx.next, %with_parent.exit17 ]
197*9880d681SAndroid Build Coastguard Worker  %idx.next = add i32 %idx, 1
198*9880d681SAndroid Build Coastguard Worker  %next = icmp ult i32 %idx.next, %grandparent.count
199*9880d681SAndroid Build Coastguard Worker  br label %loop.i
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerloop.i:                                           ; preds = %inner_loop.exit.i, %loop
202*9880d681SAndroid Build Coastguard Worker  %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %inner_loop.exit.i ]
203*9880d681SAndroid Build Coastguard Worker  %idx.next.i = add i32 %idx.i, 1
204*9880d681SAndroid Build Coastguard Worker  %next.i = icmp ult i32 %idx.next.i, %parent.count
205*9880d681SAndroid Build Coastguard Worker  %len.i.i = load i32, i32* %a_len_ptr, !range !0
206*9880d681SAndroid Build Coastguard Worker  %first.itr.check.i.i = icmp sgt i32 %n, 0
207*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check.i.i, label %loop.i.i, label %exit.i.i
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerloop.i.i:                                         ; preds = %in.bounds.i.i, %loop.i
210*9880d681SAndroid Build Coastguard Worker  %idx.i.i = phi i32 [ 0, %loop.i ], [ %idx.next.i.i, %in.bounds.i.i ]
211*9880d681SAndroid Build Coastguard Worker  %idx.next.i.i = add i32 %idx.i.i, 1
212*9880d681SAndroid Build Coastguard Worker  %abc.i.i = icmp slt i32 %idx.i.i, %len.i.i
213*9880d681SAndroid Build Coastguard Worker  br i1 %abc.i.i, label %in.bounds.i.i, label %out.of.bounds.i.i, !prof !1
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerin.bounds.i.i:                                    ; preds = %loop.i.i
216*9880d681SAndroid Build Coastguard Worker  %addr.i.i = getelementptr i32, i32* %arr, i32 %idx.i.i
217*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr.i.i
218*9880d681SAndroid Build Coastguard Worker  %next.i.i = icmp slt i32 %idx.next.i.i, %n
219*9880d681SAndroid Build Coastguard Worker  br i1 %next.i.i, label %loop.i.i, label %exit.i.i
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerout.of.bounds.i.i:                                ; preds = %loop.i.i
222*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit.i
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Workerexit.i.i:                                         ; preds = %in.bounds.i.i, %loop.i
225*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit.i
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerinner_loop.exit.i:                                ; preds = %exit.i.i, %out.of.bounds.i.i
228*9880d681SAndroid Build Coastguard Worker  br i1 %next.i, label %loop.i, label %with_parent.exit
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerwith_parent.exit:                                 ; preds = %inner_loop.exit.i
231*9880d681SAndroid Build Coastguard Worker  br label %loop.i6
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Workerloop.i6:                                          ; preds = %inner_loop.exit.i16, %with_parent.exit
234*9880d681SAndroid Build Coastguard Worker  %idx.i1 = phi i32 [ 0, %with_parent.exit ], [ %idx.next.i2, %inner_loop.exit.i16 ]
235*9880d681SAndroid Build Coastguard Worker  %idx.next.i2 = add i32 %idx.i1, 1
236*9880d681SAndroid Build Coastguard Worker  %next.i3 = icmp ult i32 %idx.next.i2, %parent.count
237*9880d681SAndroid Build Coastguard Worker  %len.i.i4 = load i32, i32* %a_len_ptr, !range !0
238*9880d681SAndroid Build Coastguard Worker  %first.itr.check.i.i5 = icmp sgt i32 %n, 0
239*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check.i.i5, label %loop.i.i10, label %exit.i.i15
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Workerloop.i.i10:                                       ; preds = %in.bounds.i.i13, %loop.i6
242*9880d681SAndroid Build Coastguard Worker  %idx.i.i7 = phi i32 [ 0, %loop.i6 ], [ %idx.next.i.i8, %in.bounds.i.i13 ]
243*9880d681SAndroid Build Coastguard Worker  %idx.next.i.i8 = add i32 %idx.i.i7, 1
244*9880d681SAndroid Build Coastguard Worker  %abc.i.i9 = icmp slt i32 %idx.i.i7, %len.i.i4
245*9880d681SAndroid Build Coastguard Worker  br i1 %abc.i.i9, label %in.bounds.i.i13, label %out.of.bounds.i.i14, !prof !1
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Workerin.bounds.i.i13:                                  ; preds = %loop.i.i10
248*9880d681SAndroid Build Coastguard Worker  %addr.i.i11 = getelementptr i32, i32* %arr, i32 %idx.i.i7
249*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr.i.i11
250*9880d681SAndroid Build Coastguard Worker  %next.i.i12 = icmp slt i32 %idx.next.i.i8, %n
251*9880d681SAndroid Build Coastguard Worker  br i1 %next.i.i12, label %loop.i.i10, label %exit.i.i15
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerout.of.bounds.i.i14:                              ; preds = %loop.i.i10
254*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit.i16
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Workerexit.i.i15:                                       ; preds = %in.bounds.i.i13, %loop.i6
257*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit.i16
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerinner_loop.exit.i16:                              ; preds = %exit.i.i15, %out.of.bounds.i.i14
260*9880d681SAndroid Build Coastguard Worker  br i1 %next.i3, label %loop.i6, label %with_parent.exit17
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Workerwith_parent.exit17:                               ; preds = %inner_loop.exit.i16
263*9880d681SAndroid Build Coastguard Worker  br i1 %next, label %loop, label %exit
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Workerexit:                                             ; preds = %with_parent.exit17
266*9880d681SAndroid Build Coastguard Worker  ret void
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; Function Attrs: alwaysinline
270*9880d681SAndroid Build Coastguard Workerdefine void @with_uncle(i32* %arr, i32* %a_len_ptr, i32 %n, i32 %parent.count, i32 %grandparent.count) #0 {
271*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function with_uncle: constrained Loop at depth 2 containing: %loop.i<header><exiting>,%in.bounds.i<latch><exiting>
272*9880d681SAndroid Build Coastguard Worker; CHECK: irce: in function with_uncle: constrained Loop at depth 3 containing: %loop.i.i<header><exiting>,%in.bounds.i.i<latch><exiting>
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Workerentry:
275*9880d681SAndroid Build Coastguard Worker  br label %loop
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerloop:                                             ; preds = %with_parent.exit, %entry
278*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ 0, %entry ], [ %idx.next, %with_parent.exit ]
279*9880d681SAndroid Build Coastguard Worker  %idx.next = add i32 %idx, 1
280*9880d681SAndroid Build Coastguard Worker  %next = icmp ult i32 %idx.next, %grandparent.count
281*9880d681SAndroid Build Coastguard Worker  %len.i = load i32, i32* %a_len_ptr, !range !0
282*9880d681SAndroid Build Coastguard Worker  %first.itr.check.i = icmp sgt i32 %n, 0
283*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check.i, label %loop.i, label %exit.i
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerloop.i:                                           ; preds = %in.bounds.i, %loop
286*9880d681SAndroid Build Coastguard Worker  %idx.i = phi i32 [ 0, %loop ], [ %idx.next.i, %in.bounds.i ]
287*9880d681SAndroid Build Coastguard Worker  %idx.next.i = add i32 %idx.i, 1
288*9880d681SAndroid Build Coastguard Worker  %abc.i = icmp slt i32 %idx.i, %len.i
289*9880d681SAndroid Build Coastguard Worker  br i1 %abc.i, label %in.bounds.i, label %out.of.bounds.i, !prof !1
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerin.bounds.i:                                      ; preds = %loop.i
292*9880d681SAndroid Build Coastguard Worker  %addr.i = getelementptr i32, i32* %arr, i32 %idx.i
293*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr.i
294*9880d681SAndroid Build Coastguard Worker  %next.i = icmp slt i32 %idx.next.i, %n
295*9880d681SAndroid Build Coastguard Worker  br i1 %next.i, label %loop.i, label %exit.i
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Workerout.of.bounds.i:                                  ; preds = %loop.i
298*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerexit.i:                                           ; preds = %in.bounds.i, %loop
301*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerinner_loop.exit:                                  ; preds = %exit.i, %out.of.bounds.i
304*9880d681SAndroid Build Coastguard Worker  br label %loop.i4
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Workerloop.i4:                                          ; preds = %inner_loop.exit.i, %inner_loop.exit
307*9880d681SAndroid Build Coastguard Worker  %idx.i1 = phi i32 [ 0, %inner_loop.exit ], [ %idx.next.i2, %inner_loop.exit.i ]
308*9880d681SAndroid Build Coastguard Worker  %idx.next.i2 = add i32 %idx.i1, 1
309*9880d681SAndroid Build Coastguard Worker  %next.i3 = icmp ult i32 %idx.next.i2, %parent.count
310*9880d681SAndroid Build Coastguard Worker  %len.i.i = load i32, i32* %a_len_ptr, !range !0
311*9880d681SAndroid Build Coastguard Worker  %first.itr.check.i.i = icmp sgt i32 %n, 0
312*9880d681SAndroid Build Coastguard Worker  br i1 %first.itr.check.i.i, label %loop.i.i, label %exit.i.i
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Workerloop.i.i:                                         ; preds = %in.bounds.i.i, %loop.i4
315*9880d681SAndroid Build Coastguard Worker  %idx.i.i = phi i32 [ 0, %loop.i4 ], [ %idx.next.i.i, %in.bounds.i.i ]
316*9880d681SAndroid Build Coastguard Worker  %idx.next.i.i = add i32 %idx.i.i, 1
317*9880d681SAndroid Build Coastguard Worker  %abc.i.i = icmp slt i32 %idx.i.i, %len.i.i
318*9880d681SAndroid Build Coastguard Worker  br i1 %abc.i.i, label %in.bounds.i.i, label %out.of.bounds.i.i, !prof !1
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Workerin.bounds.i.i:                                    ; preds = %loop.i.i
321*9880d681SAndroid Build Coastguard Worker  %addr.i.i = getelementptr i32, i32* %arr, i32 %idx.i.i
322*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %addr.i.i
323*9880d681SAndroid Build Coastguard Worker  %next.i.i = icmp slt i32 %idx.next.i.i, %n
324*9880d681SAndroid Build Coastguard Worker  br i1 %next.i.i, label %loop.i.i, label %exit.i.i
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Workerout.of.bounds.i.i:                                ; preds = %loop.i.i
327*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit.i
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Workerexit.i.i:                                         ; preds = %in.bounds.i.i, %loop.i4
330*9880d681SAndroid Build Coastguard Worker  br label %inner_loop.exit.i
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Workerinner_loop.exit.i:                                ; preds = %exit.i.i, %out.of.bounds.i.i
333*9880d681SAndroid Build Coastguard Worker  br i1 %next.i3, label %loop.i4, label %with_parent.exit
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Workerwith_parent.exit:                                 ; preds = %inner_loop.exit.i
336*9880d681SAndroid Build Coastguard Worker  br i1 %next, label %loop, label %exit
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Workerexit:                                             ; preds = %with_parent.exit
339*9880d681SAndroid Build Coastguard Worker  ret void
340*9880d681SAndroid Build Coastguard Worker}
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Workerattributes #0 = { alwaysinline }
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker!0 = !{i32 0, i32 2147483647}
345*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 64, i32 4}
346