Skip to content

Commit e30576f

Browse files
committed
Add tests
1 parent 025541d commit e30576f

File tree

3 files changed

+837
-1
lines changed

3 files changed

+837
-1
lines changed
Lines changed: 398 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,398 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S < %s -p loop-vectorize -enable-early-exit-vectorization | FileCheck %s
3+
4+
target triple = "aarch64-unknown-linux-gnu"
5+
6+
declare void @init_mem(ptr, i64);
7+
8+
9+
define i64 @same_exit_block_no_live_outs_one_faulting_ptr(ptr %p1) #0 {
10+
; CHECK-LABEL: define i64 @same_exit_block_no_live_outs_one_faulting_ptr(
11+
; CHECK-SAME: ptr [[P1:%.*]]) #[[ATTR0:[0-9]+]] {
12+
; CHECK-NEXT: entry:
13+
; CHECK-NEXT: br label [[LOOP1:%.*]]
14+
; CHECK: loop:
15+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
16+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
17+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
18+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], 3
19+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
20+
; CHECK: loop.inc:
21+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
22+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
23+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP1]], label [[LOOP_END]]
24+
; CHECK: loop.end:
25+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 1, [[LOOP1]] ], [ 0, [[LOOP_INC]] ]
26+
; CHECK-NEXT: ret i64 [[RETVAL]]
27+
;
28+
entry:
29+
br label %loop
30+
31+
loop:
32+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
33+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
34+
%ld1 = load i8, ptr %arrayidx, align 1
35+
%cmp3 = icmp eq i8 %ld1, 3
36+
br i1 %cmp3, label %loop.inc, label %loop.end
37+
38+
loop.inc:
39+
%index.next = add i64 %index, 1
40+
%exitcond = icmp ne i64 %index.next, 67
41+
br i1 %exitcond, label %loop, label %loop.end
42+
43+
loop.end:
44+
%retval = phi i64 [ 1, %loop ], [ 0, %loop.inc ]
45+
ret i64 %retval
46+
}
47+
48+
49+
define i64 @same_exit_block_pre_inc_use1_too_small_allocas() #0 {
50+
; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_too_small_allocas(
51+
; CHECK-SAME: ) #[[ATTR0]] {
52+
; CHECK-NEXT: entry:
53+
; CHECK-NEXT: [[P1:%.*]] = alloca [42 x i8], align 4
54+
; CHECK-NEXT: [[P2:%.*]] = alloca [42 x i8], align 4
55+
; CHECK-NEXT: call void @init_mem(ptr [[P1]], i64 1024)
56+
; CHECK-NEXT: call void @init_mem(ptr [[P2]], i64 1024)
57+
; CHECK-NEXT: br label [[LOOP:%.*]]
58+
; CHECK: loop:
59+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
60+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
61+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
62+
; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
63+
; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
64+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
65+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
66+
; CHECK: loop.inc:
67+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
68+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
69+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
70+
; CHECK: loop.end:
71+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
72+
; CHECK-NEXT: ret i64 [[RETVAL]]
73+
;
74+
entry:
75+
%p1 = alloca [42 x i8]
76+
%p2 = alloca [42 x i8]
77+
call void @init_mem(ptr %p1, i64 1024)
78+
call void @init_mem(ptr %p2, i64 1024)
79+
br label %loop
80+
81+
loop:
82+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
83+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
84+
%ld1 = load i8, ptr %arrayidx, align 1
85+
%arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
86+
%ld2 = load i8, ptr %arrayidx1, align 1
87+
%cmp3 = icmp eq i8 %ld1, %ld2
88+
br i1 %cmp3, label %loop.inc, label %loop.end
89+
90+
loop.inc:
91+
%index.next = add i64 %index, 1
92+
%exitcond = icmp ne i64 %index.next, 67
93+
br i1 %exitcond, label %loop, label %loop.end
94+
95+
loop.end:
96+
%retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
97+
ret i64 %retval
98+
}
99+
100+
101+
define i64 @same_exit_block_pre_inc_use1_too_small_deref_ptrs(ptr dereferenceable(42) %p1, ptr dereferenceable(42) %p2) #0 {
102+
; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_too_small_deref_ptrs(
103+
; CHECK-SAME: ptr dereferenceable(42) [[P1:%.*]], ptr dereferenceable(42) [[P2:%.*]]) #[[ATTR0]] {
104+
; CHECK-NEXT: entry:
105+
; CHECK-NEXT: br label [[LOOP:%.*]]
106+
; CHECK: loop:
107+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
108+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
109+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
110+
; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
111+
; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
112+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
113+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
114+
; CHECK: loop.inc:
115+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
116+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
117+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
118+
; CHECK: loop.end:
119+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
120+
; CHECK-NEXT: ret i64 [[RETVAL]]
121+
;
122+
entry:
123+
br label %loop
124+
125+
loop:
126+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
127+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
128+
%ld1 = load i8, ptr %arrayidx, align 1
129+
%arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
130+
%ld2 = load i8, ptr %arrayidx1, align 1
131+
%cmp3 = icmp eq i8 %ld1, %ld2
132+
br i1 %cmp3, label %loop.inc, label %loop.end
133+
134+
loop.inc:
135+
%index.next = add i64 %index, 1
136+
%exitcond = icmp ne i64 %index.next, 67
137+
br i1 %exitcond, label %loop, label %loop.end
138+
139+
loop.end:
140+
%retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
141+
ret i64 %retval
142+
}
143+
144+
145+
define i64 @same_exit_block_pre_inc_use1_unknown_ptrs(ptr %p1, ptr %p2) #0 {
146+
; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_unknown_ptrs(
147+
; CHECK-SAME: ptr [[P1:%.*]], ptr [[P2:%.*]]) #[[ATTR0]] {
148+
; CHECK-NEXT: entry:
149+
; CHECK-NEXT: br label [[LOOP:%.*]]
150+
; CHECK: loop:
151+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
152+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
153+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
154+
; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
155+
; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
156+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
157+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
158+
; CHECK: loop.inc:
159+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
160+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
161+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
162+
; CHECK: loop.end:
163+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
164+
; CHECK-NEXT: ret i64 [[RETVAL]]
165+
;
166+
entry:
167+
br label %loop
168+
169+
loop:
170+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
171+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
172+
%ld1 = load i8, ptr %arrayidx, align 1
173+
%arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
174+
%ld2 = load i8, ptr %arrayidx1, align 1
175+
%cmp3 = icmp eq i8 %ld1, %ld2
176+
br i1 %cmp3, label %loop.inc, label %loop.end
177+
178+
loop.inc:
179+
%index.next = add i64 %index, 1
180+
%exitcond = icmp ne i64 %index.next, 67
181+
br i1 %exitcond, label %loop, label %loop.end
182+
183+
loop.end:
184+
%retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
185+
ret i64 %retval
186+
}
187+
188+
189+
define i64 @same_exit_block_no_live_outs_one_faulting_ptr_stride2(ptr %p1) #0 {
190+
; CHECK-LABEL: define i64 @same_exit_block_no_live_outs_one_faulting_ptr_stride2(
191+
; CHECK-SAME: ptr [[P1:%.*]]) #[[ATTR0]] {
192+
; CHECK-NEXT: entry:
193+
; CHECK-NEXT: br label [[LOOP:%.*]]
194+
; CHECK: loop:
195+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
196+
; CHECK-NEXT: [[STRIDE2:%.*]] = mul i64 [[INDEX]], 2
197+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[STRIDE2]]
198+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
199+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], 3
200+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
201+
; CHECK: loop.inc:
202+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
203+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
204+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
205+
; CHECK: loop.end:
206+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 1, [[LOOP]] ], [ 0, [[LOOP_INC]] ]
207+
; CHECK-NEXT: ret i64 [[RETVAL]]
208+
;
209+
entry:
210+
br label %loop
211+
212+
loop:
213+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
214+
%stride2 = mul i64 %index, 2
215+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %stride2
216+
%ld1 = load i8, ptr %arrayidx, align 1
217+
%cmp3 = icmp eq i8 %ld1, 3
218+
br i1 %cmp3, label %loop.inc, label %loop.end
219+
220+
loop.inc:
221+
%index.next = add i64 %index, 1
222+
%exitcond = icmp ne i64 %index.next, 67
223+
br i1 %exitcond, label %loop, label %loop.end
224+
225+
loop.end:
226+
%retval = phi i64 [ 1, %loop ], [ 0, %loop.inc ]
227+
ret i64 %retval
228+
}
229+
230+
231+
define i64 @same_exit_block_no_live_outs_one_faulting_ptr_stride_unknown(ptr %p1, i64 %stride) #0 {
232+
; CHECK-LABEL: define i64 @same_exit_block_no_live_outs_one_faulting_ptr_stride_unknown(
233+
; CHECK-SAME: ptr [[P1:%.*]], i64 [[STRIDE:%.*]]) #[[ATTR0]] {
234+
; CHECK-NEXT: entry:
235+
; CHECK-NEXT: br label [[LOOP:%.*]]
236+
; CHECK: loop:
237+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
238+
; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[INDEX]], [[STRIDE]]
239+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[MUL]]
240+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
241+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], 3
242+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
243+
; CHECK: loop.inc:
244+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
245+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
246+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
247+
; CHECK: loop.end:
248+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 1, [[LOOP]] ], [ 0, [[LOOP_INC]] ]
249+
; CHECK-NEXT: ret i64 [[RETVAL]]
250+
;
251+
entry:
252+
br label %loop
253+
254+
loop:
255+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
256+
%mul = mul i64 %index, %stride
257+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %mul
258+
%ld1 = load i8, ptr %arrayidx, align 1
259+
%cmp3 = icmp eq i8 %ld1, 3
260+
br i1 %cmp3, label %loop.inc, label %loop.end
261+
262+
loop.inc:
263+
%index.next = add i64 %index, 1
264+
%exitcond = icmp ne i64 %index.next, 67
265+
br i1 %exitcond, label %loop, label %loop.end
266+
267+
loop.end:
268+
%retval = phi i64 [ 1, %loop ], [ 0, %loop.inc ]
269+
ret i64 %retval
270+
}
271+
272+
273+
define i64 @same_exit_block_no_live_outs_one_faulting_ptr_no_vscale_range(ptr %p1, i64 %stride) #1 {
274+
; CHECK-LABEL: define i64 @same_exit_block_no_live_outs_one_faulting_ptr_no_vscale_range(
275+
; CHECK-SAME: ptr [[P1:%.*]], i64 [[STRIDE:%.*]]) #[[ATTR1:[0-9]+]] {
276+
; CHECK-NEXT: entry:
277+
; CHECK-NEXT: br label [[LOOP:%.*]]
278+
; CHECK: loop:
279+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
280+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
281+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
282+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], 3
283+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
284+
; CHECK: loop.inc:
285+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
286+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
287+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
288+
; CHECK: loop.end:
289+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 1, [[LOOP]] ], [ 0, [[LOOP_INC]] ]
290+
; CHECK-NEXT: ret i64 [[RETVAL]]
291+
;
292+
entry:
293+
br label %loop
294+
295+
loop:
296+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
297+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
298+
%ld1 = load i8, ptr %arrayidx, align 1
299+
%cmp3 = icmp eq i8 %ld1, 3
300+
br i1 %cmp3, label %loop.inc, label %loop.end
301+
302+
loop.inc:
303+
%index.next = add i64 %index, 1
304+
%exitcond = icmp ne i64 %index.next, 67
305+
br i1 %exitcond, label %loop, label %loop.end
306+
307+
loop.end:
308+
%retval = phi i64 [ 1, %loop ], [ 0, %loop.inc ]
309+
ret i64 %retval
310+
}
311+
312+
313+
define i64 @same_exit_block_no_live_outs_one_faulting_ptr_stride_too_low(ptr %p1) #0 {
314+
; CHECK-LABEL: define i64 @same_exit_block_no_live_outs_one_faulting_ptr_stride_too_low(
315+
; CHECK-SAME: ptr [[P1:%.*]]) #[[ATTR0]] {
316+
; CHECK-NEXT: entry:
317+
; CHECK-NEXT: br label [[LOOP:%.*]]
318+
; CHECK: loop:
319+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
320+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
321+
; CHECK-NEXT: [[LD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
322+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i32 [[LD1]], 3
323+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
324+
; CHECK: loop.inc:
325+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
326+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
327+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
328+
; CHECK: loop.end:
329+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 1, [[LOOP]] ], [ 0, [[LOOP_INC]] ]
330+
; CHECK-NEXT: ret i64 [[RETVAL]]
331+
;
332+
entry:
333+
br label %loop
334+
335+
loop:
336+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
337+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
338+
%ld1 = load i32, ptr %arrayidx, align 4
339+
%cmp3 = icmp eq i32 %ld1, 3
340+
br i1 %cmp3, label %loop.inc, label %loop.end
341+
342+
loop.inc:
343+
%index.next = add i64 %index, 1
344+
%exitcond = icmp ne i64 %index.next, 67
345+
br i1 %exitcond, label %loop, label %loop.end
346+
347+
loop.end:
348+
%retval = phi i64 [ 1, %loop ], [ 0, %loop.inc ]
349+
ret i64 %retval
350+
}
351+
352+
353+
define i64 @same_exit_block_no_live_outs_two_faulting_ptrs(ptr %p1, ptr %p2) #0 {
354+
; CHECK-LABEL: define i64 @same_exit_block_no_live_outs_two_faulting_ptrs(
355+
; CHECK-SAME: ptr [[P1:%.*]], ptr [[P2:%.*]]) #[[ATTR0]] {
356+
; CHECK-NEXT: entry:
357+
; CHECK-NEXT: br label [[LOOP:%.*]]
358+
; CHECK: loop:
359+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
360+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
361+
; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
362+
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
363+
; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1
364+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
365+
; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
366+
; CHECK: loop.inc:
367+
; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
368+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
369+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
370+
; CHECK: loop.end:
371+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ 1, [[LOOP]] ], [ 0, [[LOOP_INC]] ]
372+
; CHECK-NEXT: ret i64 [[RETVAL]]
373+
;
374+
entry:
375+
br label %loop
376+
377+
loop:
378+
%index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
379+
%arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
380+
%ld1 = load i8, ptr %arrayidx, align 1
381+
%arrayidx2 = getelementptr inbounds i8, ptr %p2, i64 %index
382+
%ld2 = load i8, ptr %arrayidx2, align 1
383+
%cmp3 = icmp eq i8 %ld1, %ld2
384+
br i1 %cmp3, label %loop.inc, label %loop.end
385+
386+
loop.inc:
387+
%index.next = add i64 %index, 1
388+
%exitcond = icmp ne i64 %index.next, 67
389+
br i1 %exitcond, label %loop, label %loop.end
390+
391+
loop.end:
392+
%retval = phi i64 [ 1, %loop ], [ 0, %loop.inc ]
393+
ret i64 %retval
394+
}
395+
396+
397+
attributes #0 = { "target-features"="+sve" vscale_range(1,16) }
398+
attributes #1 = { "target-features"="+sve" }

0 commit comments

Comments
 (0)