xref: /llvm-project/llvm/test/Analysis/ValueTracking/constant-ranges.ll (revision 9facaaddadd63a1668c212c8a9ef94a5ad4c6629)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instsimplify < %s -S | FileCheck %s
3
4define i1 @shl_C_X_ugt(i8 %x) {
5; CHECK-LABEL: @shl_C_X_ugt(
6; CHECK-NEXT:    ret i1 false
7;
8  %shl = shl i8 7, %x
9  %r = icmp ugt i8 %shl, 224
10  ret i1 %r
11}
12
13define i1 @shl_C_X_ugt2(i8 %x) {
14; CHECK-LABEL: @shl_C_X_ugt2(
15; CHECK-NEXT:    ret i1 false
16;
17  %shl = shl i8 5, %x
18  %r = icmp ugt i8 %shl, 192
19  ret i1 %r
20}
21
22define i1 @shl_C_X_ugt_fail(i8 %x) {
23; CHECK-LABEL: @shl_C_X_ugt_fail(
24; CHECK-NEXT:    [[SHL:%.*]] = shl i8 1, [[X:%.*]]
25; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], 127
26; CHECK-NEXT:    ret i1 [[R]]
27;
28  %shl = shl i8 1, %x
29  %r = icmp ugt i8 %shl, 127
30  ret i1 %r
31}
32
33define i1 @shl_C_X_ugt_fail2(i8 %x) {
34; CHECK-LABEL: @shl_C_X_ugt_fail2(
35; CHECK-NEXT:    [[SHL:%.*]] = shl i8 3, [[X:%.*]]
36; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -66
37; CHECK-NEXT:    ret i1 [[R]]
38;
39  %shl = shl i8 3, %x
40  %r = icmp ugt i8 %shl, 190
41  ret i1 %r
42}
43
44define i1 @shl_C_X_ugt_fail3(i8 %x) {
45; CHECK-LABEL: @shl_C_X_ugt_fail3(
46; CHECK-NEXT:    [[SHL:%.*]] = shl i8 -1, [[X:%.*]]
47; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -2
48; CHECK-NEXT:    ret i1 [[R]]
49;
50  %shl = shl i8 -1, %x
51  %r = icmp ugt i8 %shl, 254
52  ret i1 %r
53}
54
55define i1 @shl_C_X_ugt_todo(i8 %x) {
56; CHECK-LABEL: @shl_C_X_ugt_todo(
57; CHECK-NEXT:    [[SHL:%.*]] = shl i8 -127, [[X:%.*]]
58; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -116
59; CHECK-NEXT:    ret i1 [[R]]
60;
61  %shl = shl i8 129, %x
62  %r = icmp ugt i8 %shl, 140
63  ret i1 %r
64}
65
66define i1 @shl_X_C_ugt(i8 %x) {
67; CHECK-LABEL: @shl_X_C_ugt(
68; CHECK-NEXT:    ret i1 false
69;
70  %shl = shl i8 %x, 6
71  %r = icmp ugt i8 %shl, 192
72  ret i1 %r
73}
74
75define i1 @shl_X_C_ugt_fail(i8 %x) {
76; CHECK-LABEL: @shl_X_C_ugt_fail(
77; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[X:%.*]], 6
78; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -65
79; CHECK-NEXT:    ret i1 [[R]]
80;
81  %shl = shl i8 %x, 6
82  %r = icmp ugt i8 %shl, 191
83  ret i1 %r
84}
85
86define i1 @shl_X_C_ugt_fail2(i8 %x) {
87; CHECK-LABEL: @shl_X_C_ugt_fail2(
88; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[X:%.*]], 5
89; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -64
90; CHECK-NEXT:    ret i1 [[R]]
91;
92  %shl = shl i8 %x, 5
93  %r = icmp ugt i8 %shl, 192
94  ret i1 %r
95}
96
97define i1 @and_ugt(i8 %xx) {
98; CHECK-LABEL: @and_ugt(
99; CHECK-NEXT:    ret i1 false
100;
101  %x = mul i8 %xx, %xx  ; thwart complexity-based canonicalization
102  %negx = sub i8 0, %x
103  %x_p2 = and i8 %negx, %x
104  %r = icmp ugt i8 %x_p2, 128
105  ret i1 %r
106}
107
108define i1 @and_ugt2(i8 %xx) {
109; CHECK-LABEL: @and_ugt2(
110; CHECK-NEXT:    ret i1 false
111;
112  %x = mul i8 %xx, %xx  ; thwart complexity-based canonicalization
113  %negx = sub i8 0, %x
114  %x_p2 = and i8 %x, %negx
115  %r = icmp ugt i8 %x_p2, 128
116  ret i1 %r
117}
118
119define i1 @and_ugt_fail(i8 %xx) {
120; CHECK-LABEL: @and_ugt_fail(
121; CHECK-NEXT:    [[X:%.*]] = mul i8 [[XX:%.*]], [[XX]]
122; CHECK-NEXT:    [[NEGX:%.*]] = sub i8 0, [[X]]
123; CHECK-NEXT:    [[X_P2:%.*]] = and i8 [[X]], [[NEGX]]
124; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[X_P2]], 127
125; CHECK-NEXT:    ret i1 [[R]]
126;
127  %x = mul i8 %xx, %xx  ; thwart complexity-based canonicalization
128  %negx = sub i8 0, %x
129  %x_p2 = and i8 %x, %negx
130  %r = icmp ugt i8 %x_p2, 127
131  ret i1 %r
132}
133
134define i1 @urem_okay(i8 %x) {
135; CHECK-LABEL: @urem_okay(
136; CHECK-NEXT:    ret i1 true
137;
138  %val = urem i8 34, %x
139  %r = icmp ule i8 %val, 35
140  ret i1 %r
141}
142
143define i1 @urem_fail(i8 %x) {
144; CHECK-LABEL: @urem_fail(
145; CHECK-NEXT:    [[VAL:%.*]] = urem i8 34, [[X:%.*]]
146; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[VAL]], 33
147; CHECK-NEXT:    ret i1 [[R]]
148;
149  %val = urem i8 34, %x
150  %r = icmp ule i8 %val, 33
151  ret i1 %r
152}
153
154define i1 @srem_posC_okay0(i8 %x) {
155; CHECK-LABEL: @srem_posC_okay0(
156; CHECK-NEXT:    ret i1 true
157;
158  %val = srem i8 34, %x
159  %r = icmp sle i8 %val, 34
160  ret i1 %r
161}
162
163define i1 @srem_posC_okay1(i8 %x) {
164; CHECK-LABEL: @srem_posC_okay1(
165; CHECK-NEXT:    ret i1 true
166;
167  %val = srem i8 34, %x
168  %r = icmp sge i8 %val, -3
169  ret i1 %r
170}
171
172define i1 @srem_negC_okay0(i8 %x) {
173; CHECK-LABEL: @srem_negC_okay0(
174; CHECK-NEXT:    ret i1 true
175;
176  %val = srem i8 -34, %x
177  %r = icmp sle i8 %val, 0
178  ret i1 %r
179}
180
181define i1 @srem_negC_okay1(i8 %x) {
182; CHECK-LABEL: @srem_negC_okay1(
183; CHECK-NEXT:    ret i1 true
184;
185  %val = srem i8 -34, %x
186  %r = icmp sge i8 %val, -34
187  ret i1 %r
188}
189
190define i1 @srem_posC_fail0(i8 %x) {
191; CHECK-LABEL: @srem_posC_fail0(
192; CHECK-NEXT:    [[VAL:%.*]] = srem i8 34, [[X:%.*]]
193; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[VAL]], 32
194; CHECK-NEXT:    ret i1 [[R]]
195;
196  %val = srem i8 34, %x
197  %r = icmp sle i8 %val, 32
198  ret i1 %r
199}
200
201define i1 @srem_posC_fail1(i8 %x) {
202; CHECK-LABEL: @srem_posC_fail1(
203; CHECK-NEXT:    [[VAL:%.*]] = srem i8 34, [[X:%.*]]
204; CHECK-NEXT:    [[R:%.*]] = icmp sge i8 [[VAL]], 1
205; CHECK-NEXT:    ret i1 [[R]]
206;
207  %val = srem i8 34, %x
208  %r = icmp sge i8 %val, 1
209  ret i1 %r
210}
211
212define i1 @srem_negC_fail0(i8 %x) {
213; CHECK-LABEL: @srem_negC_fail0(
214; CHECK-NEXT:    [[VAL:%.*]] = srem i8 -34, [[X:%.*]]
215; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[VAL]], -1
216; CHECK-NEXT:    ret i1 [[R]]
217;
218  %val = srem i8 -34, %x
219  %r = icmp sle i8 %val, -1
220  ret i1 %r
221}
222
223define i1 @srem_negC_fail1(i8 %x) {
224; CHECK-LABEL: @srem_negC_fail1(
225; CHECK-NEXT:    [[VAL:%.*]] = srem i8 -34, [[X:%.*]]
226; CHECK-NEXT:    [[R:%.*]] = icmp sge i8 [[VAL]], -33
227; CHECK-NEXT:    ret i1 [[R]]
228;
229  %val = srem i8 -34, %x
230  %r = icmp sge i8 %val, -33
231  ret i1 %r
232}
233