xref: /llvm-project/llvm/test/Transforms/InstCombine/commutative-operation-over-selects.ll (revision 88cc35b27e6c7966ab2463fa06d3dd970e88df64)
1*88cc35b2SSizov Nikita; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*88cc35b2SSizov Nikita; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3*88cc35b2SSizov Nikita
4*88cc35b2SSizov Nikitadeclare float @llvm.maxnum.f32(float %a, float %b)
5*88cc35b2SSizov Nikitadeclare float @llvm.minnum.f32(float %a, float %b)
6*88cc35b2SSizov Nikitadeclare float @llvm.maximum.f32(float %a, float %b)
7*88cc35b2SSizov Nikitadeclare float @llvm.minimum.f32(float %a, float %b)
8*88cc35b2SSizov Nikitadeclare i32 @llvm.smax.i32(i32 %a, i32 %b)
9*88cc35b2SSizov Nikitadeclare i32 @llvm.smin.i32(i32 %a, i32 %b)
10*88cc35b2SSizov Nikitadeclare i32 @llvm.umax.i32(i32 %a, i32 %b)
11*88cc35b2SSizov Nikitadeclare i32 @llvm.umin.i32(i32 %a, i32 %b)
12*88cc35b2SSizov Nikitadeclare i16 @llvm.sadd.sat.i16(i16 %a, i16 %b)
13*88cc35b2SSizov Nikitadeclare i16 @llvm.uadd.sat.i16(i16 %a, i16 %b)
14*88cc35b2SSizov Nikitadeclare {i16, i1} @llvm.sadd.with.overflow.i16(i16 %a, i16 %b)
15*88cc35b2SSizov Nikitadeclare {i16, i1} @llvm.uadd.with.overflow.i16(i16 %a, i16 %b)
16*88cc35b2SSizov Nikitadeclare {i16, i1} @llvm.smul.with.overflow.i16(i16 %a, i16 %b)
17*88cc35b2SSizov Nikitadeclare {i16, i1} @llvm.umul.with.overflow.i16(i16 %a, i16 %b)
18*88cc35b2SSizov Nikitadeclare i16 @llvm.smul.fix.i16(i16 %a, i16 %b, i32 %scale)
19*88cc35b2SSizov Nikitadeclare i16 @llvm.umul.fix.i16(i16 %a, i16 %b, i32 %scale)
20*88cc35b2SSizov Nikitadeclare i16 @llvm.smul.fix.sat.i16(i16 %a, i16 %b, i32 %scale)
21*88cc35b2SSizov Nikitadeclare i16 @llvm.umul.fix.sat.i16(i16 %a, i16 %b, i32 %scale)
22*88cc35b2SSizov Nikitadeclare float @llvm.fma.f32(float %a, float %b, float %c)
23*88cc35b2SSizov Nikitadeclare float @llvm.fmuladd.f32(float %a, float %b, float %c)
24*88cc35b2SSizov Nikita
25*88cc35b2SSizov Nikitadefine i8 @fold_select_mul(i1 %c, i8 %a, i8 %b) {
26*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_mul(
27*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
28*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[B]], [[A]]
29*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i8 [[RET]]
30*88cc35b2SSizov Nikita;
31*88cc35b2SSizov Nikita  %s0 = select i1 %c, i8 %a, i8 %b
32*88cc35b2SSizov Nikita  %s1 = select i1 %c, i8 %b, i8 %a
33*88cc35b2SSizov Nikita  %ret = mul i8 %s1, %s0
34*88cc35b2SSizov Nikita  ret i8 %ret
35*88cc35b2SSizov Nikita}
36*88cc35b2SSizov Nikita
37*88cc35b2SSizov Nikitadefine i8 @fold_select_mul_nsw_nuw_preserve(i1 %c, i8 %a, i8 %b) {
38*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_mul_nsw_nuw_preserve(
39*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
40*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = mul nuw nsw i8 [[B]], [[A]]
41*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i8 [[RET]]
42*88cc35b2SSizov Nikita;
43*88cc35b2SSizov Nikita  %s0 = select i1 %c, i8 %a, i8 %b
44*88cc35b2SSizov Nikita  %s1 = select i1 %c, i8 %b, i8 %a
45*88cc35b2SSizov Nikita  %ret = mul nsw nuw i8 %s1, %s0
46*88cc35b2SSizov Nikita  ret i8 %ret
47*88cc35b2SSizov Nikita}
48*88cc35b2SSizov Nikita
49*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_mul_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) {
50*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_mul_vec2(
51*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) {
52*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = mul <2 x i4> [[B]], [[A]]
53*88cc35b2SSizov Nikita; CHECK-NEXT:    ret <2 x i4> [[RET]]
54*88cc35b2SSizov Nikita;
55*88cc35b2SSizov Nikita  %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b
56*88cc35b2SSizov Nikita  %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a
57*88cc35b2SSizov Nikita  %ret = mul <2 x i4> %s1, %s0
58*88cc35b2SSizov Nikita  ret <2 x i4> %ret
59*88cc35b2SSizov Nikita}
60*88cc35b2SSizov Nikita
61*88cc35b2SSizov Nikitadefine i8 @fold_select_add(i1 %c, i8 %a, i8 %b) {
62*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_add(
63*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
64*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = add i8 [[B]], [[A]]
65*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i8 [[RET]]
66*88cc35b2SSizov Nikita;
67*88cc35b2SSizov Nikita  %s0 = select i1 %c, i8 %a, i8 %b
68*88cc35b2SSizov Nikita  %s1 = select i1 %c, i8 %b, i8 %a
69*88cc35b2SSizov Nikita  %ret = add i8 %s1, %s0
70*88cc35b2SSizov Nikita  ret i8 %ret
71*88cc35b2SSizov Nikita}
72*88cc35b2SSizov Nikita
73*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_add_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) {
74*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_add_vec2(
75*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) {
76*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = add <2 x i4> [[B]], [[A]]
77*88cc35b2SSizov Nikita; CHECK-NEXT:    ret <2 x i4> [[RET]]
78*88cc35b2SSizov Nikita;
79*88cc35b2SSizov Nikita  %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b
80*88cc35b2SSizov Nikita  %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a
81*88cc35b2SSizov Nikita  %ret = add <2 x i4> %s1, %s0
82*88cc35b2SSizov Nikita  ret <2 x i4> %ret
83*88cc35b2SSizov Nikita}
84*88cc35b2SSizov Nikita
85*88cc35b2SSizov Nikitadefine i8 @fold_select_and(i1 %c, i8 %a, i8 %b) {
86*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_and(
87*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
88*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = and i8 [[B]], [[A]]
89*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i8 [[RET]]
90*88cc35b2SSizov Nikita;
91*88cc35b2SSizov Nikita  %s0 = select i1 %c, i8 %a, i8 %b
92*88cc35b2SSizov Nikita  %s1 = select i1 %c, i8 %b, i8 %a
93*88cc35b2SSizov Nikita  %ret = and i8 %s1, %s0
94*88cc35b2SSizov Nikita  ret i8 %ret
95*88cc35b2SSizov Nikita}
96*88cc35b2SSizov Nikita
97*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_and_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) {
98*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_and_vec2(
99*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) {
100*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = and <2 x i4> [[B]], [[A]]
101*88cc35b2SSizov Nikita; CHECK-NEXT:    ret <2 x i4> [[RET]]
102*88cc35b2SSizov Nikita;
103*88cc35b2SSizov Nikita  %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b
104*88cc35b2SSizov Nikita  %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a
105*88cc35b2SSizov Nikita  %ret = and <2 x i4> %s1, %s0
106*88cc35b2SSizov Nikita  ret <2 x i4> %ret
107*88cc35b2SSizov Nikita}
108*88cc35b2SSizov Nikita
109*88cc35b2SSizov Nikitadefine i8 @fold_select_or(i1 %c, i8 %a, i8 %b) {
110*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_or(
111*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
112*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = or i8 [[B]], [[A]]
113*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i8 [[RET]]
114*88cc35b2SSizov Nikita;
115*88cc35b2SSizov Nikita  %s0 = select i1 %c, i8 %a, i8 %b
116*88cc35b2SSizov Nikita  %s1 = select i1 %c, i8 %b, i8 %a
117*88cc35b2SSizov Nikita  %ret = or i8 %s1, %s0
118*88cc35b2SSizov Nikita  ret i8 %ret
119*88cc35b2SSizov Nikita}
120*88cc35b2SSizov Nikita
121*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_or_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) {
122*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_or_vec2(
123*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) {
124*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = or <2 x i4> [[B]], [[A]]
125*88cc35b2SSizov Nikita; CHECK-NEXT:    ret <2 x i4> [[RET]]
126*88cc35b2SSizov Nikita;
127*88cc35b2SSizov Nikita  %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b
128*88cc35b2SSizov Nikita  %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a
129*88cc35b2SSizov Nikita  %ret = or <2 x i4> %s1, %s0
130*88cc35b2SSizov Nikita  ret <2 x i4> %ret
131*88cc35b2SSizov Nikita}
132*88cc35b2SSizov Nikita
133*88cc35b2SSizov Nikitadefine i8 @fold_select_xor(i1 %c, i8 %a, i8 %b) {
134*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_xor(
135*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
136*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = xor i8 [[B]], [[A]]
137*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i8 [[RET]]
138*88cc35b2SSizov Nikita;
139*88cc35b2SSizov Nikita  %s0 = select i1 %c, i8 %a, i8 %b
140*88cc35b2SSizov Nikita  %s1 = select i1 %c, i8 %b, i8 %a
141*88cc35b2SSizov Nikita  %ret = xor i8 %s1, %s0
142*88cc35b2SSizov Nikita  ret i8 %ret
143*88cc35b2SSizov Nikita}
144*88cc35b2SSizov Nikita
145*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_xor_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) {
146*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_xor_vec2(
147*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) {
148*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = xor <2 x i4> [[B]], [[A]]
149*88cc35b2SSizov Nikita; CHECK-NEXT:    ret <2 x i4> [[RET]]
150*88cc35b2SSizov Nikita;
151*88cc35b2SSizov Nikita  %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b
152*88cc35b2SSizov Nikita  %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a
153*88cc35b2SSizov Nikita  %ret = xor <2 x i4> %s1, %s0
154*88cc35b2SSizov Nikita  ret <2 x i4> %ret
155*88cc35b2SSizov Nikita}
156*88cc35b2SSizov Nikita
157*88cc35b2SSizov Nikitadefine float @fold_select_fadd(i1 %c, float %a, float %b) {
158*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fadd(
159*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
160*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = fadd float [[B]], [[A]]
161*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
162*88cc35b2SSizov Nikita;
163*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
164*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
165*88cc35b2SSizov Nikita  %ret = fadd float %s1, %s0
166*88cc35b2SSizov Nikita  ret float %ret
167*88cc35b2SSizov Nikita}
168*88cc35b2SSizov Nikita
169*88cc35b2SSizov Nikitadefine float @fold_select_fadd_nnan(i1 %c, float %a, float %b) {
170*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fadd_nnan(
171*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
172*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = fadd nnan float [[B]], [[A]]
173*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
174*88cc35b2SSizov Nikita;
175*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
176*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
177*88cc35b2SSizov Nikita  %ret = fadd nnan float %s1, %s0
178*88cc35b2SSizov Nikita  ret float %ret
179*88cc35b2SSizov Nikita}
180*88cc35b2SSizov Nikita
181*88cc35b2SSizov Nikitadefine <2 x float> @fold_select_fadd_vec2(i1 %c, <2 x float> %a, <2 x float> %b) {
182*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x float> @fold_select_fadd_vec2(
183*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x float> [[A:%.*]], <2 x float> [[B:%.*]]) {
184*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = fadd <2 x float> [[B]], [[A]]
185*88cc35b2SSizov Nikita; CHECK-NEXT:    ret <2 x float> [[RET]]
186*88cc35b2SSizov Nikita;
187*88cc35b2SSizov Nikita  %s0 = select i1 %c, <2 x float> %a, <2 x float> %b
188*88cc35b2SSizov Nikita  %s1 = select i1 %c, <2 x float> %b, <2 x float> %a
189*88cc35b2SSizov Nikita  %ret = fadd <2 x float> %s1, %s0
190*88cc35b2SSizov Nikita  ret <2 x float> %ret
191*88cc35b2SSizov Nikita}
192*88cc35b2SSizov Nikita
193*88cc35b2SSizov Nikitadefine float @fold_select_fmul(i1 %c, float %a, float %b) {
194*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fmul(
195*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
196*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = fmul float [[B]], [[A]]
197*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
198*88cc35b2SSizov Nikita;
199*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
200*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
201*88cc35b2SSizov Nikita  %ret = fmul float %s1, %s0
202*88cc35b2SSizov Nikita  ret float %ret
203*88cc35b2SSizov Nikita}
204*88cc35b2SSizov Nikita
205*88cc35b2SSizov Nikitadefine <2 x float> @fold_select_fmul_vec2(i1 %c, <2 x float> %a, <2 x float> %b) {
206*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x float> @fold_select_fmul_vec2(
207*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x float> [[A:%.*]], <2 x float> [[B:%.*]]) {
208*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = fmul <2 x float> [[B]], [[A]]
209*88cc35b2SSizov Nikita; CHECK-NEXT:    ret <2 x float> [[RET]]
210*88cc35b2SSizov Nikita;
211*88cc35b2SSizov Nikita  %s0 = select i1 %c, <2 x float> %a, <2 x float> %b
212*88cc35b2SSizov Nikita  %s1 = select i1 %c, <2 x float> %b, <2 x float> %a
213*88cc35b2SSizov Nikita  %ret = fmul <2 x float> %s1, %s0
214*88cc35b2SSizov Nikita  ret <2 x float> %ret
215*88cc35b2SSizov Nikita}
216*88cc35b2SSizov Nikita
217*88cc35b2SSizov Nikita;
218*88cc35b2SSizov Nikita
219*88cc35b2SSizov Nikitadefine float @fold_select_maxnum(i1 %c, float %a, float %b) {
220*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_maxnum(
221*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
222*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.maxnum.f32(float [[B]], float [[A]])
223*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
224*88cc35b2SSizov Nikita;
225*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
226*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
227*88cc35b2SSizov Nikita  %ret = call float @llvm.maxnum.f32(float %s1, float %s0)
228*88cc35b2SSizov Nikita  ret float %ret
229*88cc35b2SSizov Nikita}
230*88cc35b2SSizov Nikita
231*88cc35b2SSizov Nikitadefine float @fold_select_minnum(i1 %c, float %a, float %b) {
232*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_minnum(
233*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
234*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.minnum.f32(float [[B]], float [[A]])
235*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
236*88cc35b2SSizov Nikita;
237*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
238*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
239*88cc35b2SSizov Nikita  %ret = call float @llvm.minnum.f32(float %s1, float %s0)
240*88cc35b2SSizov Nikita  ret float %ret
241*88cc35b2SSizov Nikita}
242*88cc35b2SSizov Nikita
243*88cc35b2SSizov Nikitadefine float @fold_select_maximum(i1 %c, float %a, float %b) {
244*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_maximum(
245*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
246*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.maximum.f32(float [[B]], float [[A]])
247*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
248*88cc35b2SSizov Nikita;
249*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
250*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
251*88cc35b2SSizov Nikita  %ret = call float @llvm.maximum.f32(float %s1, float %s0)
252*88cc35b2SSizov Nikita  ret float %ret
253*88cc35b2SSizov Nikita}
254*88cc35b2SSizov Nikita
255*88cc35b2SSizov Nikitadefine float @fold_select_minimum(i1 %c, float %a, float %b) {
256*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_minimum(
257*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {
258*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.minimum.f32(float [[B]], float [[A]])
259*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
260*88cc35b2SSizov Nikita;
261*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
262*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
263*88cc35b2SSizov Nikita  %ret = call float @llvm.minimum.f32(float %s1, float %s0)
264*88cc35b2SSizov Nikita  ret float %ret
265*88cc35b2SSizov Nikita}
266*88cc35b2SSizov Nikita
267*88cc35b2SSizov Nikitadefine i32 @fold_select_smax(i1 %c, i32 %a, i32 %b) {
268*88cc35b2SSizov Nikita; CHECK-LABEL: define i32 @fold_select_smax(
269*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
270*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[A]])
271*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i32 [[RET]]
272*88cc35b2SSizov Nikita;
273*88cc35b2SSizov Nikita  %s0 = select i1 %c, i32 %a, i32 %b
274*88cc35b2SSizov Nikita  %s1 = select i1 %c, i32 %b, i32 %a
275*88cc35b2SSizov Nikita  %ret = call i32 @llvm.smax.i32(i32 %s1, i32 %s0)
276*88cc35b2SSizov Nikita  ret i32 %ret
277*88cc35b2SSizov Nikita}
278*88cc35b2SSizov Nikita
279*88cc35b2SSizov Nikitadefine i32 @fold_select_smin(i1 %c, i32 %a, i32 %b) {
280*88cc35b2SSizov Nikita; CHECK-LABEL: define i32 @fold_select_smin(
281*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
282*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.smin.i32(i32 [[B]], i32 [[A]])
283*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i32 [[RET]]
284*88cc35b2SSizov Nikita;
285*88cc35b2SSizov Nikita  %s0 = select i1 %c, i32 %a, i32 %b
286*88cc35b2SSizov Nikita  %s1 = select i1 %c, i32 %b, i32 %a
287*88cc35b2SSizov Nikita  %ret = call i32 @llvm.smin.i32(i32 %s1, i32 %s0)
288*88cc35b2SSizov Nikita  ret i32 %ret
289*88cc35b2SSizov Nikita}
290*88cc35b2SSizov Nikita
291*88cc35b2SSizov Nikitadefine i32 @fold_select_umax(i1 %c, i32 %a, i32 %b) {
292*88cc35b2SSizov Nikita; CHECK-LABEL: define i32 @fold_select_umax(
293*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
294*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.umax.i32(i32 [[B]], i32 [[A]])
295*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i32 [[RET]]
296*88cc35b2SSizov Nikita;
297*88cc35b2SSizov Nikita  %s0 = select i1 %c, i32 %a, i32 %b
298*88cc35b2SSizov Nikita  %s1 = select i1 %c, i32 %b, i32 %a
299*88cc35b2SSizov Nikita  %ret = call i32 @llvm.umax.i32(i32 %s1, i32 %s0)
300*88cc35b2SSizov Nikita  ret i32 %ret
301*88cc35b2SSizov Nikita}
302*88cc35b2SSizov Nikita
303*88cc35b2SSizov Nikitadefine i32 @fold_select_umin(i1 %c, i32 %a, i32 %b) {
304*88cc35b2SSizov Nikita; CHECK-LABEL: define i32 @fold_select_umin(
305*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
306*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.umin.i32(i32 [[B]], i32 [[A]])
307*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i32 [[RET]]
308*88cc35b2SSizov Nikita;
309*88cc35b2SSizov Nikita  %s0 = select i1 %c, i32 %a, i32 %b
310*88cc35b2SSizov Nikita  %s1 = select i1 %c, i32 %b, i32 %a
311*88cc35b2SSizov Nikita  %ret = call i32 @llvm.umin.i32(i32 %s1, i32 %s0)
312*88cc35b2SSizov Nikita  ret i32 %ret
313*88cc35b2SSizov Nikita}
314*88cc35b2SSizov Nikita
315*88cc35b2SSizov Nikitadefine i16 @fold_select_sadd_sat(i1 %c, i16 %a, i16 %b) {
316*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_sadd_sat(
317*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) {
318*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[B]], i16 [[A]])
319*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[RET]]
320*88cc35b2SSizov Nikita;
321*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
322*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
323*88cc35b2SSizov Nikita  %ret = call i16 @llvm.sadd.sat.i16(i16 %s1, i16 %s0)
324*88cc35b2SSizov Nikita  ret i16 %ret
325*88cc35b2SSizov Nikita}
326*88cc35b2SSizov Nikita
327*88cc35b2SSizov Nikitadefine i16 @fold_select_uadd_sat(i1 %c, i16 %a, i16 %b) {
328*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_uadd_sat(
329*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) {
330*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.uadd.sat.i16(i16 [[B]], i16 [[A]])
331*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[RET]]
332*88cc35b2SSizov Nikita;
333*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
334*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
335*88cc35b2SSizov Nikita  %ret = call i16 @llvm.uadd.sat.i16(i16 %s1, i16 %s0)
336*88cc35b2SSizov Nikita  ret i16 %ret
337*88cc35b2SSizov Nikita}
338*88cc35b2SSizov Nikita
339*88cc35b2SSizov Nikitadefine i16 @fold_select_sadd_with_overflow(i1 %c, i16 %a, i16 %b) {
340*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_sadd_with_overflow(
341*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) {
342*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RES:%.*]] = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 [[B]], i16 [[A]])
343*88cc35b2SSizov Nikita; CHECK-NEXT:    [[OBIT:%.*]] = extractvalue { i16, i1 } [[RES]], 1
344*88cc35b2SSizov Nikita; CHECK-NEXT:    br i1 [[OBIT]], label [[OVERFLOW:%.*]], label [[NORMAL:%.*]]
345*88cc35b2SSizov Nikita; CHECK:       overflow:
346*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 0
347*88cc35b2SSizov Nikita; CHECK:       normal:
348*88cc35b2SSizov Nikita; CHECK-NEXT:    [[SUM:%.*]] = extractvalue { i16, i1 } [[RES]], 0
349*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[SUM]]
350*88cc35b2SSizov Nikita;
351*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
352*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
353*88cc35b2SSizov Nikita  %res = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %s1, i16 %s0)
354*88cc35b2SSizov Nikita  %obit = extractvalue {i16, i1} %res, 1
355*88cc35b2SSizov Nikita  br i1 %obit, label %overflow, label %normal
356*88cc35b2SSizov Nikitaoverflow:
357*88cc35b2SSizov Nikita  ret i16 0
358*88cc35b2SSizov Nikitanormal:
359*88cc35b2SSizov Nikita  %sum = extractvalue {i16, i1} %res, 0
360*88cc35b2SSizov Nikita  ret i16 %sum
361*88cc35b2SSizov Nikita}
362*88cc35b2SSizov Nikita
363*88cc35b2SSizov Nikitadefine i16 @fold_select_uadd_with_overflow(i1 %c, i16 %a, i16 %b) {
364*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_uadd_with_overflow(
365*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) {
366*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RES:%.*]] = call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 [[B]], i16 [[A]])
367*88cc35b2SSizov Nikita; CHECK-NEXT:    [[OBIT:%.*]] = extractvalue { i16, i1 } [[RES]], 1
368*88cc35b2SSizov Nikita; CHECK-NEXT:    br i1 [[OBIT]], label [[OVERFLOW:%.*]], label [[NORMAL:%.*]]
369*88cc35b2SSizov Nikita; CHECK:       overflow:
370*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 0
371*88cc35b2SSizov Nikita; CHECK:       normal:
372*88cc35b2SSizov Nikita; CHECK-NEXT:    [[SUM:%.*]] = extractvalue { i16, i1 } [[RES]], 0
373*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[SUM]]
374*88cc35b2SSizov Nikita;
375*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
376*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
377*88cc35b2SSizov Nikita  %res = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %s1, i16 %s0)
378*88cc35b2SSizov Nikita  %obit = extractvalue {i16, i1} %res, 1
379*88cc35b2SSizov Nikita  br i1 %obit, label %overflow, label %normal
380*88cc35b2SSizov Nikitaoverflow:
381*88cc35b2SSizov Nikita  ret i16 0
382*88cc35b2SSizov Nikitanormal:
383*88cc35b2SSizov Nikita  %sum = extractvalue {i16, i1} %res, 0
384*88cc35b2SSizov Nikita  ret i16 %sum
385*88cc35b2SSizov Nikita}
386*88cc35b2SSizov Nikita
387*88cc35b2SSizov Nikitadefine i16 @fold_select_smul_with_overflow(i1 %c, i16 %a, i16 %b) {
388*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_smul_with_overflow(
389*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) {
390*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RES:%.*]] = call { i16, i1 } @llvm.smul.with.overflow.i16(i16 [[B]], i16 [[A]])
391*88cc35b2SSizov Nikita; CHECK-NEXT:    [[OBIT:%.*]] = extractvalue { i16, i1 } [[RES]], 1
392*88cc35b2SSizov Nikita; CHECK-NEXT:    br i1 [[OBIT]], label [[OVERFLOW:%.*]], label [[NORMAL:%.*]]
393*88cc35b2SSizov Nikita; CHECK:       overflow:
394*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 0
395*88cc35b2SSizov Nikita; CHECK:       normal:
396*88cc35b2SSizov Nikita; CHECK-NEXT:    [[MUL:%.*]] = extractvalue { i16, i1 } [[RES]], 0
397*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[MUL]]
398*88cc35b2SSizov Nikita;
399*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
400*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
401*88cc35b2SSizov Nikita  %res = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %s1, i16 %s0)
402*88cc35b2SSizov Nikita  %obit = extractvalue {i16, i1} %res, 1
403*88cc35b2SSizov Nikita  br i1 %obit, label %overflow, label %normal
404*88cc35b2SSizov Nikitaoverflow:
405*88cc35b2SSizov Nikita  ret i16 0
406*88cc35b2SSizov Nikitanormal:
407*88cc35b2SSizov Nikita  %mul = extractvalue {i16, i1} %res, 0
408*88cc35b2SSizov Nikita  ret i16 %mul
409*88cc35b2SSizov Nikita}
410*88cc35b2SSizov Nikita
411*88cc35b2SSizov Nikitadefine i16 @fold_select_umul_with_overflow(i1 %c, i16 %a, i16 %b) {
412*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_umul_with_overflow(
413*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) {
414*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RES:%.*]] = call { i16, i1 } @llvm.umul.with.overflow.i16(i16 [[B]], i16 [[A]])
415*88cc35b2SSizov Nikita; CHECK-NEXT:    [[OBIT:%.*]] = extractvalue { i16, i1 } [[RES]], 1
416*88cc35b2SSizov Nikita; CHECK-NEXT:    br i1 [[OBIT]], label [[OVERFLOW:%.*]], label [[NORMAL:%.*]]
417*88cc35b2SSizov Nikita; CHECK:       overflow:
418*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 0
419*88cc35b2SSizov Nikita; CHECK:       normal:
420*88cc35b2SSizov Nikita; CHECK-NEXT:    [[MUL:%.*]] = extractvalue { i16, i1 } [[RES]], 0
421*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[MUL]]
422*88cc35b2SSizov Nikita;
423*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
424*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
425*88cc35b2SSizov Nikita  %res = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %s1, i16 %s0)
426*88cc35b2SSizov Nikita  %obit = extractvalue {i16, i1} %res, 1
427*88cc35b2SSizov Nikita  br i1 %obit, label %overflow, label %normal
428*88cc35b2SSizov Nikitaoverflow:
429*88cc35b2SSizov Nikita  ret i16 0
430*88cc35b2SSizov Nikitanormal:
431*88cc35b2SSizov Nikita  %mul = extractvalue {i16, i1} %res, 0
432*88cc35b2SSizov Nikita  ret i16 %mul
433*88cc35b2SSizov Nikita}
434*88cc35b2SSizov Nikita
435*88cc35b2SSizov Nikitadefine i16 @fold_select_smul_fix(i1 %c, i16 %a, i16 %b, i32 %y) {
436*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_smul_fix(
437*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]], i32 [[Y:%.*]]) {
438*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.smul.fix.i16(i16 [[B]], i16 [[A]], i32 1)
439*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[RET]]
440*88cc35b2SSizov Nikita;
441*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
442*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
443*88cc35b2SSizov Nikita  %ret = call i16 @llvm.smul.fix.i16(i16 %s1, i16 %s0, i32 1)
444*88cc35b2SSizov Nikita  ret i16 %ret
445*88cc35b2SSizov Nikita}
446*88cc35b2SSizov Nikita
447*88cc35b2SSizov Nikitadefine i16 @fold_select_umul_fix(i1 %c, i16 %a, i16 %b, i32 %y) {
448*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_umul_fix(
449*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]], i32 [[Y:%.*]]) {
450*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.umul.fix.i16(i16 [[B]], i16 [[A]], i32 1)
451*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[RET]]
452*88cc35b2SSizov Nikita;
453*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
454*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
455*88cc35b2SSizov Nikita  %ret = call i16 @llvm.umul.fix.i16(i16 %s1, i16 %s0, i32 1)
456*88cc35b2SSizov Nikita  ret i16 %ret
457*88cc35b2SSizov Nikita}
458*88cc35b2SSizov Nikita
459*88cc35b2SSizov Nikitadefine i16 @fold_select_smul_fix_sat(i1 %c, i16 %a, i16 %b, i32 %y) {
460*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_smul_fix_sat(
461*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]], i32 [[Y:%.*]]) {
462*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.smul.fix.sat.i16(i16 [[B]], i16 [[A]], i32 1)
463*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[RET]]
464*88cc35b2SSizov Nikita;
465*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
466*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
467*88cc35b2SSizov Nikita  %ret = call i16 @llvm.smul.fix.sat.i16(i16 %s1, i16 %s0, i32 1)
468*88cc35b2SSizov Nikita  ret i16 %ret
469*88cc35b2SSizov Nikita}
470*88cc35b2SSizov Nikita
471*88cc35b2SSizov Nikitadefine i16 @fold_select_umul_fix_sat(i1 %c, i16 %a, i16 %b, i32 %y) {
472*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_umul_fix_sat(
473*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]], i32 [[Y:%.*]]) {
474*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.umul.fix.sat.i16(i16 [[B]], i16 [[A]], i32 1)
475*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i16 [[RET]]
476*88cc35b2SSizov Nikita;
477*88cc35b2SSizov Nikita  %s0 = select i1 %c, i16 %a, i16 %b
478*88cc35b2SSizov Nikita  %s1 = select i1 %c, i16 %b, i16 %a
479*88cc35b2SSizov Nikita  %ret = call i16 @llvm.umul.fix.sat.i16(i16 %s1, i16 %s0, i32 1)
480*88cc35b2SSizov Nikita  ret i16 %ret
481*88cc35b2SSizov Nikita}
482*88cc35b2SSizov Nikita
483*88cc35b2SSizov Nikitadefine float @fold_select_fma(i1 %c, float %a, float %b, float %y) {
484*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fma(
485*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]], float [[Y:%.*]]) {
486*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.fma.f32(float [[B]], float [[A]], float [[Y]])
487*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
488*88cc35b2SSizov Nikita;
489*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
490*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
491*88cc35b2SSizov Nikita  %ret = call float @llvm.fma.f32(float %s1, float %s0, float %y)
492*88cc35b2SSizov Nikita  ret float %ret
493*88cc35b2SSizov Nikita}
494*88cc35b2SSizov Nikita
495*88cc35b2SSizov Nikitadefine float @fold_select_fmuladd(i1 %c, float %a, float %b, float %y) {
496*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fmuladd(
497*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]], float [[Y:%.*]]) {
498*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.fmuladd.f32(float [[B]], float [[A]], float [[Y]])
499*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
500*88cc35b2SSizov Nikita;
501*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
502*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
503*88cc35b2SSizov Nikita  %ret = call float @llvm.fmuladd.f32(float %s1, float %s0, float %y)
504*88cc35b2SSizov Nikita  ret float %ret
505*88cc35b2SSizov Nikita}
506*88cc35b2SSizov Nikita
507*88cc35b2SSizov Nikita;negative tests:
508*88cc35b2SSizov Nikita
509*88cc35b2SSizov Nikitadefine i8 @fold_select_unmatch_mul_neg(i1 %c, i1 %c1, i8 %a, i8 %b) {
510*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_unmatch_mul_neg(
511*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i1 [[C1:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
512*88cc35b2SSizov Nikita; CHECK-NEXT:    [[S0:%.*]] = select i1 [[C]], i8 [[A]], i8 [[B]]
513*88cc35b2SSizov Nikita; CHECK-NEXT:    [[S1:%.*]] = select i1 [[C1]], i8 [[B]], i8 [[A]]
514*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[S1]], [[S0]]
515*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i8 [[RET]]
516*88cc35b2SSizov Nikita;
517*88cc35b2SSizov Nikita  %s0 = select i1 %c, i8 %a, i8 %b
518*88cc35b2SSizov Nikita  %s1 = select i1 %c1, i8 %b, i8 %a
519*88cc35b2SSizov Nikita  %ret = mul i8 %s1, %s0
520*88cc35b2SSizov Nikita  ret i8 %ret
521*88cc35b2SSizov Nikita}
522*88cc35b2SSizov Nikita
523*88cc35b2SSizov Nikitadefine i8 @fold_select_sub_neg(i1 %c, i8 %a, i8 %b) {
524*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_sub_neg(
525*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {
526*88cc35b2SSizov Nikita; CHECK-NEXT:    [[S0:%.*]] = select i1 [[C]], i8 [[A]], i8 [[B]]
527*88cc35b2SSizov Nikita; CHECK-NEXT:    [[S1:%.*]] = select i1 [[C]], i8 [[B]], i8 [[A]]
528*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = sub i8 [[S1]], [[S0]]
529*88cc35b2SSizov Nikita; CHECK-NEXT:    ret i8 [[RET]]
530*88cc35b2SSizov Nikita;
531*88cc35b2SSizov Nikita  %s0 = select i1 %c, i8 %a, i8 %b
532*88cc35b2SSizov Nikita  %s1 = select i1 %c, i8 %b, i8 %a
533*88cc35b2SSizov Nikita  %ret = sub i8 %s1, %s0
534*88cc35b2SSizov Nikita  ret i8 %ret
535*88cc35b2SSizov Nikita}
536*88cc35b2SSizov Nikita
537*88cc35b2SSizov Nikitadefine float @fold_select_fma_neg(i1 %c, i1 %c1, float %a, float %b, float %y) {
538*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fma_neg(
539*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i1 [[C1:%.*]], float [[A:%.*]], float [[B:%.*]], float [[Y:%.*]]) {
540*88cc35b2SSizov Nikita; CHECK-NEXT:    [[S0:%.*]] = select i1 [[C]], float [[A]], float [[B]]
541*88cc35b2SSizov Nikita; CHECK-NEXT:    [[S1:%.*]] = select i1 [[C1]], float [[B]], float [[A]]
542*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.fma.f32(float [[S1]], float [[S0]], float [[Y]])
543*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
544*88cc35b2SSizov Nikita;
545*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
546*88cc35b2SSizov Nikita  %s1 = select i1 %c1, float %b, float %a
547*88cc35b2SSizov Nikita  %ret = call float @llvm.fma.f32(float %s1, float %s0, float %y)
548*88cc35b2SSizov Nikita  ret float %ret
549*88cc35b2SSizov Nikita}
550*88cc35b2SSizov Nikita
551*88cc35b2SSizov Nikitadefine float @fold_select_fma_match_neg(i1 %c, float %a, float %b, float %y) {
552*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fma_match_neg(
553*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]], float [[Y:%.*]]) {
554*88cc35b2SSizov Nikita; CHECK-NEXT:    [[S0:%.*]] = select i1 [[C]], float [[A]], float [[B]]
555*88cc35b2SSizov Nikita; CHECK-NEXT:    [[S1:%.*]] = select i1 [[C]], float [[B]], float [[A]]
556*88cc35b2SSizov Nikita; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.fma.f32(float [[Y]], float [[S0]], float [[S1]])
557*88cc35b2SSizov Nikita; CHECK-NEXT:    ret float [[RET]]
558*88cc35b2SSizov Nikita;
559*88cc35b2SSizov Nikita  %s0 = select i1 %c, float %a, float %b
560*88cc35b2SSizov Nikita  %s1 = select i1 %c, float %b, float %a
561*88cc35b2SSizov Nikita  %ret = call float @llvm.fma.f32(float %y, float %s0, float %s1)
562*88cc35b2SSizov Nikita  ret float %ret
563*88cc35b2SSizov Nikita}
564