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