xref: /llvm-project/llvm/test/Transforms/InstCombine/commutative-operation-over-phis.ll (revision 8674a023bcacb677ce48b8831e2ae35b5aa2d8ef)
1*8674a023SChia; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*8674a023SChia; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3*8674a023SChia
4*8674a023SChiadeclare void @dummy()
5*8674a023SChia
6*8674a023SChiadeclare i32 @llvm.smax.i32(i32 %a, i32 %b)
7*8674a023SChiadeclare i32 @llvm.smin.i32(i32 %a, i32 %b)
8*8674a023SChiadeclare i32 @llvm.umax.i32(i32 %a, i32 %b)
9*8674a023SChiadeclare i32 @llvm.umin.i32(i32 %a, i32 %b)
10*8674a023SChiadeclare float @llvm.maxnum.f32(float %a, float %b)
11*8674a023SChiadeclare float @llvm.minnum.f32(float %a, float %b)
12*8674a023SChiadeclare float @llvm.maximum.f32(float %a, float %b)
13*8674a023SChiadeclare float @llvm.minimum.f32(float %a, float %b)
14*8674a023SChiadeclare float @llvm.pow.f32(float %a, float %b)
15*8674a023SChia
16*8674a023SChiadefine i8 @fold_phi_mul(i1 %c, i8 %a, i8 %b)  {
17*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul(
18*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
19*8674a023SChia; CHECK-NEXT:  entry:
20*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
21*8674a023SChia; CHECK:       then:
22*8674a023SChia; CHECK-NEXT:    call void @dummy()
23*8674a023SChia; CHECK-NEXT:    br label [[END]]
24*8674a023SChia; CHECK:       end:
25*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[A]], [[B]]
26*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
27*8674a023SChia;
28*8674a023SChiaentry:
29*8674a023SChia  br i1 %c, label %then, label %end
30*8674a023SChiathen:
31*8674a023SChia  call void @dummy()
32*8674a023SChia  br label %end
33*8674a023SChiaend:
34*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
35*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then]
36*8674a023SChia  %ret = mul i8 %phi1, %phi2
37*8674a023SChia  ret i8 %ret
38*8674a023SChia}
39*8674a023SChia
40*8674a023SChiadefine i8 @fold_phi_mul_three(i1 %c, i1 %d, i8 %a, i8 %b)  {
41*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_three(
42*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i1 [[D:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
43*8674a023SChia; CHECK-NEXT:  entry:
44*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN1:%.*]], label [[END:%.*]]
45*8674a023SChia; CHECK:       then1:
46*8674a023SChia; CHECK-NEXT:    call void @dummy()
47*8674a023SChia; CHECK-NEXT:    br i1 [[D]], label [[THEN2:%.*]], label [[END]]
48*8674a023SChia; CHECK:       then2:
49*8674a023SChia; CHECK-NEXT:    call void @dummy()
50*8674a023SChia; CHECK-NEXT:    br label [[END]]
51*8674a023SChia; CHECK:       end:
52*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[A]], [[B]]
53*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
54*8674a023SChia;
55*8674a023SChiaentry:
56*8674a023SChia  br i1 %c, label %then1, label %end
57*8674a023SChiathen1:
58*8674a023SChia  call void @dummy()
59*8674a023SChia  br i1 %d, label %then2, label %end
60*8674a023SChiathen2:
61*8674a023SChia  call void @dummy()
62*8674a023SChia  br label %end
63*8674a023SChiaend:
64*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then1], [%a, %then2]
65*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then1], [%b, %then2]
66*8674a023SChia  %ret = mul i8 %phi1, %phi2
67*8674a023SChia  ret i8 %ret
68*8674a023SChia}
69*8674a023SChia
70*8674a023SChiadefine i8 @fold_phi_mul_three_notopt(i1 %c, i1 %d, i8 %a, i8 %b)  {
71*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_three_notopt(
72*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i1 [[D:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
73*8674a023SChia; CHECK-NEXT:  entry:
74*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN1:%.*]], label [[END:%.*]]
75*8674a023SChia; CHECK:       then1:
76*8674a023SChia; CHECK-NEXT:    call void @dummy()
77*8674a023SChia; CHECK-NEXT:    br i1 [[D]], label [[THEN2:%.*]], label [[END]]
78*8674a023SChia; CHECK:       then2:
79*8674a023SChia; CHECK-NEXT:    call void @dummy()
80*8674a023SChia; CHECK-NEXT:    br label [[END]]
81*8674a023SChia; CHECK:       end:
82*8674a023SChia; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN1]] ], [ [[A]], [[THEN2]] ]
83*8674a023SChia; CHECK-NEXT:    [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN1]] ], [ [[A]], [[THEN2]] ]
84*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[PHI1]], [[PHI2]]
85*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
86*8674a023SChia;
87*8674a023SChiaentry:
88*8674a023SChia  br i1 %c, label %then1, label %end
89*8674a023SChiathen1:
90*8674a023SChia  call void @dummy()
91*8674a023SChia  br i1 %d, label %then2, label %end
92*8674a023SChiathen2:
93*8674a023SChia  call void @dummy()
94*8674a023SChia  br label %end
95*8674a023SChiaend:
96*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then1], [%a, %then2]
97*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then1], [%a, %then2]
98*8674a023SChia  %ret = mul i8 %phi1, %phi2
99*8674a023SChia  ret i8 %ret
100*8674a023SChia}
101*8674a023SChia
102*8674a023SChiadefine i8 @fold_phi_mul_nsw_nuw(i1 %c, i8 %a, i8 %b)  {
103*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_nsw_nuw(
104*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
105*8674a023SChia; CHECK-NEXT:  entry:
106*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
107*8674a023SChia; CHECK:       then:
108*8674a023SChia; CHECK-NEXT:    call void @dummy()
109*8674a023SChia; CHECK-NEXT:    br label [[END]]
110*8674a023SChia; CHECK:       end:
111*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = mul nuw nsw i8 [[A]], [[B]]
112*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
113*8674a023SChia;
114*8674a023SChiaentry:
115*8674a023SChia  br i1 %c, label %then, label %end
116*8674a023SChiathen:
117*8674a023SChia  call void @dummy()
118*8674a023SChia  br label %end
119*8674a023SChiaend:
120*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
121*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then]
122*8674a023SChia  %ret = mul nsw nuw i8 %phi1, %phi2
123*8674a023SChia  ret i8 %ret
124*8674a023SChia}
125*8674a023SChia
126*8674a023SChiadefine <2 x i8> @fold_phi_mul_fix_vec(i1 %c, <2 x i8> %a, <2 x i8> %b)  {
127*8674a023SChia; CHECK-LABEL: define <2 x i8> @fold_phi_mul_fix_vec(
128*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], <2 x i8> [[A:%.*]], <2 x i8> [[B:%.*]]) {
129*8674a023SChia; CHECK-NEXT:  entry:
130*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
131*8674a023SChia; CHECK:       then:
132*8674a023SChia; CHECK-NEXT:    call void @dummy()
133*8674a023SChia; CHECK-NEXT:    br label [[END]]
134*8674a023SChia; CHECK:       end:
135*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = mul <2 x i8> [[A]], [[B]]
136*8674a023SChia; CHECK-NEXT:    ret <2 x i8> [[RET]]
137*8674a023SChia;
138*8674a023SChiaentry:
139*8674a023SChia  br i1 %c, label %then, label %end
140*8674a023SChiathen:
141*8674a023SChia  call void @dummy()
142*8674a023SChia  br label %end
143*8674a023SChiaend:
144*8674a023SChia  %phi1 = phi <2 x i8> [%a, %entry], [%b, %then]
145*8674a023SChia  %phi2 = phi <2 x i8> [%b, %entry], [%a, %then]
146*8674a023SChia  %ret = mul <2 x i8> %phi1, %phi2
147*8674a023SChia  ret <2 x i8> %ret
148*8674a023SChia}
149*8674a023SChia
150*8674a023SChiadefine <vscale x 2 x i8> @fold_phi_mul_scale_vec(i1 %c, <vscale x 2 x i8> %a, <vscale x 2 x i8> %b)  {
151*8674a023SChia; CHECK-LABEL: define <vscale x 2 x i8> @fold_phi_mul_scale_vec(
152*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], <vscale x 2 x i8> [[A:%.*]], <vscale x 2 x i8> [[B:%.*]]) {
153*8674a023SChia; CHECK-NEXT:  entry:
154*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
155*8674a023SChia; CHECK:       then:
156*8674a023SChia; CHECK-NEXT:    call void @dummy()
157*8674a023SChia; CHECK-NEXT:    br label [[END]]
158*8674a023SChia; CHECK:       end:
159*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = mul <vscale x 2 x i8> [[A]], [[B]]
160*8674a023SChia; CHECK-NEXT:    ret <vscale x 2 x i8> [[RET]]
161*8674a023SChia;
162*8674a023SChiaentry:
163*8674a023SChia  br i1 %c, label %then, label %end
164*8674a023SChiathen:
165*8674a023SChia  call void @dummy()
166*8674a023SChia  br label %end
167*8674a023SChiaend:
168*8674a023SChia  %phi1 = phi <vscale x 2 x i8> [%a, %entry], [%b, %then]
169*8674a023SChia  %phi2 = phi <vscale x 2 x i8> [%b, %entry], [%a, %then]
170*8674a023SChia  %ret = mul <vscale x 2 x i8> %phi1, %phi2
171*8674a023SChia  ret <vscale x 2 x i8> %ret
172*8674a023SChia}
173*8674a023SChia
174*8674a023SChiadefine i8 @fold_phi_mul_commute(i1 %c, i8 %a, i8 %b)  {
175*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_commute(
176*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
177*8674a023SChia; CHECK-NEXT:  entry:
178*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
179*8674a023SChia; CHECK:       then:
180*8674a023SChia; CHECK-NEXT:    call void @dummy()
181*8674a023SChia; CHECK-NEXT:    br label [[END]]
182*8674a023SChia; CHECK:       end:
183*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[A]], [[B]]
184*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
185*8674a023SChia;
186*8674a023SChiaentry:
187*8674a023SChia  br i1 %c, label %then, label %end
188*8674a023SChiathen:
189*8674a023SChia  call void @dummy()
190*8674a023SChia  br label %end
191*8674a023SChiaend:
192*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
193*8674a023SChia  %phi2 = phi i8 [%a, %then], [%b, %entry]
194*8674a023SChia  %ret = mul i8 %phi1, %phi2
195*8674a023SChia  ret i8 %ret
196*8674a023SChia}
197*8674a023SChia
198*8674a023SChia
199*8674a023SChiadefine i8 @fold_phi_mul_notopt(i1 %c, i8 %a, i8 %b, i8 %d)  {
200*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_notopt(
201*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]], i8 [[D:%.*]]) {
202*8674a023SChia; CHECK-NEXT:  entry:
203*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
204*8674a023SChia; CHECK:       then:
205*8674a023SChia; CHECK-NEXT:    call void @dummy()
206*8674a023SChia; CHECK-NEXT:    br label [[END]]
207*8674a023SChia; CHECK:       end:
208*8674a023SChia; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ]
209*8674a023SChia; CHECK-NEXT:    [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[D]], [[THEN]] ]
210*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[PHI1]], [[PHI2]]
211*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
212*8674a023SChia;
213*8674a023SChiaentry:
214*8674a023SChia  br i1 %c, label %then, label %end
215*8674a023SChiathen:
216*8674a023SChia  call void @dummy()
217*8674a023SChia  br label %end
218*8674a023SChiaend:
219*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
220*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%d, %then]
221*8674a023SChia  %ret = mul i8 %phi1, %phi2
222*8674a023SChia  ret i8 %ret
223*8674a023SChia}
224*8674a023SChia
225*8674a023SChia
226*8674a023SChiadefine i8 @fold_phi_sub(i1 %c, i8 %a, i8 %b)  {
227*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_sub(
228*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
229*8674a023SChia; CHECK-NEXT:  entry:
230*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
231*8674a023SChia; CHECK:       then:
232*8674a023SChia; CHECK-NEXT:    call void @dummy()
233*8674a023SChia; CHECK-NEXT:    br label [[END]]
234*8674a023SChia; CHECK:       end:
235*8674a023SChia; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ]
236*8674a023SChia; CHECK-NEXT:    [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN]] ]
237*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = sub i8 [[PHI1]], [[PHI2]]
238*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
239*8674a023SChia;
240*8674a023SChiaentry:
241*8674a023SChia  br i1 %c, label %then, label %end
242*8674a023SChiathen:
243*8674a023SChia  call void @dummy()
244*8674a023SChia  br label %end
245*8674a023SChiaend:
246*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
247*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then]
248*8674a023SChia  %ret = sub i8 %phi1, %phi2
249*8674a023SChia  ret i8 %ret
250*8674a023SChia}
251*8674a023SChia
252*8674a023SChia
253*8674a023SChiadefine i8 @fold_phi_add(i1 %c, i8 %a, i8 %b)  {
254*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_add(
255*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
256*8674a023SChia; CHECK-NEXT:  entry:
257*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
258*8674a023SChia; CHECK:       then:
259*8674a023SChia; CHECK-NEXT:    call void @dummy()
260*8674a023SChia; CHECK-NEXT:    br label [[END]]
261*8674a023SChia; CHECK:       end:
262*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = add i8 [[A]], [[B]]
263*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
264*8674a023SChia;
265*8674a023SChiaentry:
266*8674a023SChia  br i1 %c, label %then, label %end
267*8674a023SChiathen:
268*8674a023SChia  call void @dummy()
269*8674a023SChia  br label %end
270*8674a023SChiaend:
271*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
272*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then]
273*8674a023SChia  %ret = add i8 %phi1, %phi2
274*8674a023SChia  ret i8 %ret
275*8674a023SChia}
276*8674a023SChia
277*8674a023SChiadefine i8 @fold_phi_and(i1 %c, i8 %a, i8 %b)  {
278*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_and(
279*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
280*8674a023SChia; CHECK-NEXT:  entry:
281*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
282*8674a023SChia; CHECK:       then:
283*8674a023SChia; CHECK-NEXT:    call void @dummy()
284*8674a023SChia; CHECK-NEXT:    br label [[END]]
285*8674a023SChia; CHECK:       end:
286*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = and i8 [[A]], [[B]]
287*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
288*8674a023SChia;
289*8674a023SChiaentry:
290*8674a023SChia  br i1 %c, label %then, label %end
291*8674a023SChiathen:
292*8674a023SChia  call void @dummy()
293*8674a023SChia  br label %end
294*8674a023SChiaend:
295*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
296*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then]
297*8674a023SChia  %ret = and i8 %phi1, %phi2
298*8674a023SChia  ret i8 %ret
299*8674a023SChia}
300*8674a023SChia
301*8674a023SChiadefine i8 @fold_phi_or(i1 %c, i8 %a, i8 %b)  {
302*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_or(
303*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
304*8674a023SChia; CHECK-NEXT:  entry:
305*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
306*8674a023SChia; CHECK:       then:
307*8674a023SChia; CHECK-NEXT:    call void @dummy()
308*8674a023SChia; CHECK-NEXT:    br label [[END]]
309*8674a023SChia; CHECK:       end:
310*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = or i8 [[A]], [[B]]
311*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
312*8674a023SChia;
313*8674a023SChiaentry:
314*8674a023SChia  br i1 %c, label %then, label %end
315*8674a023SChiathen:
316*8674a023SChia  call void @dummy()
317*8674a023SChia  br label %end
318*8674a023SChiaend:
319*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
320*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then]
321*8674a023SChia  %ret = or i8 %phi1, %phi2
322*8674a023SChia  ret i8 %ret
323*8674a023SChia}
324*8674a023SChia
325*8674a023SChia
326*8674a023SChiadefine i8 @fold_phi_xor(i1 %c, i8 %a, i8 %b)  {
327*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_xor(
328*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
329*8674a023SChia; CHECK-NEXT:  entry:
330*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
331*8674a023SChia; CHECK:       then:
332*8674a023SChia; CHECK-NEXT:    call void @dummy()
333*8674a023SChia; CHECK-NEXT:    br label [[END]]
334*8674a023SChia; CHECK:       end:
335*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = xor i8 [[A]], [[B]]
336*8674a023SChia; CHECK-NEXT:    ret i8 [[RET]]
337*8674a023SChia;
338*8674a023SChiaentry:
339*8674a023SChia  br i1 %c, label %then, label %end
340*8674a023SChiathen:
341*8674a023SChia  call void @dummy()
342*8674a023SChia  br label %end
343*8674a023SChiaend:
344*8674a023SChia  %phi1 = phi i8 [%a, %entry], [%b, %then]
345*8674a023SChia  %phi2 = phi i8 [%b, %entry], [%a, %then]
346*8674a023SChia  %ret = xor i8 %phi1, %phi2
347*8674a023SChia  ret i8 %ret
348*8674a023SChia}
349*8674a023SChia
350*8674a023SChia
351*8674a023SChiadefine float @fold_phi_fadd(i1 %c, float %a, float %b)  {
352*8674a023SChia; CHECK-LABEL: define float @fold_phi_fadd(
353*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
354*8674a023SChia; CHECK-NEXT:  entry:
355*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
356*8674a023SChia; CHECK:       then:
357*8674a023SChia; CHECK-NEXT:    call void @dummy()
358*8674a023SChia; CHECK-NEXT:    br label [[END]]
359*8674a023SChia; CHECK:       end:
360*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = fadd float [[A]], [[B]]
361*8674a023SChia; CHECK-NEXT:    ret float [[RET]]
362*8674a023SChia;
363*8674a023SChiaentry:
364*8674a023SChia  br i1 %c, label %then, label %end
365*8674a023SChiathen:
366*8674a023SChia  call void @dummy()
367*8674a023SChia  br label %end
368*8674a023SChiaend:
369*8674a023SChia  %phi1 = phi float [%a, %entry], [%b, %then]
370*8674a023SChia  %phi2 = phi float [%b, %entry], [%a, %then]
371*8674a023SChia  %ret = fadd float %phi1, %phi2
372*8674a023SChia  ret float %ret
373*8674a023SChia}
374*8674a023SChia
375*8674a023SChiadefine float @fold_phi_fadd_nnan(i1 %c, float %a, float %b)  {
376*8674a023SChia; CHECK-LABEL: define float @fold_phi_fadd_nnan(
377*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
378*8674a023SChia; CHECK-NEXT:  entry:
379*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
380*8674a023SChia; CHECK:       then:
381*8674a023SChia; CHECK-NEXT:    call void @dummy()
382*8674a023SChia; CHECK-NEXT:    br label [[END]]
383*8674a023SChia; CHECK:       end:
384*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = fadd nnan float [[A]], [[B]]
385*8674a023SChia; CHECK-NEXT:    ret float [[RET]]
386*8674a023SChia;
387*8674a023SChiaentry:
388*8674a023SChia  br i1 %c, label %then, label %end
389*8674a023SChiathen:
390*8674a023SChia  call void @dummy()
391*8674a023SChia  br label %end
392*8674a023SChiaend:
393*8674a023SChia  %phi1 = phi float [%a, %entry], [%b, %then]
394*8674a023SChia  %phi2 = phi float [%b, %entry], [%a, %then]
395*8674a023SChia  %ret = fadd nnan float %phi1, %phi2
396*8674a023SChia  ret float %ret
397*8674a023SChia}
398*8674a023SChia
399*8674a023SChia
400*8674a023SChiadefine float @fold_phi_fmul(i1 %c, float %a, float %b)  {
401*8674a023SChia; CHECK-LABEL: define float @fold_phi_fmul(
402*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
403*8674a023SChia; CHECK-NEXT:  entry:
404*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
405*8674a023SChia; CHECK:       then:
406*8674a023SChia; CHECK-NEXT:    call void @dummy()
407*8674a023SChia; CHECK-NEXT:    br label [[END]]
408*8674a023SChia; CHECK:       end:
409*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = fmul float [[A]], [[B]]
410*8674a023SChia; CHECK-NEXT:    ret float [[RET]]
411*8674a023SChia;
412*8674a023SChiaentry:
413*8674a023SChia  br i1 %c, label %then, label %end
414*8674a023SChiathen:
415*8674a023SChia  call void @dummy()
416*8674a023SChia  br label %end
417*8674a023SChiaend:
418*8674a023SChia  %phi1 = phi float [%a, %entry], [%b, %then]
419*8674a023SChia  %phi2 = phi float [%b, %entry], [%a, %then]
420*8674a023SChia  %ret = fmul float %phi1, %phi2
421*8674a023SChia  ret float %ret
422*8674a023SChia}
423*8674a023SChia
424*8674a023SChia
425*8674a023SChiadefine i32 @fold_phi_smax(i1 %c, i32 %a, i32 %b)  {
426*8674a023SChia; CHECK-LABEL: define i32 @fold_phi_smax(
427*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
428*8674a023SChia; CHECK-NEXT:  entry:
429*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
430*8674a023SChia; CHECK:       then:
431*8674a023SChia; CHECK-NEXT:    call void @dummy()
432*8674a023SChia; CHECK-NEXT:    br label [[END]]
433*8674a023SChia; CHECK:       end:
434*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.smax.i32(i32 [[A]], i32 [[B]])
435*8674a023SChia; CHECK-NEXT:    ret i32 [[RET]]
436*8674a023SChia;
437*8674a023SChiaentry:
438*8674a023SChia  br i1 %c, label %then, label %end
439*8674a023SChiathen:
440*8674a023SChia  call void @dummy()
441*8674a023SChia  br label %end
442*8674a023SChiaend:
443*8674a023SChia  %phi1 = phi i32 [%a, %entry], [%b, %then]
444*8674a023SChia  %phi2 = phi i32 [%b, %entry], [%a, %then]
445*8674a023SChia  %ret = call i32 @llvm.smax.i32(i32  %phi1, i32 %phi2)
446*8674a023SChia  ret i32 %ret
447*8674a023SChia}
448*8674a023SChia
449*8674a023SChia
450*8674a023SChiadefine i32 @fold_phi_smin(i1 %c, i32 %a, i32 %b)  {
451*8674a023SChia; CHECK-LABEL: define i32 @fold_phi_smin(
452*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
453*8674a023SChia; CHECK-NEXT:  entry:
454*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
455*8674a023SChia; CHECK:       then:
456*8674a023SChia; CHECK-NEXT:    call void @dummy()
457*8674a023SChia; CHECK-NEXT:    br label [[END]]
458*8674a023SChia; CHECK:       end:
459*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]])
460*8674a023SChia; CHECK-NEXT:    ret i32 [[RET]]
461*8674a023SChia;
462*8674a023SChiaentry:
463*8674a023SChia  br i1 %c, label %then, label %end
464*8674a023SChiathen:
465*8674a023SChia  call void @dummy()
466*8674a023SChia  br label %end
467*8674a023SChiaend:
468*8674a023SChia  %phi1 = phi i32 [%a, %entry], [%b, %then]
469*8674a023SChia  %phi2 = phi i32 [%b, %entry], [%a, %then]
470*8674a023SChia  %ret = call i32 @llvm.smin.i32(i32  %phi1, i32 %phi2)
471*8674a023SChia  ret i32 %ret
472*8674a023SChia}
473*8674a023SChia
474*8674a023SChia
475*8674a023SChiadefine i32 @fold_phi_umax(i1 %c, i32 %a, i32 %b)  {
476*8674a023SChia; CHECK-LABEL: define i32 @fold_phi_umax(
477*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
478*8674a023SChia; CHECK-NEXT:  entry:
479*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
480*8674a023SChia; CHECK:       then:
481*8674a023SChia; CHECK-NEXT:    call void @dummy()
482*8674a023SChia; CHECK-NEXT:    br label [[END]]
483*8674a023SChia; CHECK:       end:
484*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.umax.i32(i32 [[A]], i32 [[B]])
485*8674a023SChia; CHECK-NEXT:    ret i32 [[RET]]
486*8674a023SChia;
487*8674a023SChiaentry:
488*8674a023SChia  br i1 %c, label %then, label %end
489*8674a023SChiathen:
490*8674a023SChia  call void @dummy()
491*8674a023SChia  br label %end
492*8674a023SChiaend:
493*8674a023SChia  %phi1 = phi i32 [%a, %entry], [%b, %then]
494*8674a023SChia  %phi2 = phi i32 [%b, %entry], [%a, %then]
495*8674a023SChia  %ret = call i32 @llvm.umax.i32(i32  %phi1, i32 %phi2)
496*8674a023SChia  ret i32 %ret
497*8674a023SChia}
498*8674a023SChia
499*8674a023SChiadefine i32 @fold_phi_umin(i1 %c, i32 %a, i32 %b)  {
500*8674a023SChia; CHECK-LABEL: define i32 @fold_phi_umin(
501*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
502*8674a023SChia; CHECK-NEXT:  entry:
503*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
504*8674a023SChia; CHECK:       then:
505*8674a023SChia; CHECK-NEXT:    call void @dummy()
506*8674a023SChia; CHECK-NEXT:    br label [[END]]
507*8674a023SChia; CHECK:       end:
508*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]])
509*8674a023SChia; CHECK-NEXT:    ret i32 [[RET]]
510*8674a023SChia;
511*8674a023SChiaentry:
512*8674a023SChia  br i1 %c, label %then, label %end
513*8674a023SChiathen:
514*8674a023SChia  call void @dummy()
515*8674a023SChia  br label %end
516*8674a023SChiaend:
517*8674a023SChia  %phi1 = phi i32 [%a, %entry], [%b, %then]
518*8674a023SChia  %phi2 = phi i32 [%b, %entry], [%a, %then]
519*8674a023SChia  %ret = call i32 @llvm.umin.i32(i32  %phi1, i32 %phi2)
520*8674a023SChia  ret i32 %ret
521*8674a023SChia}
522*8674a023SChia
523*8674a023SChia
524*8674a023SChiadefine float @fold_phi_maxnum(i1 %c, float %a, float %b)  {
525*8674a023SChia; CHECK-LABEL: define float @fold_phi_maxnum(
526*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
527*8674a023SChia; CHECK-NEXT:  entry:
528*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
529*8674a023SChia; CHECK:       then:
530*8674a023SChia; CHECK-NEXT:    call void @dummy()
531*8674a023SChia; CHECK-NEXT:    br label [[END]]
532*8674a023SChia; CHECK:       end:
533*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.maxnum.f32(float [[A]], float [[B]])
534*8674a023SChia; CHECK-NEXT:    ret float [[RET]]
535*8674a023SChia;
536*8674a023SChiaentry:
537*8674a023SChia  br i1 %c, label %then, label %end
538*8674a023SChiathen:
539*8674a023SChia  call void @dummy()
540*8674a023SChia  br label %end
541*8674a023SChiaend:
542*8674a023SChia  %phi1 = phi float [%a, %entry], [%b, %then]
543*8674a023SChia  %phi2 = phi float [%b, %entry], [%a, %then]
544*8674a023SChia  %ret = call float @llvm.maxnum.f32(float  %phi1, float %phi2)
545*8674a023SChia  ret float %ret
546*8674a023SChia}
547*8674a023SChia
548*8674a023SChiadefine float @fold_phi_pow(i1 %c, float %a, float %b)  {
549*8674a023SChia; CHECK-LABEL: define float @fold_phi_pow(
550*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
551*8674a023SChia; CHECK-NEXT:  entry:
552*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
553*8674a023SChia; CHECK:       then:
554*8674a023SChia; CHECK-NEXT:    call void @dummy()
555*8674a023SChia; CHECK-NEXT:    br label [[END]]
556*8674a023SChia; CHECK:       end:
557*8674a023SChia; CHECK-NEXT:    [[PHI1:%.*]] = phi float [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ]
558*8674a023SChia; CHECK-NEXT:    [[PHI2:%.*]] = phi float [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN]] ]
559*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.pow.f32(float [[PHI1]], float [[PHI2]])
560*8674a023SChia; CHECK-NEXT:    ret float [[RET]]
561*8674a023SChia;
562*8674a023SChiaentry:
563*8674a023SChia  br i1 %c, label %then, label %end
564*8674a023SChiathen:
565*8674a023SChia  call void @dummy()
566*8674a023SChia  br label %end
567*8674a023SChiaend:
568*8674a023SChia  %phi1 = phi float [%a, %entry], [%b, %then]
569*8674a023SChia  %phi2 = phi float [%b, %entry], [%a, %then]
570*8674a023SChia  %ret = call float @llvm.pow.f32(float  %phi1, float %phi2)
571*8674a023SChia  ret float %ret
572*8674a023SChia}
573*8674a023SChia
574*8674a023SChiadefine float @fold_phi_minnum(i1 %c, float %a, float %b)  {
575*8674a023SChia; CHECK-LABEL: define float @fold_phi_minnum(
576*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
577*8674a023SChia; CHECK-NEXT:  entry:
578*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
579*8674a023SChia; CHECK:       then:
580*8674a023SChia; CHECK-NEXT:    call void @dummy()
581*8674a023SChia; CHECK-NEXT:    br label [[END]]
582*8674a023SChia; CHECK:       end:
583*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.minnum.f32(float [[A]], float [[B]])
584*8674a023SChia; CHECK-NEXT:    ret float [[RET]]
585*8674a023SChia;
586*8674a023SChiaentry:
587*8674a023SChia  br i1 %c, label %then, label %end
588*8674a023SChiathen:
589*8674a023SChia  call void @dummy()
590*8674a023SChia  br label %end
591*8674a023SChiaend:
592*8674a023SChia  %phi1 = phi float [%a, %entry], [%b, %then]
593*8674a023SChia  %phi2 = phi float [%b, %entry], [%a, %then]
594*8674a023SChia  %ret = call float @llvm.minnum.f32(float  %phi1, float %phi2)
595*8674a023SChia  ret float %ret
596*8674a023SChia}
597*8674a023SChia
598*8674a023SChiadefine float @fold_phi_maximum(i1 %c, float %a, float %b)  {
599*8674a023SChia; CHECK-LABEL: define float @fold_phi_maximum(
600*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
601*8674a023SChia; CHECK-NEXT:  entry:
602*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
603*8674a023SChia; CHECK:       then:
604*8674a023SChia; CHECK-NEXT:    call void @dummy()
605*8674a023SChia; CHECK-NEXT:    br label [[END]]
606*8674a023SChia; CHECK:       end:
607*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.maximum.f32(float [[A]], float [[B]])
608*8674a023SChia; CHECK-NEXT:    ret float [[RET]]
609*8674a023SChia;
610*8674a023SChiaentry:
611*8674a023SChia  br i1 %c, label %then, label %end
612*8674a023SChiathen:
613*8674a023SChia  call void @dummy()
614*8674a023SChia  br label %end
615*8674a023SChiaend:
616*8674a023SChia  %phi1 = phi float [%a, %entry], [%b, %then]
617*8674a023SChia  %phi2 = phi float [%b, %entry], [%a, %then]
618*8674a023SChia  %ret = call float @llvm.maximum.f32(float  %phi1, float %phi2)
619*8674a023SChia  ret float %ret
620*8674a023SChia}
621*8674a023SChia
622*8674a023SChiadefine float @fold_phi_minimum(i1 %c, float %a, float %b)  {
623*8674a023SChia; CHECK-LABEL: define float @fold_phi_minimum(
624*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
625*8674a023SChia; CHECK-NEXT:  entry:
626*8674a023SChia; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]
627*8674a023SChia; CHECK:       then:
628*8674a023SChia; CHECK-NEXT:    call void @dummy()
629*8674a023SChia; CHECK-NEXT:    br label [[END]]
630*8674a023SChia; CHECK:       end:
631*8674a023SChia; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.minimum.f32(float [[A]], float [[B]])
632*8674a023SChia; CHECK-NEXT:    ret float [[RET]]
633*8674a023SChia;
634*8674a023SChiaentry:
635*8674a023SChia  br i1 %c, label %then, label %end
636*8674a023SChiathen:
637*8674a023SChia  call void @dummy()
638*8674a023SChia  br label %end
639*8674a023SChiaend:
640*8674a023SChia  %phi1 = phi float [%a, %entry], [%b, %then]
641*8674a023SChia  %phi2 = phi float [%b, %entry], [%a, %then]
642*8674a023SChia  %ret = call float @llvm.minimum.f32(float  %phi1, float %phi2)
643*8674a023SChia  ret float %ret
644*8674a023SChia}
645*8674a023SChia
646