xref: /llvm-project/llvm/test/Transforms/InstCombine/canonicalize-const-to-bop.ll (revision 979a0356d4c90ec855be4f2d2f6687132cf10298)
1*979a0356SVeera; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2*979a0356SVeera; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3*979a0356SVeera
4*979a0356SVeeradefine i8 @add_and_sgt(i8 %x) {
5*979a0356SVeera; CHECK-LABEL: define i8 @add_and_sgt(
6*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
7*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)
8*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = add nuw i8 [[TMP1]], 16
9*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
10*979a0356SVeera;
11*979a0356SVeera  %add = add nsw i8 %x, 16
12*979a0356SVeera  %cmp = icmp sgt i8 %x, 8
13*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 24
14*979a0356SVeera  ret i8 %s
15*979a0356SVeera}
16*979a0356SVeera
17*979a0356SVeeradefine i8 @add_sgt_nuw(i8 %x) {
18*979a0356SVeera; CHECK-LABEL: define i8 @add_sgt_nuw(
19*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
20*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)
21*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = add nuw i8 [[TMP1]], 16
22*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
23*979a0356SVeera;
24*979a0356SVeera  %add = add nuw i8 %x, 16
25*979a0356SVeera  %cmp = icmp sgt i8 %x, 8
26*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 24
27*979a0356SVeera  ret i8 %s
28*979a0356SVeera}
29*979a0356SVeera
30*979a0356SVeeradefine i8 @sub_and_ugt(i8 %x) {
31*979a0356SVeera; CHECK-LABEL: define i8 @sub_and_ugt(
32*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
33*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100)
34*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = add nsw i8 [[TMP1]], -50
35*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
36*979a0356SVeera;
37*979a0356SVeera  %sub = sub nsw i8 %x, 50
38*979a0356SVeera  %cmp = icmp ugt i8 %x, 100
39*979a0356SVeera  %s = select i1 %cmp, i8 50, i8 %sub
40*979a0356SVeera  ret i8 %s
41*979a0356SVeera}
42*979a0356SVeera
43*979a0356SVeeradefine i8 @sub_ugt_nuw_nsw(i8 %x) {
44*979a0356SVeera; CHECK-LABEL: define i8 @sub_ugt_nuw_nsw(
45*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
46*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100)
47*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = add nsw i8 [[TMP1]], -50
48*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
49*979a0356SVeera;
50*979a0356SVeera  %sub = sub nuw nsw i8 %x, 50
51*979a0356SVeera  %cmp = icmp ugt i8 %x, 100
52*979a0356SVeera  %s = select i1 %cmp, i8 50, i8 %sub
53*979a0356SVeera  ret i8 %s
54*979a0356SVeera}
55*979a0356SVeera
56*979a0356SVeeradefine i8 @mul_and_ult(i8 %x) {
57*979a0356SVeera; CHECK-LABEL: define i8 @mul_and_ult(
58*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
59*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 10)
60*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = mul nuw i8 [[TMP1]], 10
61*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
62*979a0356SVeera;
63*979a0356SVeera  %add = mul nsw i8 %x, 10
64*979a0356SVeera  %cmp = icmp ult i8 10, %x
65*979a0356SVeera  %s = select i1 %cmp, i8 100, i8 %add
66*979a0356SVeera  ret i8 %s
67*979a0356SVeera}
68*979a0356SVeera
69*979a0356SVeeradefine i8 @mul_and_non_strict_predicate(i8 %x) {
70*979a0356SVeera; CHECK-LABEL: define i8 @mul_and_non_strict_predicate(
71*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
72*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 10)
73*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = mul i8 [[TMP1]], 10
74*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
75*979a0356SVeera;
76*979a0356SVeera  %add = mul nsw i8 %x, 10
77*979a0356SVeera  %cmp = icmp sle i8 10, %x
78*979a0356SVeera  %s = select i1 %cmp, i8 100, i8 %add
79*979a0356SVeera  ret i8 %s
80*979a0356SVeera}
81*979a0356SVeera
82*979a0356SVeeradefine i8 @mul_ult_noflags(i8 %x) {
83*979a0356SVeera; CHECK-LABEL: define i8 @mul_ult_noflags(
84*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
85*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 10)
86*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = mul nuw i8 [[TMP1]], 10
87*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
88*979a0356SVeera;
89*979a0356SVeera  %add = mul i8 %x, 10
90*979a0356SVeera  %cmp = icmp ult i8 10, %x
91*979a0356SVeera  %s = select i1 %cmp, i8 100, i8 %add
92*979a0356SVeera  ret i8 %s
93*979a0356SVeera}
94*979a0356SVeera
95*979a0356SVeeradefine i8 @udiv_and_slt(i8 %x) {
96*979a0356SVeera; CHECK-LABEL: define i8 @udiv_and_slt(
97*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
98*979a0356SVeera; CHECK-NEXT:    [[SUB:%.*]] = udiv i8 [[X]], 10
99*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X]], 100
100*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 10, i8 [[SUB]]
101*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
102*979a0356SVeera;
103*979a0356SVeera  %sub = udiv i8 %x, 10
104*979a0356SVeera  %cmp = icmp slt i8 %x, 100
105*979a0356SVeera  %s = select i1 %cmp, i8 10, i8 %sub
106*979a0356SVeera  ret i8 %s
107*979a0356SVeera}
108*979a0356SVeera
109*979a0356SVeeradefine i8 @udiv_slt_exact(i8 %x) {
110*979a0356SVeera; CHECK-LABEL: define i8 @udiv_slt_exact(
111*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
112*979a0356SVeera; CHECK-NEXT:    [[SUB:%.*]] = udiv exact i8 [[X]], 10
113*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X]], 100
114*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 10, i8 [[SUB]]
115*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
116*979a0356SVeera;
117*979a0356SVeera  %sub = udiv exact i8 %x, 10
118*979a0356SVeera  %cmp = icmp slt i8 %x, 100
119*979a0356SVeera  %s = select i1 %cmp, i8 10, i8 %sub
120*979a0356SVeera  ret i8 %s
121*979a0356SVeera}
122*979a0356SVeera
123*979a0356SVeeradefine i8 @canonicalize_icmp_operands(i8 %x) {
124*979a0356SVeera; CHECK-LABEL: define i8 @canonicalize_icmp_operands(
125*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
126*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 119)
127*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = add nsw i8 [[TMP1]], 8
128*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
129*979a0356SVeera;
130*979a0356SVeera  %add = add nsw i8 %x, 8
131*979a0356SVeera  %cmp = icmp sle i8 120, %x
132*979a0356SVeera  %s = select i1 %cmp, i8 127, i8 %add
133*979a0356SVeera  ret i8 %s
134*979a0356SVeera}
135*979a0356SVeera
136*979a0356SVeeradefine i8 @flipped_strictness_predicate_and_constant(i8 %x, i8 %y) {
137*979a0356SVeera; CHECK-LABEL: define i8 @flipped_strictness_predicate_and_constant(
138*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
139*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 1)
140*979a0356SVeera; CHECK-NEXT:    [[R:%.*]] = add i8 [[TMP1]], -2
141*979a0356SVeera; CHECK-NEXT:    ret i8 [[R]]
142*979a0356SVeera;
143*979a0356SVeera  %a = add i8 %x, -2
144*979a0356SVeera  %c = icmp ult i8 %x, 2
145*979a0356SVeera  %r = select i1 %c, i8 -1, i8 %a
146*979a0356SVeera  ret i8 %r
147*979a0356SVeera}
148*979a0356SVeera
149*979a0356SVeeradeclare void @use(i1)
150*979a0356SVeeradeclare void @use_byte(i8)
151*979a0356SVeera
152*979a0356SVeeradefine i8 @multi_use_cond_and_sel(i8 %x) {
153*979a0356SVeera; CHECK-LABEL: define i8 @multi_use_cond_and_sel(
154*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
155*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X]], 8
156*979a0356SVeera; CHECK-NEXT:    call void @use(i1 [[CMP]])
157*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)
158*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = add nuw i8 [[TMP1]], 16
159*979a0356SVeera; CHECK-NEXT:    call void @use_byte(i8 [[S]])
160*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
161*979a0356SVeera;
162*979a0356SVeera  %add = add nsw i8 %x, 16
163*979a0356SVeera  %cmp = icmp sgt i8 %x, 8
164*979a0356SVeera  call void @use(i1 %cmp)
165*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 24
166*979a0356SVeera  call void @use_byte(i8 %s)
167*979a0356SVeera  ret i8 %s
168*979a0356SVeera}
169*979a0356SVeera
170*979a0356SVeeradefine void @rust_noop_loop() {
171*979a0356SVeera; CHECK-LABEL: define void @rust_noop_loop() {
172*979a0356SVeera; CHECK-NEXT:  [[START:.*]]:
173*979a0356SVeera; CHECK-NEXT:    br label %[[BB2_I:.*]]
174*979a0356SVeera; CHECK:       [[BB2_I]]:
175*979a0356SVeera; CHECK-NEXT:    [[ITER_SROA_0_07:%.*]] = phi i32 [ 0, %[[START]] ], [ [[SPEC_SELECT5:%.*]], %[[BB2_I]] ]
176*979a0356SVeera; CHECK-NEXT:    [[_0_I3_I:%.*]] = icmp sgt i32 [[ITER_SROA_0_07]], 99
177*979a0356SVeera; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.smin.i32(i32 [[ITER_SROA_0_07]], i32 99)
178*979a0356SVeera; CHECK-NEXT:    [[SPEC_SELECT5]] = add nsw i32 [[TMP0]], 1
179*979a0356SVeera; CHECK-NEXT:    br i1 [[_0_I3_I]], label %[[BASICBLOCK4:.*]], label %[[BB2_I]]
180*979a0356SVeera; CHECK:       [[BASICBLOCK4]]:
181*979a0356SVeera; CHECK-NEXT:    ret void
182*979a0356SVeera;
183*979a0356SVeerastart:
184*979a0356SVeera  br label %bb2.i
185*979a0356SVeera
186*979a0356SVeerabb2.i:
187*979a0356SVeera  %iter.sroa.0.07 = phi i32 [ 0, %start ], [ %spec.select5, %bb2.i ]
188*979a0356SVeera  %_0.i3.i = icmp sgt i32 %iter.sroa.0.07, 99
189*979a0356SVeera  %0 = add nsw i32 %iter.sroa.0.07, 1
190*979a0356SVeera  %spec.select5 = select i1 %_0.i3.i, i32 100, i32 %0
191*979a0356SVeera  %_0.i.not.i = icmp sgt i32 %spec.select5, 100
192*979a0356SVeera  %or.cond = select i1 %_0.i3.i, i1 true, i1 %_0.i.not.i
193*979a0356SVeera  br i1 %or.cond, label %basicblock4, label %bb2.i
194*979a0356SVeera
195*979a0356SVeerabasicblock4:
196*979a0356SVeera  ret void
197*979a0356SVeera}
198*979a0356SVeera
199*979a0356SVeeradefine <2 x i8> @add_non_splat_vector(<2 x i8> %x) {
200*979a0356SVeera; CHECK-LABEL: define <2 x i8> @add_non_splat_vector(
201*979a0356SVeera; CHECK-SAME: <2 x i8> [[X:%.*]]) {
202*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> <i8 0, i8 1>)
203*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = add nuw <2 x i8> [[TMP1]], <i8 1, i8 0>
204*979a0356SVeera; CHECK-NEXT:    ret <2 x i8> [[S]]
205*979a0356SVeera;
206*979a0356SVeera  %add = add <2 x i8> %x, <i8 1, i8 0>
207*979a0356SVeera  %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 1>
208*979a0356SVeera  %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1>
209*979a0356SVeera  ret <2 x i8> %s
210*979a0356SVeera}
211*979a0356SVeera
212*979a0356SVeeradefine <2 x i8> @or_splat_vector(<2 x i8> %x) {
213*979a0356SVeera; CHECK-LABEL: define <2 x i8> @or_splat_vector(
214*979a0356SVeera; CHECK-SAME: <2 x i8> [[X:%.*]]) {
215*979a0356SVeera; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> splat (i8 1))
216*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = or <2 x i8> [[TMP1]], splat (i8 1)
217*979a0356SVeera; CHECK-NEXT:    ret <2 x i8> [[S]]
218*979a0356SVeera;
219*979a0356SVeera  %add = or <2 x i8> %x, <i8 1, i8 1>
220*979a0356SVeera  %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 0>
221*979a0356SVeera  %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1>
222*979a0356SVeera  ret <2 x i8> %s
223*979a0356SVeera}
224*979a0356SVeera
225*979a0356SVeeradefine i8 @const_operands_dont_fold_negative(i8 %x) {
226*979a0356SVeera; CHECK-LABEL: define i8 @const_operands_dont_fold_negative(
227*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
228*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[X]], 16
229*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X]], 18
230*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 25
231*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
232*979a0356SVeera;
233*979a0356SVeera  %add = add nsw i8 %x, 16
234*979a0356SVeera  %cmp = icmp sgt i8 %x, 18
235*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 25
236*979a0356SVeera  ret i8 %s
237*979a0356SVeera}
238*979a0356SVeera
239*979a0356SVeeradefine i8 @add_with_poison_negative(i8 %x) {
240*979a0356SVeera; CHECK-LABEL: define i8 @add_with_poison_negative(
241*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
242*979a0356SVeera; CHECK-NEXT:    ret i8 25
243*979a0356SVeera;
244*979a0356SVeera  %add = add nsw i8 %x, poison
245*979a0356SVeera  %cmp = icmp sgt i8 %x, 8
246*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 25
247*979a0356SVeera  ret i8 %s
248*979a0356SVeera}
249*979a0356SVeera
250*979a0356SVeeradefine i8 @add_with_overflow_negative(i8 %x) {
251*979a0356SVeera; CHECK-LABEL: define i8 @add_with_overflow_negative(
252*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
253*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[X]], 100
254*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X]], 119
255*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 -127, i8 [[ADD]]
256*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
257*979a0356SVeera;
258*979a0356SVeera  %add = add i8 %x, 100
259*979a0356SVeera  %cmp = icmp sle i8 120, %x
260*979a0356SVeera  %s = select i1 %cmp, i8 -127, i8 %add
261*979a0356SVeera  ret i8 %s
262*979a0356SVeera}
263*979a0356SVeera
264*979a0356SVeeradefine <2 x i8> @vector_with_poison_negative(<2 x i8> %x) {
265*979a0356SVeera; CHECK-LABEL: define <2 x i8> @vector_with_poison_negative(
266*979a0356SVeera; CHECK-SAME: <2 x i8> [[X:%.*]]) {
267*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = xor <2 x i8> [[X]], <i8 1, i8 poison>
268*979a0356SVeera; CHECK-NEXT:    [[CMP_INV:%.*]] = icmp slt <2 x i8> [[X]], splat (i8 1)
269*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select <2 x i1> [[CMP_INV]], <2 x i8> splat (i8 1), <2 x i8> [[ADD]]
270*979a0356SVeera; CHECK-NEXT:    ret <2 x i8> [[S]]
271*979a0356SVeera;
272*979a0356SVeera  %add = xor <2 x i8> %x, <i8 1, i8 poison>
273*979a0356SVeera  %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 0>
274*979a0356SVeera  %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1>
275*979a0356SVeera  ret <2 x i8> %s
276*979a0356SVeera}
277*979a0356SVeera
278*979a0356SVeeradefine i8 @multi_use_bop_negative(i8 %x) {
279*979a0356SVeera; CHECK-LABEL: define i8 @multi_use_bop_negative(
280*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
281*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[X]], 16
282*979a0356SVeera; CHECK-NEXT:    call void @use_byte(i8 [[ADD]])
283*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X]], 7
284*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 24, i8 [[ADD]]
285*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
286*979a0356SVeera;
287*979a0356SVeera  %add = add nsw i8 %x, 16
288*979a0356SVeera  call void @use_byte(i8 %add)
289*979a0356SVeera  %cmp = icmp sle i8 8, %x
290*979a0356SVeera  %s = select i1 %cmp, i8 24, i8 %add
291*979a0356SVeera  ret i8 %s
292*979a0356SVeera}
293*979a0356SVeera
294*979a0356SVeeradefine half @float_negative(half %x) {
295*979a0356SVeera; CHECK-LABEL: define half @float_negative(
296*979a0356SVeera; CHECK-SAME: half [[X:%.*]]) {
297*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = fmul fast half [[X]], 0xH2E66
298*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = fcmp ugt half [[X]], 0xH5640
299*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], half 0xH4900, half [[ADD]]
300*979a0356SVeera; CHECK-NEXT:    ret half [[S]]
301*979a0356SVeera;
302*979a0356SVeera  %add = fdiv fast half %x, 10.0
303*979a0356SVeera  %cmp = fcmp ult half 100.0, %x
304*979a0356SVeera  %s = select i1 %cmp, half 10.0, half %add
305*979a0356SVeera  ret half %s
306*979a0356SVeera}
307*979a0356SVeera
308*979a0356SVeeradefine i8 @poison_false_val_negative(i8 %x) {
309*979a0356SVeera; CHECK-LABEL: define i8 @poison_false_val_negative(
310*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
311*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[X]], 16
312*979a0356SVeera; CHECK-NEXT:    ret i8 [[ADD]]
313*979a0356SVeera;
314*979a0356SVeera  %add = add nsw i8 %x, 16
315*979a0356SVeera  %cmp = icmp sgt i8 %x, 8
316*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 poison
317*979a0356SVeera  ret i8 %s
318*979a0356SVeera}
319*979a0356SVeera
320*979a0356SVeeradefine i8 @eq_negative(i8 %x) {
321*979a0356SVeera; CHECK-LABEL: define i8 @eq_negative(
322*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
323*979a0356SVeera; CHECK-NEXT:    ret i8 24
324*979a0356SVeera;
325*979a0356SVeera  %add = add nsw i8 %x, 16
326*979a0356SVeera  %cmp = icmp eq i8 %x, 8
327*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 24
328*979a0356SVeera  ret i8 %s
329*979a0356SVeera}
330*979a0356SVeera
331*979a0356SVeeradefine i8 @different_operands_negative(i8 %x, i8 %y) {
332*979a0356SVeera; CHECK-LABEL: define i8 @different_operands_negative(
333*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
334*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[X]], 16
335*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[Y]], 8
336*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24
337*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
338*979a0356SVeera;
339*979a0356SVeera  %add = add nsw i8 %x, 16
340*979a0356SVeera  %cmp = icmp sgt i8 %y, 8
341*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 24
342*979a0356SVeera  ret i8 %s
343*979a0356SVeera}
344*979a0356SVeera
345*979a0356SVeeradefine i8 @non_const_bop_operand_negative(i8 %x, i8 %y) {
346*979a0356SVeera; CHECK-LABEL: define i8 @non_const_bop_operand_negative(
347*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
348*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[X]], [[Y]]
349*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[Y]], 8
350*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24
351*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
352*979a0356SVeera;
353*979a0356SVeera  %add = add nsw i8 %x, %y
354*979a0356SVeera  %cmp = icmp sgt i8 %y, 8
355*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 24
356*979a0356SVeera  ret i8 %s
357*979a0356SVeera}
358*979a0356SVeera
359*979a0356SVeeradefine i8 @non_const_cmp_operand_negative(i8 %x, i8 %y) {
360*979a0356SVeera; CHECK-LABEL: define i8 @non_const_cmp_operand_negative(
361*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
362*979a0356SVeera; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[X]], 16
363*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X]], [[Y]]
364*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24
365*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
366*979a0356SVeera;
367*979a0356SVeera  %add = add nsw i8 %x, 16
368*979a0356SVeera  %cmp = icmp sgt i8 %x, %y
369*979a0356SVeera  %s = select i1 %cmp, i8 %add, i8 24
370*979a0356SVeera  ret i8 %s
371*979a0356SVeera}
372*979a0356SVeera
373*979a0356SVeeradeclare i8 @result()
374*979a0356SVeera
375*979a0356SVeeradefine i8 @non_binop_negative(i8 %x) {
376*979a0356SVeera; CHECK-LABEL: define i8 @non_binop_negative(
377*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
378*979a0356SVeera; CHECK-NEXT:    [[RESULT:%.*]] = call i8 @result()
379*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X]], 16
380*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[RESULT]], i8 24
381*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
382*979a0356SVeera;
383*979a0356SVeera  %result = call i8 @result()
384*979a0356SVeera  %cmp = icmp sgt i8 %x, 16
385*979a0356SVeera  %s = select i1 %cmp, i8 %result, i8 24
386*979a0356SVeera  ret i8 %s
387*979a0356SVeera}
388*979a0356SVeera
389*979a0356SVeeradefine i8 @sub_const_on_lhs_negative(i8 %x) {
390*979a0356SVeera; CHECK-LABEL: define i8 @sub_const_on_lhs_negative(
391*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) {
392*979a0356SVeera; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i8 50, [[X]]
393*979a0356SVeera; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X]], 100
394*979a0356SVeera; CHECK-NEXT:    [[S:%.*]] = select i1 [[CMP]], i8 [[SUB]], i8 50
395*979a0356SVeera; CHECK-NEXT:    ret i8 [[S]]
396*979a0356SVeera;
397*979a0356SVeera  %sub = sub nsw i8 50, %x
398*979a0356SVeera  %cmp = icmp ugt i8 %x, 100
399*979a0356SVeera  %s = select i1 %cmp, i8 %sub, i8 50
400*979a0356SVeera  ret i8 %s
401*979a0356SVeera}
402