Skip to content

Commit 2ead2f9

Browse files
[InstCombine] Introduce test for PR149858 (NFC)
1 parent 94aa08a commit 2ead2f9

File tree

1 file changed

+393
-0
lines changed

1 file changed

+393
-0
lines changed
Lines changed: 393 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,393 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3+
4+
define i8 @simple_recurrence_intrinsic_smax(i8 %n, i8 %a, i8 %b) {
5+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic_smax(
6+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*]]:
8+
; CHECK-NEXT: br label %[[LOOP:.*]]
9+
; CHECK: [[LOOP]]:
10+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
11+
; CHECK-NEXT: [[SMAX_ACC:%.*]] = phi i8 [ [[SMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
12+
; CHECK-NEXT: [[SMAX]] = call i8 @llvm.smax.i8(i8 [[SMAX_ACC]], i8 [[B]])
13+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
14+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
15+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
16+
; CHECK: [[EXIT]]:
17+
; CHECK-NEXT: ret i8 [[SMAX]]
18+
;
19+
entry:
20+
br label %loop
21+
22+
loop:
23+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
24+
%smax.acc = phi i8 [ %smax, %loop ], [ %a, %entry ]
25+
%smax = call i8 @llvm.smax.i8(i8 %smax.acc, i8 %b)
26+
%iv.next = add nuw i8 %iv, 1
27+
%cmp = icmp ult i8 %iv.next, %n
28+
br i1 %cmp, label %loop, label %exit
29+
30+
exit:
31+
ret i8 %smax
32+
}
33+
34+
define i8 @simple_recurrence_intrinsic_smin(i8 %n, i8 %a, i8 %b) {
35+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic_smin(
36+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
37+
; CHECK-NEXT: [[ENTRY:.*]]:
38+
; CHECK-NEXT: br label %[[LOOP:.*]]
39+
; CHECK: [[LOOP]]:
40+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
41+
; CHECK-NEXT: [[SMIN_ACC:%.*]] = phi i8 [ [[SMIN:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
42+
; CHECK-NEXT: [[SMIN]] = call i8 @llvm.smin.i8(i8 [[SMIN_ACC]], i8 [[B]])
43+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
44+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
45+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
46+
; CHECK: [[EXIT]]:
47+
; CHECK-NEXT: ret i8 [[SMIN]]
48+
;
49+
entry:
50+
br label %loop
51+
52+
loop:
53+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
54+
%smin.acc = phi i8 [ %smin, %loop ], [ %a, %entry ]
55+
%smin = call i8 @llvm.smin.i8(i8 %smin.acc, i8 %b)
56+
%iv.next = add nuw i8 %iv, 1
57+
%cmp = icmp ult i8 %iv.next, %n
58+
br i1 %cmp, label %loop, label %exit
59+
60+
exit:
61+
ret i8 %smin
62+
}
63+
64+
define i8 @simple_recurrence_intrinsic_umax(i8 %n, i8 %a, i8 %b) {
65+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic_umax(
66+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
67+
; CHECK-NEXT: [[ENTRY:.*]]:
68+
; CHECK-NEXT: br label %[[LOOP:.*]]
69+
; CHECK: [[LOOP]]:
70+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
71+
; CHECK-NEXT: [[UMAX_ACC:%.*]] = phi i8 [ [[UMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
72+
; CHECK-NEXT: [[UMAX]] = call i8 @llvm.umax.i8(i8 [[UMAX_ACC]], i8 [[B]])
73+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
74+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
75+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
76+
; CHECK: [[EXIT]]:
77+
; CHECK-NEXT: ret i8 [[UMAX]]
78+
;
79+
entry:
80+
br label %loop
81+
82+
loop:
83+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
84+
%umax.acc = phi i8 [ %umax, %loop ], [ %a, %entry ]
85+
%umax = call i8 @llvm.umax.i8(i8 %umax.acc, i8 %b)
86+
%iv.next = add nuw i8 %iv, 1
87+
%cmp = icmp ult i8 %iv.next, %n
88+
br i1 %cmp, label %loop, label %exit
89+
90+
exit:
91+
ret i8 %umax
92+
}
93+
94+
define i8 @simple_recurrence_intrinsic_umin(i8 %n, i8 %a, i8 %b) {
95+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic_umin(
96+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
97+
; CHECK-NEXT: [[ENTRY:.*]]:
98+
; CHECK-NEXT: br label %[[LOOP:.*]]
99+
; CHECK: [[LOOP]]:
100+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
101+
; CHECK-NEXT: [[UMIN_ACC:%.*]] = phi i8 [ [[UMIN:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
102+
; CHECK-NEXT: [[UMIN]] = call i8 @llvm.umin.i8(i8 [[UMIN_ACC]], i8 [[B]])
103+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
104+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
105+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
106+
; CHECK: [[EXIT]]:
107+
; CHECK-NEXT: ret i8 [[UMIN]]
108+
;
109+
entry:
110+
br label %loop
111+
112+
loop:
113+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
114+
%umin.acc = phi i8 [ %umin, %loop ], [ %a, %entry ]
115+
%umin = call i8 @llvm.umin.i8(i8 %umin.acc, i8 %b)
116+
%iv.next = add nuw i8 %iv, 1
117+
%cmp = icmp ult i8 %iv.next, %n
118+
br i1 %cmp, label %loop, label %exit
119+
120+
exit:
121+
ret i8 %umin
122+
}
123+
124+
define float @simple_recurrence_intrinsic_maxnum(i32 %n, float %a, float %b) {
125+
; CHECK-LABEL: define float @simple_recurrence_intrinsic_maxnum(
126+
; CHECK-SAME: i32 [[N:%.*]], float [[A:%.*]], float [[B:%.*]]) {
127+
; CHECK-NEXT: [[ENTRY:.*]]:
128+
; CHECK-NEXT: br label %[[LOOP:.*]]
129+
; CHECK: [[LOOP]]:
130+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
131+
; CHECK-NEXT: [[FMAX_ACC:%.*]] = phi float [ [[FMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
132+
; CHECK-NEXT: [[FMAX]] = call float @llvm.maxnum.f32(float [[FMAX_ACC]], float [[B]])
133+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
134+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]
135+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
136+
; CHECK: [[EXIT]]:
137+
; CHECK-NEXT: ret float [[FMAX]]
138+
;
139+
entry:
140+
br label %loop
141+
142+
loop:
143+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
144+
%fmax.acc = phi float [ %fmax, %loop ], [ %a, %entry ]
145+
%fmax = call float @llvm.maxnum.f32(float %fmax.acc, float %b)
146+
%iv.next = add nuw i32 %iv, 1
147+
%cmp = icmp ult i32 %iv.next, %n
148+
br i1 %cmp, label %loop, label %exit
149+
exit:
150+
ret float %fmax
151+
}
152+
153+
define float @simple_recurrence_intrinsic_minnum(i32 %n, float %a, float %b) {
154+
; CHECK-LABEL: define float @simple_recurrence_intrinsic_minnum(
155+
; CHECK-SAME: i32 [[N:%.*]], float [[A:%.*]], float [[B:%.*]]) {
156+
; CHECK-NEXT: [[ENTRY:.*]]:
157+
; CHECK-NEXT: br label %[[LOOP:.*]]
158+
; CHECK: [[LOOP]]:
159+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
160+
; CHECK-NEXT: [[FMIN_ACC:%.*]] = phi float [ [[FMIN:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
161+
; CHECK-NEXT: [[FMIN]] = call float @llvm.minnum.f32(float [[FMIN_ACC]], float [[B]])
162+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
163+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]
164+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
165+
; CHECK: [[EXIT]]:
166+
; CHECK-NEXT: ret float [[FMIN]]
167+
;
168+
entry:
169+
br label %loop
170+
171+
loop:
172+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
173+
%fmin.acc = phi float [ %fmin, %loop ], [ %a, %entry ]
174+
%fmin = call float @llvm.minnum.f32(float %fmin.acc, float %b)
175+
%iv.next = add nuw i32 %iv, 1
176+
%cmp = icmp ult i32 %iv.next, %n
177+
br i1 %cmp, label %loop, label %exit
178+
exit:
179+
ret float %fmin
180+
}
181+
182+
define float @simple_recurrence_intrinsic_maximum(i32 %n, float %a, float %b) {
183+
; CHECK-LABEL: define float @simple_recurrence_intrinsic_maximum(
184+
; CHECK-SAME: i32 [[N:%.*]], float [[A:%.*]], float [[B:%.*]]) {
185+
; CHECK-NEXT: [[ENTRY:.*]]:
186+
; CHECK-NEXT: br label %[[LOOP:.*]]
187+
; CHECK: [[LOOP]]:
188+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
189+
; CHECK-NEXT: [[FMAX_ACC:%.*]] = phi float [ [[FMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
190+
; CHECK-NEXT: [[FMAX]] = call nnan float @llvm.maximum.f32(float [[FMAX_ACC]], float [[B]])
191+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
192+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]
193+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
194+
; CHECK: [[EXIT]]:
195+
; CHECK-NEXT: ret float [[FMAX]]
196+
;
197+
entry:
198+
br label %loop
199+
200+
loop:
201+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
202+
%fmax.acc = phi float [ %fmax, %loop ], [ %a, %entry ]
203+
%fmax = call nnan float @llvm.maximum.f32(float %fmax.acc, float %b)
204+
%iv.next = add nuw i32 %iv, 1
205+
%cmp = icmp ult i32 %iv.next, %n
206+
br i1 %cmp, label %loop, label %exit
207+
exit:
208+
ret float %fmax
209+
}
210+
211+
define float @simple_recurrence_intrinsic_minimum(i32 %n, float %a, float %b) {
212+
; CHECK-LABEL: define float @simple_recurrence_intrinsic_minimum(
213+
; CHECK-SAME: i32 [[N:%.*]], float [[A:%.*]], float [[B:%.*]]) {
214+
; CHECK-NEXT: [[ENTRY:.*]]:
215+
; CHECK-NEXT: br label %[[LOOP:.*]]
216+
; CHECK: [[LOOP]]:
217+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
218+
; CHECK-NEXT: [[FMIN_ACC:%.*]] = phi float [ [[FMIN:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
219+
; CHECK-NEXT: [[FMIN]] = call nnan float @llvm.minimum.f32(float [[FMIN_ACC]], float [[B]])
220+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
221+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]
222+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
223+
; CHECK: [[EXIT]]:
224+
; CHECK-NEXT: ret float [[FMIN]]
225+
;
226+
entry:
227+
br label %loop
228+
229+
loop:
230+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
231+
%fmin.acc = phi float [ %fmin, %loop ], [ %a, %entry ]
232+
%fmin = call nnan float @llvm.minimum.f32(float %fmin.acc, float %b)
233+
%iv.next = add nuw i32 %iv, 1
234+
%cmp = icmp ult i32 %iv.next, %n
235+
br i1 %cmp, label %loop, label %exit
236+
exit:
237+
ret float %fmin
238+
}
239+
240+
define float @simple_recurrence_intrinsic_maximumnum(i32 %n, float %a, float %b) {
241+
; CHECK-LABEL: define float @simple_recurrence_intrinsic_maximumnum(
242+
; CHECK-SAME: i32 [[N:%.*]], float [[A:%.*]], float [[B:%.*]]) {
243+
; CHECK-NEXT: [[ENTRY:.*]]:
244+
; CHECK-NEXT: br label %[[LOOP:.*]]
245+
; CHECK: [[LOOP]]:
246+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
247+
; CHECK-NEXT: [[FMAX_ACC:%.*]] = phi float [ [[FMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
248+
; CHECK-NEXT: [[FMAX]] = call nnan float @llvm.maximumnum.f32(float [[FMAX_ACC]], float [[B]])
249+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
250+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]
251+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
252+
; CHECK: [[EXIT]]:
253+
; CHECK-NEXT: ret float [[FMAX]]
254+
;
255+
entry:
256+
br label %loop
257+
258+
loop:
259+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
260+
%fmax.acc = phi float [ %fmax, %loop ], [ %a, %entry ]
261+
%fmax = call nnan float @llvm.maximumnum.f32(float %fmax.acc, float %b)
262+
%iv.next = add nuw i32 %iv, 1
263+
%cmp = icmp ult i32 %iv.next, %n
264+
br i1 %cmp, label %loop, label %exit
265+
exit:
266+
ret float %fmax
267+
}
268+
269+
define float @simple_recurrence_intrinsic_minimumnum(i32 %n, float %a, float %b) {
270+
; CHECK-LABEL: define float @simple_recurrence_intrinsic_minimumnum(
271+
; CHECK-SAME: i32 [[N:%.*]], float [[A:%.*]], float [[B:%.*]]) {
272+
; CHECK-NEXT: [[ENTRY:.*]]:
273+
; CHECK-NEXT: br label %[[LOOP:.*]]
274+
; CHECK: [[LOOP]]:
275+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
276+
; CHECK-NEXT: [[FMIN_ACC:%.*]] = phi float [ [[FMIN:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
277+
; CHECK-NEXT: [[FMIN]] = call nnan float @llvm.minimumnum.f32(float [[FMIN_ACC]], float [[B]])
278+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
279+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]
280+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
281+
; CHECK: [[EXIT]]:
282+
; CHECK-NEXT: ret float [[FMIN]]
283+
;
284+
entry:
285+
br label %loop
286+
287+
loop:
288+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
289+
%fmin.acc = phi float [ %fmin, %loop ], [ %a, %entry ]
290+
%fmin = call nnan float @llvm.minimumnum.f32(float %fmin.acc, float %b)
291+
%iv.next = add nuw i32 %iv, 1
292+
%cmp = icmp ult i32 %iv.next, %n
293+
br i1 %cmp, label %loop, label %exit
294+
exit:
295+
ret float %fmin
296+
}
297+
298+
define i8 @simple_recurrence_intrinsic_multiuse_phi(i8 %n, i8 %a, i8 %b) {
299+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic_multiuse_phi(
300+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
301+
; CHECK-NEXT: [[ENTRY:.*]]:
302+
; CHECK-NEXT: br label %[[LOOP:.*]]
303+
; CHECK: [[LOOP]]:
304+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
305+
; CHECK-NEXT: [[UMAX_ACC:%.*]] = phi i8 [ [[UMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
306+
; CHECK-NEXT: call void @use(i8 [[UMAX_ACC]])
307+
; CHECK-NEXT: [[UMAX]] = call i8 @llvm.umax.i8(i8 [[UMAX_ACC]], i8 [[B]])
308+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
309+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
310+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
311+
; CHECK: [[EXIT]]:
312+
; CHECK-NEXT: ret i8 [[UMAX]]
313+
;
314+
entry:
315+
br label %loop
316+
317+
loop:
318+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
319+
%umax.acc = phi i8 [ %umax, %loop ], [ %a, %entry ]
320+
call void @use(i8 %umax.acc)
321+
%umax = call i8 @llvm.umax.i8(i8 %umax.acc, i8 %b)
322+
%iv.next = add nuw i8 %iv, 1
323+
%cmp = icmp ult i8 %iv.next, %n
324+
br i1 %cmp, label %loop, label %exit
325+
326+
exit:
327+
ret i8 %umax
328+
}
329+
330+
; Negative tests.
331+
332+
define float @simple_recurrence_intrinsic_copysign(i32 %n, float %a, float %b) {
333+
; CHECK-LABEL: define float @simple_recurrence_intrinsic_copysign(
334+
; CHECK-SAME: i32 [[N:%.*]], float [[A:%.*]], float [[B:%.*]]) {
335+
; CHECK-NEXT: [[ENTRY:.*]]:
336+
; CHECK-NEXT: br label %[[LOOP:.*]]
337+
; CHECK: [[LOOP]]:
338+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
339+
; CHECK-NEXT: [[MAG_ACC:%.*]] = phi float [ [[MAG:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
340+
; CHECK-NEXT: [[MAG]] = call nnan float @llvm.copysign.f32(float [[MAG_ACC]], float [[B]])
341+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 1
342+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]
343+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
344+
; CHECK: [[EXIT]]:
345+
; CHECK-NEXT: ret float [[MAG]]
346+
;
347+
entry:
348+
br label %loop
349+
350+
loop:
351+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
352+
%mag.acc = phi float [ %mag, %loop ], [ %a, %entry ]
353+
%mag = call nnan float @llvm.copysign.f32(float %mag.acc, float %b)
354+
%iv.next = add nuw i32 %iv, 1
355+
%cmp = icmp ult i32 %iv.next, %n
356+
br i1 %cmp, label %loop, label %exit
357+
exit:
358+
ret float %mag
359+
}
360+
361+
define i8 @simple_recurrence_intrinsic_arg_loop_variant(i8 %n, i8 %a) {
362+
; CHECK-LABEL: define i8 @simple_recurrence_intrinsic_arg_loop_variant(
363+
; CHECK-SAME: i8 [[N:%.*]], i8 [[A:%.*]]) {
364+
; CHECK-NEXT: [[ENTRY:.*]]:
365+
; CHECK-NEXT: br label %[[LOOP:.*]]
366+
; CHECK: [[LOOP]]:
367+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[ENTRY]] ]
368+
; CHECK-NEXT: [[UMAX_ACC:%.*]] = phi i8 [ [[UMAX:%.*]], %[[LOOP]] ], [ [[A]], %[[ENTRY]] ]
369+
; CHECK-NEXT: [[B:%.*]] = xor i8 [[IV]], 42
370+
; CHECK-NEXT: [[UMAX]] = call i8 @llvm.umax.i8(i8 [[UMAX_ACC]], i8 [[B]])
371+
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
372+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[N]]
373+
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
374+
; CHECK: [[EXIT]]:
375+
; CHECK-NEXT: ret i8 [[UMAX]]
376+
;
377+
entry:
378+
br label %loop
379+
380+
loop:
381+
%iv = phi i8 [ %iv.next, %loop ], [ 0, %entry ]
382+
%umax.acc = phi i8 [ %umax, %loop ], [ %a, %entry ]
383+
%b = xor i8 %iv, 42
384+
%umax = call i8 @llvm.umax.i8(i8 %umax.acc, i8 %b)
385+
%iv.next = add nuw i8 %iv, 1
386+
%cmp = icmp ult i8 %iv.next, %n
387+
br i1 %cmp, label %loop, label %exit
388+
389+
exit:
390+
ret i8 %umax
391+
}
392+
393+
declare void @use(i8)

0 commit comments

Comments
 (0)