Skip to content

Commit 1859b3c

Browse files
committed
[LV] Pre-commit test for predicatedinst-li
1 parent 6f7268e commit 1859b3c

File tree

1 file changed

+290
-0
lines changed

1 file changed

+290
-0
lines changed
Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 5
2+
; RUN: opt -passes=loop-vectorize -force-vector-width=4 -S %s | FileCheck %s
3+
4+
define void @loop_invariant_store(ptr %p, i64 %a, i8 %b) {
5+
; CHECK-LABEL: define void @loop_invariant_store(
6+
; CHECK-SAME: ptr [[P:%.*]], i64 [[A:%.*]], i8 [[B:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*]]:
8+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
9+
; CHECK: [[VECTOR_PH]]:
10+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i8> poison, i8 [[B]], i64 0
11+
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i8> [[BROADCAST_SPLATINSERT]], <4 x i8> poison, <4 x i32> zeroinitializer
12+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT1:%.*]] = insertelement <4 x i64> poison, i64 [[A]], i64 0
13+
; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT1]], <4 x i64> poison, <4 x i32> zeroinitializer
14+
; CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i64> [[BROADCAST_SPLAT2]], splat (i64 48)
15+
; CHECK-NEXT: [[TMP1:%.*]] = ashr <4 x i64> [[TMP0]], splat (i64 52)
16+
; CHECK-NEXT: [[TMP2:%.*]] = trunc <4 x i64> [[TMP1]] to <4 x i32>
17+
; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i8> [[BROADCAST_SPLAT]] to <4 x i32>
18+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
19+
; CHECK: [[VECTOR_BODY]]:
20+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE8:.*]] ]
21+
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE8]] ]
22+
; CHECK-NEXT: [[TMP4:%.*]] = icmp ule <4 x i32> [[VEC_IND]], splat (i32 8)
23+
; CHECK-NEXT: [[TMP5:%.*]] = icmp sge <4 x i32> [[VEC_IND]], splat (i32 2)
24+
; CHECK-NEXT: [[TMP6:%.*]] = select <4 x i1> [[TMP4]], <4 x i1> [[TMP5]], <4 x i1> zeroinitializer
25+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP6]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]]
26+
; CHECK-NEXT: [[TMP7:%.*]] = shl <4 x i32> [[PREDPHI]], splat (i32 8)
27+
; CHECK-NEXT: [[TMP8:%.*]] = trunc <4 x i32> [[TMP7]] to <4 x i8>
28+
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <4 x i1> [[TMP4]], i32 0
29+
; CHECK-NEXT: br i1 [[TMP16]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
30+
; CHECK: [[PRED_STORE_IF]]:
31+
; CHECK-NEXT: [[TMP17:%.*]] = extractelement <4 x i8> [[TMP8]], i32 0
32+
; CHECK-NEXT: store i8 [[TMP17]], ptr [[P]], align 1
33+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
34+
; CHECK: [[PRED_STORE_CONTINUE]]:
35+
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x i1> [[TMP4]], i32 1
36+
; CHECK-NEXT: br i1 [[TMP11]], label %[[PRED_STORE_IF3:.*]], label %[[PRED_STORE_CONTINUE4:.*]]
37+
; CHECK: [[PRED_STORE_IF3]]:
38+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i8> [[TMP8]], i32 1
39+
; CHECK-NEXT: store i8 [[TMP12]], ptr [[P]], align 1
40+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE4]]
41+
; CHECK: [[PRED_STORE_CONTINUE4]]:
42+
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x i1> [[TMP4]], i32 2
43+
; CHECK-NEXT: br i1 [[TMP13]], label %[[PRED_STORE_IF5:.*]], label %[[PRED_STORE_CONTINUE6:.*]]
44+
; CHECK: [[PRED_STORE_IF5]]:
45+
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x i8> [[TMP8]], i32 2
46+
; CHECK-NEXT: store i8 [[TMP14]], ptr [[P]], align 1
47+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE6]]
48+
; CHECK: [[PRED_STORE_CONTINUE6]]:
49+
; CHECK-NEXT: [[TMP15:%.*]] = extractelement <4 x i1> [[TMP4]], i32 3
50+
; CHECK-NEXT: br i1 [[TMP15]], label %[[PRED_STORE_IF7:.*]], label %[[PRED_STORE_CONTINUE8]]
51+
; CHECK: [[PRED_STORE_IF7]]:
52+
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i8> [[TMP8]], i32 3
53+
; CHECK-NEXT: store i8 [[TMP9]], ptr [[P]], align 1
54+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE8]]
55+
; CHECK: [[PRED_STORE_CONTINUE8]]:
56+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
57+
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)
58+
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[INDEX_NEXT]], 12
59+
; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
60+
; CHECK: [[MIDDLE_BLOCK]]:
61+
; CHECK-NEXT: br label %[[EXIT:.*]]
62+
; CHECK: [[SCALAR_PH]]:
63+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, %[[ENTRY]] ]
64+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
65+
; CHECK: [[LOOP_HEADER]]:
66+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP_LATCH:.*]] ]
67+
; CHECK-NEXT: [[ADD]] = add i32 [[IV]], 1
68+
; CHECK-NEXT: [[CMP_SLT:%.*]] = icmp slt i32 [[IV]], 2
69+
; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A]], 48
70+
; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[SHL]], 52
71+
; CHECK-NEXT: [[TRUNC_I32:%.*]] = trunc i64 [[ASHR]] to i32
72+
; CHECK-NEXT: br i1 [[CMP_SLT]], label %[[COND_FALSE:.*]], label %[[LOOP_LATCH]]
73+
; CHECK: [[COND_FALSE]]:
74+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[B]] to i32
75+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
76+
; CHECK: [[LOOP_LATCH]]:
77+
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TRUNC_I32]], %[[LOOP_HEADER]] ], [ [[ZEXT]], %[[COND_FALSE]] ]
78+
; CHECK-NEXT: [[SHL_I32:%.*]] = shl i32 [[COND]], 8
79+
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHL_I32]] to i8
80+
; CHECK-NEXT: store i8 [[TRUNC]], ptr [[P]], align 1
81+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[IV]], 8
82+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP3:![0-9]+]]
83+
; CHECK: [[EXIT]]:
84+
; CHECK-NEXT: ret void
85+
;
86+
entry:
87+
br label %loop.header
88+
89+
loop.header: ; preds = %loop.latch, %entry
90+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
91+
%iv.next = add i32 %iv, 1
92+
%cmp.slt = icmp slt i32 %iv, 2
93+
%shl = shl i64 %a, 48
94+
%ashr = ashr i64 %shl, 52
95+
%trunc.i32 = trunc i64 %ashr to i32
96+
br i1 %cmp.slt, label %cond.false, label %loop.latch
97+
98+
cond.false: ; preds = %loop.header
99+
%zext = zext i8 %b to i32
100+
br label %loop.latch
101+
102+
loop.latch: ; preds = %cond.false, %loop.header
103+
%cond = phi i32 [ %trunc.i32, %loop.header ], [ %zext, %cond.false ]
104+
%shl.i32 = shl i32 %cond, 8
105+
%trunc = trunc i32 %shl.i32 to i8
106+
store i8 %trunc, ptr %p, align 1
107+
%exitcond = icmp slt i32 %iv, 8
108+
br i1 %exitcond, label %loop.header, label %exit
109+
110+
exit: ; preds = %loop.latch
111+
ret void
112+
}
113+
114+
define void @loop_invariant_srem(ptr %p, i64 %a, i8 %b) {
115+
; CHECK-LABEL: define void @loop_invariant_srem(
116+
; CHECK-SAME: ptr [[P:%.*]], i64 [[A:%.*]], i8 [[B:%.*]]) {
117+
; CHECK-NEXT: [[ENTRY:.*]]:
118+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
119+
; CHECK: [[VECTOR_PH]]:
120+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i8> poison, i8 [[B]], i64 0
121+
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i8> [[BROADCAST_SPLATINSERT]], <4 x i8> poison, <4 x i32> zeroinitializer
122+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT1:%.*]] = insertelement <4 x i64> poison, i64 [[A]], i64 0
123+
; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT1]], <4 x i64> poison, <4 x i32> zeroinitializer
124+
; CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i64> [[BROADCAST_SPLAT2]], splat (i64 48)
125+
; CHECK-NEXT: [[TMP1:%.*]] = ashr <4 x i64> [[TMP0]], splat (i64 52)
126+
; CHECK-NEXT: [[TMP2:%.*]] = trunc <4 x i64> [[TMP1]] to <4 x i32>
127+
; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i8> [[BROADCAST_SPLAT]] to <4 x i32>
128+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
129+
; CHECK: [[VECTOR_BODY]]:
130+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE10:.*]] ]
131+
; CHECK-NEXT: [[VEC_IND1:%.*]] = phi <4 x i8> [ <i8 0, i8 1, i8 2, i8 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE10]] ]
132+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT3:%.*]] = insertelement <4 x i32> poison, i32 [[INDEX]], i64 0
133+
; CHECK-NEXT: [[BROADCAST_SPLAT4:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT3]], <4 x i32> poison, <4 x i32> zeroinitializer
134+
; CHECK-NEXT: [[VEC_IND:%.*]] = add <4 x i32> [[BROADCAST_SPLAT4]], <i32 0, i32 1, i32 2, i32 3>
135+
; CHECK-NEXT: [[TMP4:%.*]] = icmp ule <4 x i32> [[VEC_IND]], splat (i32 8)
136+
; CHECK-NEXT: [[TMP5:%.*]] = icmp sge <4 x i8> [[VEC_IND1]], splat (i8 2)
137+
; CHECK-NEXT: [[TMP6:%.*]] = select <4 x i1> [[TMP4]], <4 x i1> [[TMP5]], <4 x i1> zeroinitializer
138+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP6]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]]
139+
; CHECK-NEXT: [[TMP7:%.*]] = shl <4 x i32> [[PREDPHI]], splat (i32 8)
140+
; CHECK-NEXT: [[TMP8:%.*]] = trunc <4 x i32> [[TMP7]] to <4 x i8>
141+
; CHECK-NEXT: [[TMP9:%.*]] = select <4 x i1> [[TMP4]], <4 x i8> [[TMP8]], <4 x i8> splat (i8 1)
142+
; CHECK-NEXT: [[TMP11:%.*]] = srem <4 x i8> [[VEC_IND1]], [[TMP9]]
143+
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP4]], i32 0
144+
; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
145+
; CHECK: [[PRED_STORE_IF]]:
146+
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x i8> [[TMP11]], i32 0
147+
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i32, ptr [[P]], i8 [[TMP13]]
148+
; CHECK-NEXT: store i32 4, ptr [[TMP12]], align 4
149+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
150+
; CHECK: [[PRED_STORE_CONTINUE]]:
151+
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x i1> [[TMP4]], i32 1
152+
; CHECK-NEXT: br i1 [[TMP14]], label %[[PRED_STORE_IF5:.*]], label %[[PRED_STORE_CONTINUE6:.*]]
153+
; CHECK: [[PRED_STORE_IF5]]:
154+
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <4 x i8> [[TMP11]], i32 1
155+
; CHECK-NEXT: [[TMP15:%.*]] = getelementptr i32, ptr [[P]], i8 [[TMP16]]
156+
; CHECK-NEXT: store i32 4, ptr [[TMP15]], align 4
157+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE6]]
158+
; CHECK: [[PRED_STORE_CONTINUE6]]:
159+
; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i1> [[TMP4]], i32 2
160+
; CHECK-NEXT: br i1 [[TMP18]], label %[[PRED_STORE_IF7:.*]], label %[[PRED_STORE_CONTINUE8:.*]]
161+
; CHECK: [[PRED_STORE_IF7]]:
162+
; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i8> [[TMP11]], i32 2
163+
; CHECK-NEXT: [[TMP19:%.*]] = getelementptr i32, ptr [[P]], i8 [[TMP20]]
164+
; CHECK-NEXT: store i32 4, ptr [[TMP19]], align 4
165+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE8]]
166+
; CHECK: [[PRED_STORE_CONTINUE8]]:
167+
; CHECK-NEXT: [[TMP22:%.*]] = extractelement <4 x i1> [[TMP4]], i32 3
168+
; CHECK-NEXT: br i1 [[TMP22]], label %[[PRED_STORE_IF9:.*]], label %[[PRED_STORE_CONTINUE10]]
169+
; CHECK: [[PRED_STORE_IF9]]:
170+
; CHECK-NEXT: [[TMP21:%.*]] = extractelement <4 x i8> [[TMP11]], i32 3
171+
; CHECK-NEXT: [[TMP23:%.*]] = getelementptr i32, ptr [[P]], i8 [[TMP21]]
172+
; CHECK-NEXT: store i32 4, ptr [[TMP23]], align 4
173+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE10]]
174+
; CHECK: [[PRED_STORE_CONTINUE10]]:
175+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
176+
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i8> [[VEC_IND1]], splat (i8 4)
177+
; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i32 [[INDEX_NEXT]], 12
178+
; CHECK-NEXT: br i1 [[TMP26]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
179+
; CHECK: [[MIDDLE_BLOCK]]:
180+
; CHECK-NEXT: br label %[[EXIT:.*]]
181+
; CHECK: [[SCALAR_PH]]:
182+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ 0, %[[ENTRY]] ]
183+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
184+
; CHECK: [[LOOP_HEADER]]:
185+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
186+
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
187+
; CHECK-NEXT: [[CMP_SLT:%.*]] = icmp slt i8 [[IV]], 2
188+
; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A]], 48
189+
; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[SHL]], 52
190+
; CHECK-NEXT: [[TRUNC_I32:%.*]] = trunc i64 [[ASHR]] to i32
191+
; CHECK-NEXT: br i1 [[CMP_SLT]], label %[[COND_FALSE:.*]], label %[[LOOP_LATCH]]
192+
; CHECK: [[COND_FALSE]]:
193+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[B]] to i32
194+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
195+
; CHECK: [[LOOP_LATCH]]:
196+
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TRUNC_I32]], %[[LOOP_HEADER]] ], [ [[ZEXT]], %[[COND_FALSE]] ]
197+
; CHECK-NEXT: [[SHL_I32:%.*]] = shl i32 [[COND]], 8
198+
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHL_I32]] to i8
199+
; CHECK-NEXT: [[REM:%.*]] = srem i8 [[IV]], [[TRUNC]]
200+
; CHECK-NEXT: [[GEP_P_REM:%.*]] = getelementptr i32, ptr [[P]], i8 [[REM]]
201+
; CHECK-NEXT: store i32 4, ptr [[GEP_P_REM]], align 4
202+
; CHECK-NEXT: [[EC:%.*]] = icmp eq i8 [[IV]], 8
203+
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]]
204+
; CHECK: [[EXIT]]:
205+
; CHECK-NEXT: ret void
206+
;
207+
entry:
208+
br label %loop.header
209+
210+
loop.header: ; preds = %loop.latch, %entry
211+
%iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]
212+
%iv.next = add i8 %iv, 1
213+
%cmp.slt = icmp slt i8 %iv, 2
214+
%shl = shl i64 %a, 48
215+
%ashr = ashr i64 %shl, 52
216+
%trunc.i32 = trunc i64 %ashr to i32
217+
br i1 %cmp.slt, label %cond.false, label %loop.latch
218+
219+
cond.false: ; preds = %loop.header
220+
%zext = zext i8 %b to i32
221+
br label %loop.latch
222+
223+
loop.latch: ; preds = %cond.false, %loop.header
224+
%cond = phi i32 [ %trunc.i32, %loop.header ], [ %zext, %cond.false ]
225+
%shl.i32 = shl i32 %cond, 8
226+
%trunc = trunc i32 %shl.i32 to i8
227+
%rem = srem i8 %iv, %trunc
228+
%gep.p.rem = getelementptr i32, ptr %p, i8 %rem
229+
store i32 4, ptr %gep.p.rem
230+
%ec = icmp eq i8 %iv, 8
231+
br i1 %ec, label %exit, label %loop.header
232+
233+
exit: ; preds = %loop.latch
234+
ret void
235+
}
236+
237+
define void @loop_invariant_float_store(ptr %p, i32 %a) {
238+
; CHECK-LABEL: define void @loop_invariant_float_store(
239+
; CHECK-SAME: ptr [[P:%.*]], i32 [[A:%.*]]) {
240+
; CHECK-NEXT: [[ENTRY:.*]]:
241+
; CHECK-NEXT: [[TMP10:%.*]] = sitofp i32 [[A]] to float
242+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
243+
; CHECK: [[VECTOR_PH]]:
244+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
245+
; CHECK: [[VECTOR_BODY]]:
246+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
247+
; CHECK-NEXT: store float [[TMP10]], ptr [[P]], align 4
248+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
249+
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i32 [[INDEX_NEXT]], 12
250+
; CHECK-NEXT: br i1 [[TMP17]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
251+
; CHECK: [[MIDDLE_BLOCK]]:
252+
; CHECK-NEXT: br label %[[EXIT:.*]]
253+
; CHECK: [[SCALAR_PH]]:
254+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, %[[ENTRY]] ]
255+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
256+
; CHECK: [[LOOP_HEADER]]:
257+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
258+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
259+
; CHECK-NEXT: [[CMP_SLT:%.*]] = icmp slt i32 [[IV]], 2
260+
; CHECK-NEXT: br i1 [[CMP_SLT]], label %[[COND_FALSE:.*]], label %[[LOOP_LATCH]]
261+
; CHECK: [[COND_FALSE]]:
262+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
263+
; CHECK: [[LOOP_LATCH]]:
264+
; CHECK-NEXT: store float [[TMP10]], ptr [[P]], align 4
265+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp slt i32 [[IV]], 8
266+
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP7:![0-9]+]]
267+
; CHECK: [[EXIT]]:
268+
; CHECK-NEXT: ret void
269+
;
270+
entry:
271+
%a.conv = sitofp i32 %a to float
272+
br label %loop.header
273+
274+
loop.header: ; preds = %loop.latch, %entry
275+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
276+
%iv.next = add i32 %iv, 1
277+
%cmp.slt = icmp slt i32 %iv, 2
278+
br i1 %cmp.slt, label %cond.false, label %loop.latch
279+
280+
cond.false: ; preds = %loop.header
281+
br label %loop.latch
282+
283+
loop.latch: ; preds = %cond.false, %loop.header
284+
store float %a.conv, ptr %p
285+
%exitcond = icmp slt i32 %iv, 8
286+
br i1 %exitcond, label %loop.header, label %exit
287+
288+
exit: ; preds = %loop.latch
289+
ret void
290+
}

0 commit comments

Comments
 (0)