Skip to content

Commit 4959a34

Browse files
committed
[LV] Pre-commit test for predicatedinst-li
1 parent 4fa2c62 commit 4959a34

File tree

1 file changed

+338
-0
lines changed

1 file changed

+338
-0
lines changed
Lines changed: 338 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,338 @@
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 %[[COND_TRUE:.*]]
65+
; CHECK: [[COND_TRUE]]:
66+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP:.*]] ]
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]]
73+
; CHECK: [[COND_FALSE]]:
74+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[B]] to i32
75+
; CHECK-NEXT: br label %[[LOOP]]
76+
; CHECK: [[LOOP]]:
77+
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TRUNC_I32]], %[[COND_TRUE]] ], [ [[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 %[[COND_TRUE]], label %[[EXIT]], !llvm.loop [[LOOP3:![0-9]+]]
83+
; CHECK: [[EXIT]]:
84+
; CHECK-NEXT: ret void
85+
;
86+
entry:
87+
br label %cond.true
88+
89+
cond.true: ; preds = %loop, %entry
90+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
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
97+
98+
cond.false: ; preds = %cond.true
99+
%zext = zext i8 %b to i32
100+
br label %loop
101+
102+
loop: ; preds = %cond.false, %cond.true
103+
%cond = phi i32 [ %trunc.i32, %cond.true ], [ %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 %cond.true, label %exit
109+
110+
exit: ; preds = %loop
111+
ret void
112+
}
113+
114+
define void @loop_invariant_udiv(ptr %p, i64 %a, i8 %b) {
115+
; CHECK-LABEL: define void @loop_invariant_udiv(
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_CONTINUE8:.*]] ]
131+
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE8]] ]
132+
; CHECK-NEXT: [[TMP4:%.*]] = icmp ule <4 x i32> [[VEC_IND]], splat (i32 8)
133+
; CHECK-NEXT: [[TMP5:%.*]] = icmp sge <4 x i32> [[VEC_IND]], splat (i32 2)
134+
; CHECK-NEXT: [[TMP6:%.*]] = select <4 x i1> [[TMP4]], <4 x i1> [[TMP5]], <4 x i1> zeroinitializer
135+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP6]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]]
136+
; CHECK-NEXT: [[TMP7:%.*]] = shl <4 x i32> [[PREDPHI]], splat (i32 8)
137+
; CHECK-NEXT: [[TMP8:%.*]] = trunc <4 x i32> [[TMP7]] to <4 x i8>
138+
; CHECK-NEXT: [[TMP9:%.*]] = udiv <4 x i8> [[TMP8]], [[BROADCAST_SPLAT]]
139+
; CHECK-NEXT: [[TMP17:%.*]] = extractelement <4 x i1> [[TMP4]], i32 0
140+
; CHECK-NEXT: br i1 [[TMP17]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
141+
; CHECK: [[PRED_STORE_IF]]:
142+
; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x i8> [[TMP9]], i32 0
143+
; CHECK-NEXT: store i8 [[TMP18]], ptr [[P]], align 1
144+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
145+
; CHECK: [[PRED_STORE_CONTINUE]]:
146+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP4]], i32 1
147+
; CHECK-NEXT: br i1 [[TMP12]], label %[[PRED_STORE_IF3:.*]], label %[[PRED_STORE_CONTINUE4:.*]]
148+
; CHECK: [[PRED_STORE_IF3]]:
149+
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x i8> [[TMP9]], i32 1
150+
; CHECK-NEXT: store i8 [[TMP13]], ptr [[P]], align 1
151+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE4]]
152+
; CHECK: [[PRED_STORE_CONTINUE4]]:
153+
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x i1> [[TMP4]], i32 2
154+
; CHECK-NEXT: br i1 [[TMP14]], label %[[PRED_STORE_IF5:.*]], label %[[PRED_STORE_CONTINUE6:.*]]
155+
; CHECK: [[PRED_STORE_IF5]]:
156+
; CHECK-NEXT: [[TMP15:%.*]] = extractelement <4 x i8> [[TMP9]], i32 2
157+
; CHECK-NEXT: store i8 [[TMP15]], ptr [[P]], align 1
158+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE6]]
159+
; CHECK: [[PRED_STORE_CONTINUE6]]:
160+
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <4 x i1> [[TMP4]], i32 3
161+
; CHECK-NEXT: br i1 [[TMP16]], label %[[PRED_STORE_IF7:.*]], label %[[PRED_STORE_CONTINUE8]]
162+
; CHECK: [[PRED_STORE_IF7]]:
163+
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i8> [[TMP9]], i32 3
164+
; CHECK-NEXT: store i8 [[TMP10]], ptr [[P]], align 1
165+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE8]]
166+
; CHECK: [[PRED_STORE_CONTINUE8]]:
167+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
168+
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)
169+
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i32 [[INDEX_NEXT]], 12
170+
; CHECK-NEXT: br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
171+
; CHECK: [[MIDDLE_BLOCK]]:
172+
; CHECK-NEXT: br label %[[EXIT:.*]]
173+
; CHECK: [[SCALAR_PH]]:
174+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, %[[ENTRY]] ]
175+
; CHECK-NEXT: br label %[[COND_TRUE:.*]]
176+
; CHECK: [[COND_TRUE]]:
177+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP:.*]] ]
178+
; CHECK-NEXT: [[ADD]] = add i32 [[IV]], 1
179+
; CHECK-NEXT: [[CMP_SLT:%.*]] = icmp slt i32 [[IV]], 2
180+
; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A]], 48
181+
; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[SHL]], 52
182+
; CHECK-NEXT: [[TRUNC_I32:%.*]] = trunc i64 [[ASHR]] to i32
183+
; CHECK-NEXT: br i1 [[CMP_SLT]], label %[[COND_FALSE:.*]], label %[[LOOP]]
184+
; CHECK: [[COND_FALSE]]:
185+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[B]] to i32
186+
; CHECK-NEXT: br label %[[LOOP]]
187+
; CHECK: [[LOOP]]:
188+
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TRUNC_I32]], %[[COND_TRUE]] ], [ [[ZEXT]], %[[COND_FALSE]] ]
189+
; CHECK-NEXT: [[SHL_I32:%.*]] = shl i32 [[COND]], 8
190+
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHL_I32]] to i8
191+
; CHECK-NEXT: [[UDIV:%.*]] = udiv i8 [[TRUNC]], [[B]]
192+
; CHECK-NEXT: store i8 [[UDIV]], ptr [[P]], align 1
193+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[IV]], 8
194+
; CHECK-NEXT: br i1 [[CMP]], label %[[COND_TRUE]], label %[[EXIT]], !llvm.loop [[LOOP5:![0-9]+]]
195+
; CHECK: [[EXIT]]:
196+
; CHECK-NEXT: ret void
197+
;
198+
entry:
199+
br label %cond.true
200+
201+
cond.true: ; preds = %loop, %entry
202+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
203+
%iv.next = add i32 %iv, 1
204+
%cmp.slt = icmp slt i32 %iv, 2
205+
%shl = shl i64 %a, 48
206+
%ashr = ashr i64 %shl, 52
207+
%trunc.i32 = trunc i64 %ashr to i32
208+
br i1 %cmp.slt, label %cond.false, label %loop
209+
210+
cond.false: ; preds = %cond.true
211+
%zext = zext i8 %b to i32
212+
br label %loop
213+
214+
loop: ; preds = %cond.false, %cond.true
215+
%cond = phi i32 [ %trunc.i32, %cond.true ], [ %zext, %cond.false ]
216+
%shl.i32 = shl i32 %cond, 8
217+
%trunc = trunc i32 %shl.i32 to i8
218+
%udiv = udiv i8 %trunc, %b
219+
store i8 %udiv, ptr %p, align 1
220+
%exitcond = icmp slt i32 %iv, 8
221+
br i1 %exitcond, label %cond.true, label %exit
222+
223+
exit: ; preds = %loop
224+
ret void
225+
}
226+
227+
define void @loop_invariant_float_store(ptr noalias %p, ptr noalias %q, i64 %a, i8 %b) {
228+
; CHECK-LABEL: define void @loop_invariant_float_store(
229+
; CHECK-SAME: ptr noalias [[P:%.*]], ptr noalias [[Q:%.*]], i64 [[A:%.*]], i8 [[B:%.*]]) {
230+
; CHECK-NEXT: [[ENTRY:.*]]:
231+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
232+
; CHECK: [[VECTOR_PH]]:
233+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i8> poison, i8 [[B]], i64 0
234+
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i8> [[BROADCAST_SPLATINSERT]], <4 x i8> poison, <4 x i32> zeroinitializer
235+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT1:%.*]] = insertelement <4 x i64> poison, i64 [[A]], i64 0
236+
; CHECK-NEXT: [[BROADCAST_SPLAT2:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT1]], <4 x i64> poison, <4 x i32> zeroinitializer
237+
; CHECK-NEXT: [[TMP0:%.*]] = shl <4 x i64> [[BROADCAST_SPLAT2]], splat (i64 48)
238+
; CHECK-NEXT: [[TMP1:%.*]] = ashr <4 x i64> [[TMP0]], splat (i64 52)
239+
; CHECK-NEXT: [[TMP2:%.*]] = trunc <4 x i64> [[TMP1]] to <4 x i32>
240+
; CHECK-NEXT: [[TMP3:%.*]] = zext <4 x i8> [[BROADCAST_SPLAT]] to <4 x i32>
241+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
242+
; CHECK: [[VECTOR_BODY]]:
243+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE8:.*]] ]
244+
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE8]] ]
245+
; CHECK-NEXT: [[TMP4:%.*]] = icmp ule <4 x i32> [[VEC_IND]], splat (i32 8)
246+
; CHECK-NEXT: store float 2.000000e+00, ptr [[Q]], align 4
247+
; CHECK-NEXT: [[TMP5:%.*]] = icmp sge <4 x i32> [[VEC_IND]], splat (i32 2)
248+
; CHECK-NEXT: [[TMP6:%.*]] = select <4 x i1> [[TMP4]], <4 x i1> [[TMP5]], <4 x i1> zeroinitializer
249+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP6]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]]
250+
; CHECK-NEXT: [[TMP7:%.*]] = shl <4 x i32> [[PREDPHI]], splat (i32 8)
251+
; CHECK-NEXT: [[TMP8:%.*]] = trunc <4 x i32> [[TMP7]] to <4 x i8>
252+
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <4 x i1> [[TMP4]], i32 0
253+
; CHECK-NEXT: br i1 [[TMP16]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
254+
; CHECK: [[PRED_STORE_IF]]:
255+
; CHECK-NEXT: [[TMP17:%.*]] = extractelement <4 x i8> [[TMP8]], i32 0
256+
; CHECK-NEXT: store i8 [[TMP17]], ptr [[P]], align 1
257+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
258+
; CHECK: [[PRED_STORE_CONTINUE]]:
259+
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x i1> [[TMP4]], i32 1
260+
; CHECK-NEXT: br i1 [[TMP11]], label %[[PRED_STORE_IF3:.*]], label %[[PRED_STORE_CONTINUE4:.*]]
261+
; CHECK: [[PRED_STORE_IF3]]:
262+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i8> [[TMP8]], i32 1
263+
; CHECK-NEXT: store i8 [[TMP12]], ptr [[P]], align 1
264+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE4]]
265+
; CHECK: [[PRED_STORE_CONTINUE4]]:
266+
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x i1> [[TMP4]], i32 2
267+
; CHECK-NEXT: br i1 [[TMP13]], label %[[PRED_STORE_IF5:.*]], label %[[PRED_STORE_CONTINUE6:.*]]
268+
; CHECK: [[PRED_STORE_IF5]]:
269+
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x i8> [[TMP8]], i32 2
270+
; CHECK-NEXT: store i8 [[TMP14]], ptr [[P]], align 1
271+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE6]]
272+
; CHECK: [[PRED_STORE_CONTINUE6]]:
273+
; CHECK-NEXT: [[TMP15:%.*]] = extractelement <4 x i1> [[TMP4]], i32 3
274+
; CHECK-NEXT: br i1 [[TMP15]], label %[[PRED_STORE_IF7:.*]], label %[[PRED_STORE_CONTINUE8]]
275+
; CHECK: [[PRED_STORE_IF7]]:
276+
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i8> [[TMP8]], i32 3
277+
; CHECK-NEXT: store i8 [[TMP9]], ptr [[P]], align 1
278+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE8]]
279+
; CHECK: [[PRED_STORE_CONTINUE8]]:
280+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
281+
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)
282+
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[INDEX_NEXT]], 12
283+
; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
284+
; CHECK: [[MIDDLE_BLOCK]]:
285+
; CHECK-NEXT: br label %[[EXIT:.*]]
286+
; CHECK: [[SCALAR_PH]]:
287+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, %[[ENTRY]] ]
288+
; CHECK-NEXT: br label %[[COND_TRUE:.*]]
289+
; CHECK: [[COND_TRUE]]:
290+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP:.*]] ]
291+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
292+
; CHECK-NEXT: store float 2.000000e+00, ptr [[Q]], align 4
293+
; CHECK-NEXT: [[CMP_SLT:%.*]] = icmp slt i32 [[IV]], 2
294+
; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A]], 48
295+
; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[SHL]], 52
296+
; CHECK-NEXT: [[TRUNC_I32:%.*]] = trunc i64 [[ASHR]] to i32
297+
; CHECK-NEXT: br i1 [[CMP_SLT]], label %[[COND_FALSE:.*]], label %[[LOOP]]
298+
; CHECK: [[COND_FALSE]]:
299+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[B]] to i32
300+
; CHECK-NEXT: br label %[[LOOP]]
301+
; CHECK: [[LOOP]]:
302+
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TRUNC_I32]], %[[COND_TRUE]] ], [ [[ZEXT]], %[[COND_FALSE]] ]
303+
; CHECK-NEXT: [[SHL_I32:%.*]] = shl i32 [[COND]], 8
304+
; CHECK-NEXT: [[TRUNC1:%.*]] = trunc i32 [[SHL_I32]] to i8
305+
; CHECK-NEXT: store i8 [[TRUNC1]], ptr [[P]], align 1
306+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[IV]], 8
307+
; CHECK-NEXT: br i1 [[CMP]], label %[[COND_TRUE]], label %[[EXIT]], !llvm.loop [[LOOP7:![0-9]+]]
308+
; CHECK: [[EXIT]]:
309+
; CHECK-NEXT: ret void
310+
;
311+
entry:
312+
br label %cond.true
313+
314+
cond.true: ; preds = %loop, %entry
315+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
316+
%iv.next = add i32 %iv, 1
317+
store float 2.0, ptr %q
318+
%cmp.slt = icmp slt i32 %iv, 2
319+
%shl = shl i64 %a, 48
320+
%ashr = ashr i64 %shl, 52
321+
%trunc.i32 = trunc i64 %ashr to i32
322+
br i1 %cmp.slt, label %cond.false, label %loop
323+
324+
cond.false: ; preds = %cond.true
325+
%zext = zext i8 %b to i32
326+
br label %loop
327+
328+
loop: ; preds = %cond.false, %cond.true
329+
%cond = phi i32 [ %trunc.i32, %cond.true ], [ %zext, %cond.false ]
330+
%shl.i32 = shl i32 %cond, 8
331+
%trunc = trunc i32 %shl.i32 to i8
332+
store i8 %trunc, ptr %p, align 1
333+
%exitcond = icmp slt i32 %iv, 8
334+
br i1 %exitcond, label %cond.true, label %exit
335+
336+
exit: ; preds = %loop
337+
ret void
338+
}

0 commit comments

Comments
 (0)