Skip to content

Commit 1c702d3

Browse files
committed
[SCEV] Add tests where one wrap predicate implies another.
1 parent 3920972 commit 1c702d3

File tree

1 file changed

+337
-0
lines changed

1 file changed

+337
-0
lines changed
Lines changed: 337 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,337 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes='print<access-info>' %s -disable-output 2>&1 | FileCheck %s
3+
4+
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
5+
6+
; FIXME: {0,+,3} implies {0,+,2}.
7+
define void @wrap_check_iv.3_implies_iv.2(i32 noundef %N, ptr %dst, ptr %src) {
8+
; CHECK-LABEL: 'wrap_check_iv.3_implies_iv.2'
9+
; CHECK-NEXT: loop:
10+
; CHECK-NEXT: Memory dependences are safe with run-time checks
11+
; CHECK-NEXT: Dependences:
12+
; CHECK-NEXT: Run-time memory checks:
13+
; CHECK-NEXT: Check 0:
14+
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
15+
; CHECK-NEXT: %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
16+
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
17+
; CHECK-NEXT: %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
18+
; CHECK-NEXT: Grouped accesses:
19+
; CHECK-NEXT: Group [[GRP1]]:
20+
; CHECK-NEXT: (Low: %dst High: (4 + (12 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %dst))
21+
; CHECK-NEXT: Member: {%dst,+,12}<%loop>
22+
; CHECK-NEXT: Group [[GRP2]]:
23+
; CHECK-NEXT: (Low: %src High: (4 + (8 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %src))
24+
; CHECK-NEXT: Member: {%src,+,8}<%loop>
25+
; CHECK-EMPTY:
26+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
27+
; CHECK-NEXT: SCEV assumptions:
28+
; CHECK-NEXT: {0,+,3}<%loop> Added Flags: <nssw>
29+
; CHECK-NEXT: {0,+,2}<%loop> Added Flags: <nssw>
30+
; CHECK-EMPTY:
31+
; CHECK-NEXT: Expressions re-written:
32+
; CHECK-NEXT: [PSE] %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2:
33+
; CHECK-NEXT: ((4 * (sext i32 {0,+,2}<%loop> to i64))<nsw> + %src)
34+
; CHECK-NEXT: --> {%src,+,8}<%loop>
35+
; CHECK-NEXT: [PSE] %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3:
36+
; CHECK-NEXT: ((4 * (sext i32 {0,+,3}<%loop> to i64))<nsw> + %dst)
37+
; CHECK-NEXT: --> {%dst,+,12}<%loop>
38+
;
39+
entry:
40+
br label %loop
41+
42+
loop:
43+
%iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop ]
44+
%iv.2 = phi i32 [ 0, %entry ], [ %iv.2.next, %loop ]
45+
%iv.3 = phi i32 [ 0, %entry ], [ %iv.3.next, %loop ]
46+
%ext.iv.2 = sext i32 %iv.2 to i64
47+
%gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
48+
%l = load i32, ptr %gep.iv.2, align 4
49+
%ext.iv.3 = sext i32 %iv.3 to i64
50+
%gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
51+
store i32 %l, ptr %gep.iv.3, align 4
52+
%iv.1.next = add nuw nsw i32 %iv.1, 1
53+
%iv.2.next = add i32 %iv.2, 2
54+
%iv.3.next = add i32 %iv.3, 3
55+
%ec = icmp eq i32 %iv.1.next, %N
56+
br i1 %ec, label %exit, label %loop
57+
58+
exit:
59+
ret void
60+
}
61+
62+
; FIXME: {2,+,2} implies {0,+,2}.
63+
define void @wrap_check_iv.3_implies_iv.2_different_start(i32 noundef %N, ptr %dst, ptr %src) {
64+
; CHECK-LABEL: 'wrap_check_iv.3_implies_iv.2_different_start'
65+
; CHECK-NEXT: loop:
66+
; CHECK-NEXT: Memory dependences are safe with run-time checks
67+
; CHECK-NEXT: Dependences:
68+
; CHECK-NEXT: Run-time memory checks:
69+
; CHECK-NEXT: Check 0:
70+
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
71+
; CHECK-NEXT: %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
72+
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
73+
; CHECK-NEXT: %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
74+
; CHECK-NEXT: Grouped accesses:
75+
; CHECK-NEXT: Group [[GRP3]]:
76+
; CHECK-NEXT: (Low: (12 + %dst) High: (16 + (8 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %dst))
77+
; CHECK-NEXT: Member: {(12 + %dst),+,8}<%loop>
78+
; CHECK-NEXT: Group [[GRP4]]:
79+
; CHECK-NEXT: (Low: %src High: (4 + (8 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %src))
80+
; CHECK-NEXT: Member: {%src,+,8}<%loop>
81+
; CHECK-EMPTY:
82+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
83+
; CHECK-NEXT: SCEV assumptions:
84+
; CHECK-NEXT: {2,+,2}<%loop> Added Flags: <nssw>
85+
; CHECK-NEXT: {0,+,2}<%loop> Added Flags: <nssw>
86+
; CHECK-EMPTY:
87+
; CHECK-NEXT: Expressions re-written:
88+
; CHECK-NEXT: [PSE] %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2:
89+
; CHECK-NEXT: ((4 * (sext i32 {0,+,2}<%loop> to i64))<nsw> + %src)
90+
; CHECK-NEXT: --> {%src,+,8}<%loop>
91+
; CHECK-NEXT: [PSE] %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3:
92+
; CHECK-NEXT: (4 + (4 * (sext i32 {2,+,2}<%loop> to i64))<nsw> + %dst)
93+
; CHECK-NEXT: --> {(12 + %dst),+,8}<%loop>
94+
;
95+
entry:
96+
br label %loop
97+
98+
loop:
99+
%iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop ]
100+
%iv.2 = phi i32 [ 0, %entry ], [ %iv.2.next, %loop ]
101+
%iv.3 = phi i32 [ 3, %entry ], [ %iv.3.next, %loop ]
102+
%ext.iv.2 = sext i32 %iv.2 to i64
103+
%gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
104+
%l = load i32, ptr %gep.iv.2, align 4
105+
%ext.iv.3 = sext i32 %iv.3 to i64
106+
%gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
107+
store i32 %l, ptr %gep.iv.3, align 4
108+
%iv.1.next = add nuw nsw i32 %iv.1, 1
109+
%iv.2.next = add i32 %iv.2, 2
110+
%iv.3.next = add i32 %iv.3, 2
111+
%ec = icmp eq i32 %iv.1.next, %N
112+
br i1 %ec, label %exit, label %loop
113+
114+
exit:
115+
ret void
116+
}
117+
118+
; FIXME: {0,+,3} implies {0,+,2}.
119+
define void @wrap_check_iv.3_implies_iv.2_predicates_added_in_different_order(i32 noundef %N, ptr %dst, ptr %src) {
120+
; CHECK-LABEL: 'wrap_check_iv.3_implies_iv.2_predicates_added_in_different_order'
121+
; CHECK-NEXT: loop:
122+
; CHECK-NEXT: Memory dependences are safe with run-time checks
123+
; CHECK-NEXT: Dependences:
124+
; CHECK-NEXT: Run-time memory checks:
125+
; CHECK-NEXT: Check 0:
126+
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
127+
; CHECK-NEXT: %gep.iv.2 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.2
128+
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
129+
; CHECK-NEXT: %gep.iv.3 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.3
130+
; CHECK-NEXT: Grouped accesses:
131+
; CHECK-NEXT: Group [[GRP5]]:
132+
; CHECK-NEXT: (Low: %dst High: (4 + (8 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %dst))
133+
; CHECK-NEXT: Member: {%dst,+,8}<%loop>
134+
; CHECK-NEXT: Group [[GRP6]]:
135+
; CHECK-NEXT: (Low: %src High: (4 + (12 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %src))
136+
; CHECK-NEXT: Member: {%src,+,12}<%loop>
137+
; CHECK-EMPTY:
138+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
139+
; CHECK-NEXT: SCEV assumptions:
140+
; CHECK-NEXT: {0,+,2}<%loop> Added Flags: <nssw>
141+
; CHECK-NEXT: {0,+,3}<%loop> Added Flags: <nssw>
142+
; CHECK-EMPTY:
143+
; CHECK-NEXT: Expressions re-written:
144+
; CHECK-NEXT: [PSE] %gep.iv.3 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.3:
145+
; CHECK-NEXT: ((4 * (sext i32 {0,+,3}<%loop> to i64))<nsw> + %src)
146+
; CHECK-NEXT: --> {%src,+,12}<%loop>
147+
; CHECK-NEXT: [PSE] %gep.iv.2 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.2:
148+
; CHECK-NEXT: ((4 * (sext i32 {0,+,2}<%loop> to i64))<nsw> + %dst)
149+
; CHECK-NEXT: --> {%dst,+,8}<%loop>
150+
;
151+
entry:
152+
br label %loop
153+
154+
loop:
155+
%iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop ]
156+
%iv.2 = phi i32 [ 0, %entry ], [ %iv.2.next, %loop ]
157+
%iv.3 = phi i32 [ 0, %entry ], [ %iv.3.next, %loop ]
158+
%ext.iv.3 = sext i32 %iv.3 to i64
159+
%gep.iv.3 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.3
160+
%l = load i32, ptr %gep.iv.3, align 4
161+
%ext.iv.2 = sext i32 %iv.2 to i64
162+
%gep.iv.2 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.2
163+
store i32 %l, ptr %gep.iv.2, align 4
164+
%iv.1.next = add nuw nsw i32 %iv.1, 1
165+
%iv.2.next = add i32 %iv.2, 2
166+
%iv.3.next = add i32 %iv.3, 3
167+
%ec = icmp eq i32 %iv.1.next, %N
168+
br i1 %ec, label %exit, label %loop
169+
170+
exit:
171+
ret void
172+
}
173+
174+
define void @wrap_check_iv.3_does_not_implies_iv.2_due_to_start(i32 noundef %N, ptr %dst, ptr %src) {
175+
; CHECK-LABEL: 'wrap_check_iv.3_does_not_implies_iv.2_due_to_start'
176+
; CHECK-NEXT: loop:
177+
; CHECK-NEXT: Memory dependences are safe with run-time checks
178+
; CHECK-NEXT: Dependences:
179+
; CHECK-NEXT: Run-time memory checks:
180+
; CHECK-NEXT: Check 0:
181+
; CHECK-NEXT: Comparing group ([[GRP7:0x[0-9a-f]+]]):
182+
; CHECK-NEXT: %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
183+
; CHECK-NEXT: Against group ([[GRP8:0x[0-9a-f]+]]):
184+
; CHECK-NEXT: %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
185+
; CHECK-NEXT: Grouped accesses:
186+
; CHECK-NEXT: Group [[GRP7]]:
187+
; CHECK-NEXT: (Low: %dst High: (4 + (12 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %dst))
188+
; CHECK-NEXT: Member: {%dst,+,12}<%loop>
189+
; CHECK-NEXT: Group [[GRP8]]:
190+
; CHECK-NEXT: (Low: (40 + %src) High: (44 + (8 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %src))
191+
; CHECK-NEXT: Member: {(40 + %src),+,8}<%loop>
192+
; CHECK-EMPTY:
193+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
194+
; CHECK-NEXT: SCEV assumptions:
195+
; CHECK-NEXT: {0,+,3}<%loop> Added Flags: <nssw>
196+
; CHECK-NEXT: {10,+,2}<%loop> Added Flags: <nssw>
197+
; CHECK-EMPTY:
198+
; CHECK-NEXT: Expressions re-written:
199+
; CHECK-NEXT: [PSE] %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2:
200+
; CHECK-NEXT: ((4 * (sext i32 {10,+,2}<%loop> to i64))<nsw> + %src)
201+
; CHECK-NEXT: --> {(40 + %src),+,8}<%loop>
202+
; CHECK-NEXT: [PSE] %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3:
203+
; CHECK-NEXT: ((4 * (sext i32 {0,+,3}<%loop> to i64))<nsw> + %dst)
204+
; CHECK-NEXT: --> {%dst,+,12}<%loop>
205+
;
206+
entry:
207+
br label %loop
208+
209+
loop:
210+
%iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop ]
211+
%iv.2 = phi i32 [ 10, %entry ], [ %iv.2.next, %loop ]
212+
%iv.3 = phi i32 [ 0, %entry ], [ %iv.3.next, %loop ]
213+
%ext.iv.2 = sext i32 %iv.2 to i64
214+
%gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
215+
%l = load i32, ptr %gep.iv.2, align 4
216+
%ext.iv.3 = sext i32 %iv.3 to i64
217+
%gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
218+
store i32 %l, ptr %gep.iv.3, align 4
219+
%iv.1.next = add nuw nsw i32 %iv.1, 1
220+
%iv.2.next = add i32 %iv.2, 2
221+
%iv.3.next = add i32 %iv.3, 3
222+
%ec = icmp eq i32 %iv.1.next, %N
223+
br i1 %ec, label %exit, label %loop
224+
225+
exit:
226+
ret void
227+
}
228+
229+
define void @wrap_check_iv.3_does_not_imply_iv.2_due_to_start_negative(i32 noundef %N, ptr %dst, ptr %src) {
230+
; CHECK-LABEL: 'wrap_check_iv.3_does_not_imply_iv.2_due_to_start_negative'
231+
; CHECK-NEXT: loop:
232+
; CHECK-NEXT: Memory dependences are safe with run-time checks
233+
; CHECK-NEXT: Dependences:
234+
; CHECK-NEXT: Run-time memory checks:
235+
; CHECK-NEXT: Check 0:
236+
; CHECK-NEXT: Comparing group ([[GRP9:0x[0-9a-f]+]]):
237+
; CHECK-NEXT: %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
238+
; CHECK-NEXT: Against group ([[GRP10:0x[0-9a-f]+]]):
239+
; CHECK-NEXT: %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
240+
; CHECK-NEXT: Grouped accesses:
241+
; CHECK-NEXT: Group [[GRP9]]:
242+
; CHECK-NEXT: (Low: (-4 + %dst) High: ((12 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %dst))
243+
; CHECK-NEXT: Member: {(-4 + %dst),+,12}<%loop>
244+
; CHECK-NEXT: Group [[GRP10]]:
245+
; CHECK-NEXT: (Low: %src High: (4 + (8 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %src))
246+
; CHECK-NEXT: Member: {%src,+,8}<%loop>
247+
; CHECK-EMPTY:
248+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
249+
; CHECK-NEXT: SCEV assumptions:
250+
; CHECK-NEXT: {-1,+,3}<%loop> Added Flags: <nssw>
251+
; CHECK-NEXT: {0,+,2}<%loop> Added Flags: <nssw>
252+
; CHECK-EMPTY:
253+
; CHECK-NEXT: Expressions re-written:
254+
; CHECK-NEXT: [PSE] %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2:
255+
; CHECK-NEXT: ((4 * (sext i32 {0,+,2}<%loop> to i64))<nsw> + %src)
256+
; CHECK-NEXT: --> {%src,+,8}<%loop>
257+
; CHECK-NEXT: [PSE] %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3:
258+
; CHECK-NEXT: ((4 * (sext i32 {-1,+,3}<%loop> to i64))<nsw> + %dst)
259+
; CHECK-NEXT: --> {(-4 + %dst),+,12}<%loop>
260+
;
261+
entry:
262+
br label %loop
263+
264+
loop:
265+
%iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop ]
266+
%iv.2 = phi i32 [ 0, %entry ], [ %iv.2.next, %loop ]
267+
%iv.3 = phi i32 [ -1, %entry ], [ %iv.3.next, %loop ]
268+
%ext.iv.2 = sext i32 %iv.2 to i64
269+
%gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
270+
%l = load i32, ptr %gep.iv.2, align 4
271+
%ext.iv.3 = sext i32 %iv.3 to i64
272+
%gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
273+
store i32 %l, ptr %gep.iv.3, align 4
274+
%iv.1.next = add nuw nsw i32 %iv.1, 1
275+
%iv.2.next = add i32 %iv.2, 2
276+
%iv.3.next = add i32 %iv.3, 3
277+
%ec = icmp eq i32 %iv.1.next, %N
278+
br i1 %ec, label %exit, label %loop
279+
280+
exit:
281+
ret void
282+
}
283+
284+
define void @wrap_check_iv.3_does_not_imply_iv.2_due_to_negative_step(i32 noundef %N, ptr %dst, ptr %src) {
285+
; CHECK-LABEL: 'wrap_check_iv.3_does_not_imply_iv.2_due_to_negative_step'
286+
; CHECK-NEXT: loop:
287+
; CHECK-NEXT: Memory dependences are safe with run-time checks
288+
; CHECK-NEXT: Dependences:
289+
; CHECK-NEXT: Run-time memory checks:
290+
; CHECK-NEXT: Check 0:
291+
; CHECK-NEXT: Comparing group ([[GRP11:0x[0-9a-f]+]]):
292+
; CHECK-NEXT: %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
293+
; CHECK-NEXT: Against group ([[GRP12:0x[0-9a-f]+]]):
294+
; CHECK-NEXT: %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
295+
; CHECK-NEXT: Grouped accesses:
296+
; CHECK-NEXT: Group [[GRP11]]:
297+
; CHECK-NEXT: (Low: ((-4 * (zext i32 (-1 + %N) to i64))<nsw> + %dst) High: (4 + %dst))
298+
; CHECK-NEXT: Member: {%dst,+,-4}<%loop>
299+
; CHECK-NEXT: Group [[GRP12]]:
300+
; CHECK-NEXT: (Low: %src High: (4 + (8 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %src))
301+
; CHECK-NEXT: Member: {%src,+,8}<%loop>
302+
; CHECK-EMPTY:
303+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
304+
; CHECK-NEXT: SCEV assumptions:
305+
; CHECK-NEXT: {0,+,-1}<%loop> Added Flags: <nssw>
306+
; CHECK-NEXT: {0,+,2}<%loop> Added Flags: <nssw>
307+
; CHECK-EMPTY:
308+
; CHECK-NEXT: Expressions re-written:
309+
; CHECK-NEXT: [PSE] %gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2:
310+
; CHECK-NEXT: ((4 * (sext i32 {0,+,2}<%loop> to i64))<nsw> + %src)
311+
; CHECK-NEXT: --> {%src,+,8}<%loop>
312+
; CHECK-NEXT: [PSE] %gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3:
313+
; CHECK-NEXT: ((4 * (sext i32 {0,+,-1}<%loop> to i64))<nsw> + %dst)
314+
; CHECK-NEXT: --> {%dst,+,-4}<%loop>
315+
;
316+
entry:
317+
br label %loop
318+
319+
loop:
320+
%iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop ]
321+
%iv.2 = phi i32 [ 0, %entry ], [ %iv.2.next, %loop ]
322+
%iv.3 = phi i32 [ 0, %entry ], [ %iv.3.next, %loop ]
323+
%ext.iv.2 = sext i32 %iv.2 to i64
324+
%gep.iv.2 = getelementptr inbounds i32, ptr %src, i64 %ext.iv.2
325+
%l = load i32, ptr %gep.iv.2, align 4
326+
%ext.iv.3 = sext i32 %iv.3 to i64
327+
%gep.iv.3 = getelementptr inbounds i32, ptr %dst, i64 %ext.iv.3
328+
store i32 %l, ptr %gep.iv.3, align 4
329+
%iv.1.next = add nuw nsw i32 %iv.1, 1
330+
%iv.2.next = add i32 %iv.2, 2
331+
%iv.3.next = add i32 %iv.3, -1
332+
%ec = icmp eq i32 %iv.1.next, %N
333+
br i1 %ec, label %exit, label %loop
334+
335+
exit:
336+
ret void
337+
}

0 commit comments

Comments
 (0)