Skip to content

Commit 4d7f910

Browse files
committed
[LV] Pre-commit tests for const-folder
1 parent a1e041b commit 4d7f910

File tree

1 file changed

+381
-0
lines changed

1 file changed

+381
-0
lines changed
Lines changed: 381 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,381 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes=loop-vectorize -force-vector-width=4 -S %s | FileCheck %s
3+
4+
define void @const_fold_ptradd(ptr %dst, i64 %d) {
5+
; CHECK-LABEL: define void @const_fold_ptradd(
6+
; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*]]:
8+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
9+
; CHECK: [[VECTOR_PH]]:
10+
; CHECK-NEXT: [[PREDPHI:%.*]] = select i1 true, i64 0, i64 [[D]]
11+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i16, ptr [[DST]], i64 [[PREDPHI]]
12+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
13+
; CHECK: [[VECTOR_BODY]]:
14+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
15+
; CHECK-NEXT: store i16 0, ptr [[TMP0]], align 2
16+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
17+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
18+
; CHECK-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
19+
; CHECK: [[MIDDLE_BLOCK]]:
20+
; CHECK-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
21+
; CHECK: [[SCALAR_PH]]:
22+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
23+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
24+
; CHECK: [[LOOP_HEADER]]:
25+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
26+
; CHECK-NEXT: br i1 true, label %[[LOOP_LATCH]], label %[[ELSE:.*]]
27+
; CHECK: [[ELSE]]:
28+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
29+
; CHECK: [[LOOP_LATCH]]:
30+
; CHECK-NEXT: [[CONST_0:%.*]] = phi i64 [ [[D]], %[[ELSE]] ], [ 0, %[[LOOP_HEADER]] ]
31+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[DST]], i64 [[CONST_0]]
32+
; CHECK-NEXT: store i16 0, ptr [[GEP]], align 2
33+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
34+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 101
35+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP3:![0-9]+]]
36+
; CHECK: [[EXIT]]:
37+
; CHECK-NEXT: ret void
38+
;
39+
entry:
40+
br label %loop.header
41+
42+
loop.header: ; preds = %loop.latch, %entry
43+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
44+
br i1 true, label %loop.latch, label %else
45+
46+
else:
47+
br label %loop.latch
48+
49+
loop.latch:
50+
%const.0 = phi i64 [ %d, %else ], [ 0, %loop.header ]
51+
%gep = getelementptr i16, ptr %dst, i64 %const.0
52+
store i16 0, ptr %gep, align 2
53+
%iv.next = add i64 %iv, 1
54+
%cmp = icmp ult i64 %iv.next, 101
55+
br i1 %cmp, label %loop.header, label %exit
56+
57+
exit:
58+
ret void
59+
}
60+
61+
define void @const_fold_inbounds_ptradd(ptr %dst, i64 %d) {
62+
; CHECK-LABEL: define void @const_fold_inbounds_ptradd(
63+
; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {
64+
; CHECK-NEXT: [[ENTRY:.*]]:
65+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
66+
; CHECK: [[VECTOR_PH]]:
67+
; CHECK-NEXT: [[PREDPHI:%.*]] = select i1 true, i64 0, i64 [[D]]
68+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[PREDPHI]]
69+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
70+
; CHECK: [[VECTOR_BODY]]:
71+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
72+
; CHECK-NEXT: store i16 0, ptr [[TMP0]], align 2
73+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
74+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
75+
; CHECK-NEXT: br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
76+
; CHECK: [[MIDDLE_BLOCK]]:
77+
; CHECK-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
78+
; CHECK: [[SCALAR_PH]]:
79+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
80+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
81+
; CHECK: [[LOOP_HEADER]]:
82+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
83+
; CHECK-NEXT: br i1 true, label %[[LOOP_LATCH]], label %[[ELSE:.*]]
84+
; CHECK: [[ELSE]]:
85+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
86+
; CHECK: [[LOOP_LATCH]]:
87+
; CHECK-NEXT: [[CONST_0:%.*]] = phi i64 [ [[D]], %[[ELSE]] ], [ 0, %[[LOOP_HEADER]] ]
88+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[CONST_0]]
89+
; CHECK-NEXT: store i16 0, ptr [[GEP]], align 2
90+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
91+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 101
92+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP5:![0-9]+]]
93+
; CHECK: [[EXIT]]:
94+
; CHECK-NEXT: ret void
95+
;
96+
entry:
97+
br label %loop.header
98+
99+
loop.header: ; preds = %loop.latch, %entry
100+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
101+
br i1 true, label %loop.latch, label %else
102+
103+
else:
104+
br label %loop.latch
105+
106+
loop.latch:
107+
%const.0 = phi i64 [ %d, %else ], [ 0, %loop.header ]
108+
%gep = getelementptr inbounds i16, ptr %dst, i64 %const.0
109+
store i16 0, ptr %gep, align 2
110+
%iv.next = add i64 %iv, 1
111+
%cmp = icmp ult i64 %iv.next, 101
112+
br i1 %cmp, label %loop.header, label %exit
113+
114+
exit:
115+
ret void
116+
}
117+
118+
define void @const_fold_select(ptr %dst, i64 %d) {
119+
; CHECK-LABEL: define void @const_fold_select(
120+
; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {
121+
; CHECK-NEXT: [[ENTRY:.*]]:
122+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
123+
; CHECK: [[VECTOR_PH]]:
124+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[D]], i64 0
125+
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
126+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> splat (i1 true), <4 x i64> splat (i64 1), <4 x i64> [[BROADCAST_SPLAT]]
127+
; CHECK-NEXT: [[TMP0:%.*]] = or <4 x i64> [[BROADCAST_SPLAT]], [[PREDPHI]]
128+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
129+
; CHECK: [[VECTOR_BODY]]:
130+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
131+
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i64> [[TMP0]], i32 0
132+
; CHECK-NEXT: store i64 [[TMP3]], ptr [[DST]], align 8
133+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
134+
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
135+
; CHECK-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
136+
; CHECK: [[MIDDLE_BLOCK]]:
137+
; CHECK-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
138+
; CHECK: [[SCALAR_PH]]:
139+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
140+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
141+
; CHECK: [[LOOP_HEADER]]:
142+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
143+
; CHECK-NEXT: br i1 true, label %[[LOOP_LATCH]], label %[[ELSE:.*]]
144+
; CHECK: [[ELSE]]:
145+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
146+
; CHECK: [[LOOP_LATCH]]:
147+
; CHECK-NEXT: [[CONST_1:%.*]] = phi i64 [ [[D]], %[[ELSE]] ], [ 1, %[[LOOP_HEADER]] ]
148+
; CHECK-NEXT: [[OR:%.*]] = or i64 [[D]], [[CONST_1]]
149+
; CHECK-NEXT: store i64 [[OR]], ptr [[DST]], align 8
150+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
151+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 101
152+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP7:![0-9]+]]
153+
; CHECK: [[EXIT]]:
154+
; CHECK-NEXT: ret void
155+
;
156+
entry:
157+
br label %loop.header
158+
159+
loop.header: ; preds = %loop.latch, %entry
160+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
161+
br i1 true, label %loop.latch, label %else
162+
163+
else:
164+
br label %loop.latch
165+
166+
loop.latch:
167+
%const.1 = phi i64 [ %d, %else ], [ 1, %loop.header ]
168+
%or = or i64 %d, %const.1
169+
store i64 %or, ptr %dst, align 8
170+
%iv.next = add i64 %iv, 1
171+
%cmp = icmp ult i64 %iv.next, 101
172+
br i1 %cmp, label %loop.header, label %exit
173+
174+
exit:
175+
ret void
176+
}
177+
178+
define void @const_fold_and_or_xor(ptr %dst, i64 %d) {
179+
; CHECK-LABEL: define void @const_fold_and_or_xor(
180+
; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {
181+
; CHECK-NEXT: [[ENTRY:.*]]:
182+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
183+
; CHECK: [[VECTOR_PH]]:
184+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[D]], i64 0
185+
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
186+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> splat (i1 true), <4 x i64> splat (i64 1), <4 x i64> [[BROADCAST_SPLAT]]
187+
; CHECK-NEXT: [[TMP0:%.*]] = or <4 x i64> splat (i64 2), [[PREDPHI]]
188+
; CHECK-NEXT: [[TMP1:%.*]] = and <4 x i64> [[TMP0]], [[PREDPHI]]
189+
; CHECK-NEXT: [[TMP2:%.*]] = and <4 x i64> [[TMP1]], [[PREDPHI]]
190+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
191+
; CHECK: [[VECTOR_BODY]]:
192+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
193+
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i64> [[TMP2]], i32 0
194+
; CHECK-NEXT: store i64 [[TMP3]], ptr [[DST]], align 8
195+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
196+
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
197+
; CHECK-NEXT: br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
198+
; CHECK: [[MIDDLE_BLOCK]]:
199+
; CHECK-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
200+
; CHECK: [[SCALAR_PH]]:
201+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
202+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
203+
; CHECK: [[LOOP_HEADER]]:
204+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
205+
; CHECK-NEXT: br i1 true, label %[[LOOP_LATCH]], label %[[ELSE:.*]]
206+
; CHECK: [[ELSE]]:
207+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
208+
; CHECK: [[LOOP_LATCH]]:
209+
; CHECK-NEXT: [[CONST_1:%.*]] = phi i64 [ [[D]], %[[ELSE]] ], [ 1, %[[LOOP_HEADER]] ]
210+
; CHECK-NEXT: [[OR:%.*]] = or i64 2, [[CONST_1]]
211+
; CHECK-NEXT: [[AND:%.*]] = and i64 [[OR]], [[CONST_1]]
212+
; CHECK-NEXT: [[XOR:%.*]] = and i64 [[AND]], [[CONST_1]]
213+
; CHECK-NEXT: store i64 [[XOR]], ptr [[DST]], align 8
214+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
215+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 101
216+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP9:![0-9]+]]
217+
; CHECK: [[EXIT]]:
218+
; CHECK-NEXT: ret void
219+
;
220+
entry:
221+
br label %loop.header
222+
223+
loop.header: ; preds = %loop.latch, %entry
224+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
225+
br i1 true, label %loop.latch, label %else
226+
227+
else:
228+
br label %loop.latch
229+
230+
loop.latch:
231+
%const.1 = phi i64 [ %d, %else ], [ 1, %loop.header ]
232+
%or = or i64 2, %const.1
233+
%and = and i64 %or, %const.1
234+
%xor = and i64 %and, %const.1
235+
store i64 %xor, ptr %dst, align 8
236+
%iv.next = add i64 %iv, 1
237+
%cmp = icmp ult i64 %iv.next, 101
238+
br i1 %cmp, label %loop.header, label %exit
239+
240+
exit:
241+
ret void
242+
}
243+
244+
define void @const_fold_cmp_zext(ptr %dst, i64 %d) {
245+
; CHECK-LABEL: define void @const_fold_cmp_zext(
246+
; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {
247+
; CHECK-NEXT: [[ENTRY:.*]]:
248+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
249+
; CHECK: [[VECTOR_PH]]:
250+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[D]], i64 0
251+
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
252+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> splat (i1 true), <4 x i64> splat (i64 1), <4 x i64> [[BROADCAST_SPLAT]]
253+
; CHECK-NEXT: [[TMP0:%.*]] = icmp ugt <4 x i64> splat (i64 2), [[PREDPHI]]
254+
; CHECK-NEXT: [[TMP1:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i8>
255+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
256+
; CHECK: [[VECTOR_BODY]]:
257+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
258+
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i8> [[TMP1]], i32 0
259+
; CHECK-NEXT: store i8 [[TMP2]], ptr [[DST]], align 1
260+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
261+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
262+
; CHECK-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
263+
; CHECK: [[MIDDLE_BLOCK]]:
264+
; CHECK-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
265+
; CHECK: [[SCALAR_PH]]:
266+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
267+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
268+
; CHECK: [[LOOP_HEADER]]:
269+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
270+
; CHECK-NEXT: br i1 true, label %[[LOOP_LATCH]], label %[[ELSE:.*]]
271+
; CHECK: [[ELSE]]:
272+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
273+
; CHECK: [[LOOP_LATCH]]:
274+
; CHECK-NEXT: [[CONST_1:%.*]] = phi i64 [ [[D]], %[[ELSE]] ], [ 1, %[[LOOP_HEADER]] ]
275+
; CHECK-NEXT: [[VAL:%.*]] = icmp ugt i64 2, [[CONST_1]]
276+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[VAL]] to i8
277+
; CHECK-NEXT: store i8 [[ZEXT]], ptr [[DST]], align 1
278+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
279+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 101
280+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP11:![0-9]+]]
281+
; CHECK: [[EXIT]]:
282+
; CHECK-NEXT: ret void
283+
;
284+
entry:
285+
br label %loop.header
286+
287+
loop.header: ; preds = %loop.latch, %entry
288+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
289+
br i1 true, label %loop.latch, label %else
290+
291+
else:
292+
br label %loop.latch
293+
294+
loop.latch:
295+
%const.1 = phi i64 [ %d, %else ], [ 1, %loop.header ]
296+
%val = icmp ugt i64 2, %const.1
297+
%zext = zext i1 %val to i8
298+
store i8 %zext, ptr %dst, align 1
299+
%iv.next = add i64 %iv, 1
300+
%cmp = icmp ult i64 %iv.next, 101
301+
br i1 %cmp, label %loop.header, label %exit
302+
303+
exit:
304+
ret void
305+
}
306+
307+
define void @const_fold_trunc(ptr %dst, i64 %d) {
308+
; CHECK-LABEL: define void @const_fold_trunc(
309+
; CHECK-SAME: ptr [[DST:%.*]], i64 [[D:%.*]]) {
310+
; CHECK-NEXT: [[ENTRY:.*]]:
311+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
312+
; CHECK: [[VECTOR_PH]]:
313+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[D]], i64 0
314+
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
315+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> splat (i1 true), <4 x i64> zeroinitializer, <4 x i64> [[BROADCAST_SPLAT]]
316+
; CHECK-NEXT: [[TMP0:%.*]] = trunc <4 x i64> [[PREDPHI]] to <4 x i16>
317+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
318+
; CHECK: [[VECTOR_BODY]]:
319+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
320+
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i16> [[TMP0]], i32 0
321+
; CHECK-NEXT: store i16 [[TMP1]], ptr [[DST]], align 2
322+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
323+
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
324+
; CHECK-NEXT: br i1 [[TMP2]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
325+
; CHECK: [[MIDDLE_BLOCK]]:
326+
; CHECK-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
327+
; CHECK: [[SCALAR_PH]]:
328+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
329+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
330+
; CHECK: [[LOOP_HEADER]]:
331+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
332+
; CHECK-NEXT: br i1 true, label %[[LOOP_LATCH]], label %[[ELSE:.*]]
333+
; CHECK: [[ELSE]]:
334+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
335+
; CHECK: [[LOOP_LATCH]]:
336+
; CHECK-NEXT: [[CONST_0:%.*]] = phi i64 [ [[D]], %[[ELSE]] ], [ 0, %[[LOOP_HEADER]] ]
337+
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[CONST_0]] to i16
338+
; CHECK-NEXT: store i16 [[TRUNC]], ptr [[DST]], align 2
339+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
340+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 101
341+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP_HEADER]], label %[[EXIT]], !llvm.loop [[LOOP13:![0-9]+]]
342+
; CHECK: [[EXIT]]:
343+
; CHECK-NEXT: ret void
344+
;
345+
entry:
346+
br label %loop.header
347+
348+
loop.header: ; preds = %loop.latch, %entry
349+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
350+
br i1 true, label %loop.latch, label %else
351+
352+
else:
353+
br label %loop.latch
354+
355+
loop.latch:
356+
%const.0 = phi i64 [ %d, %else ], [ 0, %loop.header ]
357+
%trunc = trunc i64 %const.0 to i16
358+
store i16 %trunc, ptr %dst, align 2
359+
%iv.next = add i64 %iv, 1
360+
%cmp = icmp ult i64 %iv.next, 101
361+
br i1 %cmp, label %loop.header, label %exit
362+
363+
exit:
364+
ret void
365+
}
366+
;.
367+
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
368+
; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
369+
; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
370+
; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
371+
; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
372+
; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}
373+
; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]}
374+
; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META2]], [[META1]]}
375+
; CHECK: [[LOOP8]] = distinct !{[[LOOP8]], [[META1]], [[META2]]}
376+
; CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META2]], [[META1]]}
377+
; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META1]], [[META2]]}
378+
; CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META2]], [[META1]]}
379+
; CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]], [[META2]]}
380+
; CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META2]], [[META1]]}
381+
;.

0 commit comments

Comments
 (0)