xref: /llvm-project/llvm/test/Transforms/InstCombine/icmp-abs.ll (revision 86ef039220de4b7d2e2f1d5e93874ae7a242730e)
1*86ef0392SZ572; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*86ef0392SZ572; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3*86ef0392SZ572
4*86ef0392SZ572declare i4 @llvm.abs.i4(i4, i1)
5*86ef0392SZ572
6*86ef0392SZ572define i1 @icmp_sge_abs(i4 %arg) {
7*86ef0392SZ572; CHECK-LABEL: @icmp_sge_abs(
8*86ef0392SZ572; CHECK-NEXT:    ret i1 true
9*86ef0392SZ572;
10*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
11*86ef0392SZ572  %cmp = icmp sge i4 %abs, %arg
12*86ef0392SZ572  ret i1 %cmp
13*86ef0392SZ572}
14*86ef0392SZ572
15*86ef0392SZ572define i1 @icmp_sge_abs_false(i4 %arg) {
16*86ef0392SZ572; CHECK-LABEL: @icmp_sge_abs_false(
17*86ef0392SZ572; CHECK-NEXT:    ret i1 true
18*86ef0392SZ572;
19*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
20*86ef0392SZ572  %cmp = icmp sge i4 %abs, %arg
21*86ef0392SZ572  ret i1 %cmp
22*86ef0392SZ572}
23*86ef0392SZ572
24*86ef0392SZ572define i1 @icmp_eq_abs(i4 %arg) {
25*86ef0392SZ572; CHECK-LABEL: @icmp_eq_abs(
26*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i4 [[ARG:%.*]], -1
27*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
28*86ef0392SZ572;
29*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
30*86ef0392SZ572  %cmp = icmp eq i4 %abs, %arg
31*86ef0392SZ572  ret i1 %cmp
32*86ef0392SZ572}
33*86ef0392SZ572
34*86ef0392SZ572define i1 @icmp_eq_abs_false(i4 %arg) {
35*86ef0392SZ572; CHECK-LABEL: @icmp_eq_abs_false(
36*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i4 [[ARG:%.*]], -7
37*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
38*86ef0392SZ572;
39*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
40*86ef0392SZ572  %cmp = icmp eq i4 %abs, %arg
41*86ef0392SZ572  ret i1 %cmp
42*86ef0392SZ572}
43*86ef0392SZ572
44*86ef0392SZ572define i1 @icmp_ne_abs(i4 %arg) {
45*86ef0392SZ572; CHECK-LABEL: @icmp_ne_abs(
46*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i4 [[ARG:%.*]], 0
47*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
48*86ef0392SZ572;
49*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
50*86ef0392SZ572  %cmp = icmp ne i4 %abs, %arg
51*86ef0392SZ572  ret i1 %cmp
52*86ef0392SZ572}
53*86ef0392SZ572
54*86ef0392SZ572define i1 @icmp_ne_abs_false(i4 %arg) {
55*86ef0392SZ572; CHECK-LABEL: @icmp_ne_abs_false(
56*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i4 [[ARG:%.*]], -8
57*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
58*86ef0392SZ572;
59*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
60*86ef0392SZ572  %cmp = icmp ne i4 %abs, %arg
61*86ef0392SZ572  ret i1 %cmp
62*86ef0392SZ572}
63*86ef0392SZ572
64*86ef0392SZ572define i1 @icmp_sle_abs(i4 %arg) {
65*86ef0392SZ572; CHECK-LABEL: @icmp_sle_abs(
66*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i4 [[ARG:%.*]], -1
67*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
68*86ef0392SZ572;
69*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
70*86ef0392SZ572  %cmp = icmp sle i4 %abs, %arg
71*86ef0392SZ572  ret i1 %cmp
72*86ef0392SZ572}
73*86ef0392SZ572
74*86ef0392SZ572define i1 @icmp_sle_abs_false(i4 %arg) {
75*86ef0392SZ572; CHECK-LABEL: @icmp_sle_abs_false(
76*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i4 [[ARG:%.*]], -7
77*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
78*86ef0392SZ572;
79*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
80*86ef0392SZ572  %cmp = icmp sle i4 %abs, %arg
81*86ef0392SZ572  ret i1 %cmp
82*86ef0392SZ572}
83*86ef0392SZ572
84*86ef0392SZ572define i1 @icmp_slt_abs(i4 %arg) {
85*86ef0392SZ572; CHECK-LABEL: @icmp_slt_abs(
86*86ef0392SZ572; CHECK-NEXT:    ret i1 false
87*86ef0392SZ572;
88*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
89*86ef0392SZ572  %cmp = icmp slt i4 %abs, %arg
90*86ef0392SZ572  ret i1 %cmp
91*86ef0392SZ572}
92*86ef0392SZ572
93*86ef0392SZ572define i1 @icmp_slt_abs_false(i4 %arg) {
94*86ef0392SZ572; CHECK-LABEL: @icmp_slt_abs_false(
95*86ef0392SZ572; CHECK-NEXT:    ret i1 false
96*86ef0392SZ572;
97*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
98*86ef0392SZ572  %cmp = icmp slt i4 %abs, %arg
99*86ef0392SZ572  ret i1 %cmp
100*86ef0392SZ572}
101*86ef0392SZ572
102*86ef0392SZ572define i1 @icmp_sgt_abs(i4 %arg) {
103*86ef0392SZ572; CHECK-LABEL: @icmp_sgt_abs(
104*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i4 [[ARG:%.*]], 0
105*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
106*86ef0392SZ572;
107*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
108*86ef0392SZ572  %cmp = icmp sgt i4 %abs, %arg
109*86ef0392SZ572  ret i1 %cmp
110*86ef0392SZ572}
111*86ef0392SZ572
112*86ef0392SZ572define i1 @icmp_sgt_abs_false(i4 %arg) {
113*86ef0392SZ572; CHECK-LABEL: @icmp_sgt_abs_false(
114*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i4 [[ARG:%.*]], -8
115*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
116*86ef0392SZ572;
117*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
118*86ef0392SZ572  %cmp = icmp sgt i4 %abs, %arg
119*86ef0392SZ572  ret i1 %cmp
120*86ef0392SZ572}
121*86ef0392SZ572
122*86ef0392SZ572define i1 @icmp_ugt_abs(i4 %arg) {
123*86ef0392SZ572; CHECK-LABEL: @icmp_ugt_abs(
124*86ef0392SZ572; CHECK-NEXT:    ret i1 false
125*86ef0392SZ572;
126*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
127*86ef0392SZ572  %cmp = icmp ugt i4 %abs, %arg
128*86ef0392SZ572  ret i1 %cmp
129*86ef0392SZ572}
130*86ef0392SZ572
131*86ef0392SZ572define i1 @icmp_ugt_abs_false(i4 %arg) {
132*86ef0392SZ572; CHECK-LABEL: @icmp_ugt_abs_false(
133*86ef0392SZ572; CHECK-NEXT:    ret i1 false
134*86ef0392SZ572;
135*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
136*86ef0392SZ572  %cmp = icmp ugt i4 %abs, %arg
137*86ef0392SZ572  ret i1 %cmp
138*86ef0392SZ572}
139*86ef0392SZ572
140*86ef0392SZ572define i1 @icmp_uge_abs(i4 %arg) {
141*86ef0392SZ572; CHECK-LABEL: @icmp_uge_abs(
142*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i4 [[ARG:%.*]], -1
143*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
144*86ef0392SZ572;
145*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
146*86ef0392SZ572  %cmp = icmp uge i4 %abs, %arg
147*86ef0392SZ572  ret i1 %cmp
148*86ef0392SZ572}
149*86ef0392SZ572
150*86ef0392SZ572define i1 @icmp_uge_abs_false(i4 %arg) {
151*86ef0392SZ572; CHECK-LABEL: @icmp_uge_abs_false(
152*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i4 [[ARG:%.*]], -7
153*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
154*86ef0392SZ572;
155*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
156*86ef0392SZ572  %cmp = icmp uge i4 %abs, %arg
157*86ef0392SZ572  ret i1 %cmp
158*86ef0392SZ572}
159*86ef0392SZ572
160*86ef0392SZ572define i1 @icmp_ule_abs(i4 %arg) {
161*86ef0392SZ572; CHECK-LABEL: @icmp_ule_abs(
162*86ef0392SZ572; CHECK-NEXT:    ret i1 true
163*86ef0392SZ572;
164*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
165*86ef0392SZ572  %cmp = icmp ule i4 %abs, %arg
166*86ef0392SZ572  ret i1 %cmp
167*86ef0392SZ572}
168*86ef0392SZ572
169*86ef0392SZ572define i1 @icmp_ule_abs_false(i4 %arg) {
170*86ef0392SZ572; CHECK-LABEL: @icmp_ule_abs_false(
171*86ef0392SZ572; CHECK-NEXT:    ret i1 true
172*86ef0392SZ572;
173*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
174*86ef0392SZ572  %cmp = icmp ule i4 %abs, %arg
175*86ef0392SZ572  ret i1 %cmp
176*86ef0392SZ572}
177*86ef0392SZ572
178*86ef0392SZ572define i1 @icmp_ult_abs(i4 %arg) {
179*86ef0392SZ572; CHECK-LABEL: @icmp_ult_abs(
180*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i4 [[ARG:%.*]], 0
181*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
182*86ef0392SZ572;
183*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
184*86ef0392SZ572  %cmp = icmp ult i4 %abs, %arg
185*86ef0392SZ572  ret i1 %cmp
186*86ef0392SZ572}
187*86ef0392SZ572
188*86ef0392SZ572define i1 @icmp_ult_abs_false(i4 %arg) {
189*86ef0392SZ572; CHECK-LABEL: @icmp_ult_abs_false(
190*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i4 [[ARG:%.*]], -8
191*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
192*86ef0392SZ572;
193*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 false)
194*86ef0392SZ572  %cmp = icmp ult i4 %abs, %arg
195*86ef0392SZ572  ret i1 %cmp
196*86ef0392SZ572}
197*86ef0392SZ572
198*86ef0392SZ572define i1 @icmp_sge_abs2(i4 %arg) {
199*86ef0392SZ572; CHECK-LABEL: @icmp_sge_abs2(
200*86ef0392SZ572; CHECK-NEXT:    [[X:%.*]] = mul i4 [[ARG:%.*]], [[ARG]]
201*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i4 [[X]], -1
202*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
203*86ef0392SZ572;
204*86ef0392SZ572  %x = mul i4 %arg, %arg ; thwart complexity-based canonicalization
205*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %x, i1 true)
206*86ef0392SZ572  %cmp = icmp sge i4 %x, %abs
207*86ef0392SZ572  ret i1 %cmp
208*86ef0392SZ572}
209*86ef0392SZ572
210*86ef0392SZ572define i1 @icmp_sge_abs_mismatched_op(i4 %arg, i4 %arg2) {
211*86ef0392SZ572; CHECK-LABEL: @icmp_sge_abs_mismatched_op(
212*86ef0392SZ572; CHECK-NEXT:    [[ABS:%.*]] = call i4 @llvm.abs.i4(i4 [[ARG:%.*]], i1 true)
213*86ef0392SZ572; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i4 [[ABS]], [[ARG2:%.*]]
214*86ef0392SZ572; CHECK-NEXT:    ret i1 [[CMP]]
215*86ef0392SZ572;
216*86ef0392SZ572  %abs = call i4 @llvm.abs.i4(i4 %arg, i1 true)
217*86ef0392SZ572  %cmp = icmp sge i4 %abs, %arg2
218*86ef0392SZ572  ret i1 %cmp
219*86ef0392SZ572  }
220