xref: /llvm-project/llvm/test/Analysis/ValueTracking/constant-ranges.ll (revision 9facaaddadd63a1668c212c8a9ef94a5ad4c6629)
1457308a4SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2457308a4SNoah Goldstein; RUN: opt -passes=instsimplify < %s -S | FileCheck %s
3457308a4SNoah Goldstein
4457308a4SNoah Goldsteindefine i1 @shl_C_X_ugt(i8 %x) {
5457308a4SNoah Goldstein; CHECK-LABEL: @shl_C_X_ugt(
60f8b40a8SNoah Goldstein; CHECK-NEXT:    ret i1 false
7457308a4SNoah Goldstein;
8457308a4SNoah Goldstein  %shl = shl i8 7, %x
9457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 224
10457308a4SNoah Goldstein  ret i1 %r
11457308a4SNoah Goldstein}
12457308a4SNoah Goldstein
13457308a4SNoah Goldsteindefine i1 @shl_C_X_ugt2(i8 %x) {
14457308a4SNoah Goldstein; CHECK-LABEL: @shl_C_X_ugt2(
150f8b40a8SNoah Goldstein; CHECK-NEXT:    ret i1 false
16457308a4SNoah Goldstein;
17457308a4SNoah Goldstein  %shl = shl i8 5, %x
18457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 192
19457308a4SNoah Goldstein  ret i1 %r
20457308a4SNoah Goldstein}
21457308a4SNoah Goldstein
22457308a4SNoah Goldsteindefine i1 @shl_C_X_ugt_fail(i8 %x) {
23457308a4SNoah Goldstein; CHECK-LABEL: @shl_C_X_ugt_fail(
24457308a4SNoah Goldstein; CHECK-NEXT:    [[SHL:%.*]] = shl i8 1, [[X:%.*]]
25457308a4SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], 127
26457308a4SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
27457308a4SNoah Goldstein;
28457308a4SNoah Goldstein  %shl = shl i8 1, %x
29457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 127
30457308a4SNoah Goldstein  ret i1 %r
31457308a4SNoah Goldstein}
32457308a4SNoah Goldstein
33457308a4SNoah Goldsteindefine i1 @shl_C_X_ugt_fail2(i8 %x) {
34457308a4SNoah Goldstein; CHECK-LABEL: @shl_C_X_ugt_fail2(
35457308a4SNoah Goldstein; CHECK-NEXT:    [[SHL:%.*]] = shl i8 3, [[X:%.*]]
36457308a4SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -66
37457308a4SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
38457308a4SNoah Goldstein;
39457308a4SNoah Goldstein  %shl = shl i8 3, %x
40457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 190
41457308a4SNoah Goldstein  ret i1 %r
42457308a4SNoah Goldstein}
43457308a4SNoah Goldstein
44457308a4SNoah Goldsteindefine i1 @shl_C_X_ugt_fail3(i8 %x) {
45457308a4SNoah Goldstein; CHECK-LABEL: @shl_C_X_ugt_fail3(
46457308a4SNoah Goldstein; CHECK-NEXT:    [[SHL:%.*]] = shl i8 -1, [[X:%.*]]
47457308a4SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -2
48457308a4SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
49457308a4SNoah Goldstein;
50457308a4SNoah Goldstein  %shl = shl i8 -1, %x
51457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 254
52457308a4SNoah Goldstein  ret i1 %r
53457308a4SNoah Goldstein}
54457308a4SNoah Goldstein
55457308a4SNoah Goldsteindefine i1 @shl_C_X_ugt_todo(i8 %x) {
56457308a4SNoah Goldstein; CHECK-LABEL: @shl_C_X_ugt_todo(
57457308a4SNoah Goldstein; CHECK-NEXT:    [[SHL:%.*]] = shl i8 -127, [[X:%.*]]
58457308a4SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -116
59457308a4SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
60457308a4SNoah Goldstein;
61457308a4SNoah Goldstein  %shl = shl i8 129, %x
62457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 140
63457308a4SNoah Goldstein  ret i1 %r
64457308a4SNoah Goldstein}
65457308a4SNoah Goldstein
66457308a4SNoah Goldsteindefine i1 @shl_X_C_ugt(i8 %x) {
67457308a4SNoah Goldstein; CHECK-LABEL: @shl_X_C_ugt(
680f8b40a8SNoah Goldstein; CHECK-NEXT:    ret i1 false
69457308a4SNoah Goldstein;
70457308a4SNoah Goldstein  %shl = shl i8 %x, 6
71457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 192
72457308a4SNoah Goldstein  ret i1 %r
73457308a4SNoah Goldstein}
74457308a4SNoah Goldstein
75457308a4SNoah Goldsteindefine i1 @shl_X_C_ugt_fail(i8 %x) {
76457308a4SNoah Goldstein; CHECK-LABEL: @shl_X_C_ugt_fail(
77457308a4SNoah Goldstein; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[X:%.*]], 6
78457308a4SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -65
79457308a4SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
80457308a4SNoah Goldstein;
81457308a4SNoah Goldstein  %shl = shl i8 %x, 6
82457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 191
83457308a4SNoah Goldstein  ret i1 %r
84457308a4SNoah Goldstein}
85457308a4SNoah Goldstein
86457308a4SNoah Goldsteindefine i1 @shl_X_C_ugt_fail2(i8 %x) {
87457308a4SNoah Goldstein; CHECK-LABEL: @shl_X_C_ugt_fail2(
88457308a4SNoah Goldstein; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[X:%.*]], 5
89457308a4SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -64
90457308a4SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
91457308a4SNoah Goldstein;
92457308a4SNoah Goldstein  %shl = shl i8 %x, 5
93457308a4SNoah Goldstein  %r = icmp ugt i8 %shl, 192
94457308a4SNoah Goldstein  ret i1 %r
95457308a4SNoah Goldstein}
96457308a4SNoah Goldstein
97457308a4SNoah Goldsteindefine i1 @and_ugt(i8 %xx) {
98457308a4SNoah Goldstein; CHECK-LABEL: @and_ugt(
9950ece4cbSNoah Goldstein; CHECK-NEXT:    ret i1 false
100457308a4SNoah Goldstein;
101457308a4SNoah Goldstein  %x = mul i8 %xx, %xx  ; thwart complexity-based canonicalization
102457308a4SNoah Goldstein  %negx = sub i8 0, %x
103457308a4SNoah Goldstein  %x_p2 = and i8 %negx, %x
104457308a4SNoah Goldstein  %r = icmp ugt i8 %x_p2, 128
105457308a4SNoah Goldstein  ret i1 %r
106457308a4SNoah Goldstein}
107457308a4SNoah Goldstein
108457308a4SNoah Goldsteindefine i1 @and_ugt2(i8 %xx) {
109457308a4SNoah Goldstein; CHECK-LABEL: @and_ugt2(
11050ece4cbSNoah Goldstein; CHECK-NEXT:    ret i1 false
111457308a4SNoah Goldstein;
112457308a4SNoah Goldstein  %x = mul i8 %xx, %xx  ; thwart complexity-based canonicalization
113457308a4SNoah Goldstein  %negx = sub i8 0, %x
114457308a4SNoah Goldstein  %x_p2 = and i8 %x, %negx
115457308a4SNoah Goldstein  %r = icmp ugt i8 %x_p2, 128
116457308a4SNoah Goldstein  ret i1 %r
117457308a4SNoah Goldstein}
118457308a4SNoah Goldstein
119457308a4SNoah Goldsteindefine i1 @and_ugt_fail(i8 %xx) {
120457308a4SNoah Goldstein; CHECK-LABEL: @and_ugt_fail(
121457308a4SNoah Goldstein; CHECK-NEXT:    [[X:%.*]] = mul i8 [[XX:%.*]], [[XX]]
122457308a4SNoah Goldstein; CHECK-NEXT:    [[NEGX:%.*]] = sub i8 0, [[X]]
123457308a4SNoah Goldstein; CHECK-NEXT:    [[X_P2:%.*]] = and i8 [[X]], [[NEGX]]
124457308a4SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[X_P2]], 127
125457308a4SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
126457308a4SNoah Goldstein;
127457308a4SNoah Goldstein  %x = mul i8 %xx, %xx  ; thwart complexity-based canonicalization
128457308a4SNoah Goldstein  %negx = sub i8 0, %x
129457308a4SNoah Goldstein  %x_p2 = and i8 %x, %negx
130457308a4SNoah Goldstein  %r = icmp ugt i8 %x_p2, 127
131457308a4SNoah Goldstein  ret i1 %r
132457308a4SNoah Goldstein}
133aa7076fcSNoah Goldstein
134aa7076fcSNoah Goldsteindefine i1 @urem_okay(i8 %x) {
135aa7076fcSNoah Goldstein; CHECK-LABEL: @urem_okay(
136*9facaaddSNoah Goldstein; CHECK-NEXT:    ret i1 true
137aa7076fcSNoah Goldstein;
138aa7076fcSNoah Goldstein  %val = urem i8 34, %x
139aa7076fcSNoah Goldstein  %r = icmp ule i8 %val, 35
140aa7076fcSNoah Goldstein  ret i1 %r
141aa7076fcSNoah Goldstein}
142aa7076fcSNoah Goldstein
143aa7076fcSNoah Goldsteindefine i1 @urem_fail(i8 %x) {
144aa7076fcSNoah Goldstein; CHECK-LABEL: @urem_fail(
145aa7076fcSNoah Goldstein; CHECK-NEXT:    [[VAL:%.*]] = urem i8 34, [[X:%.*]]
146aa7076fcSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[VAL]], 33
147aa7076fcSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
148aa7076fcSNoah Goldstein;
149aa7076fcSNoah Goldstein  %val = urem i8 34, %x
150aa7076fcSNoah Goldstein  %r = icmp ule i8 %val, 33
151aa7076fcSNoah Goldstein  ret i1 %r
152aa7076fcSNoah Goldstein}
153aa7076fcSNoah Goldstein
154aa7076fcSNoah Goldsteindefine i1 @srem_posC_okay0(i8 %x) {
155aa7076fcSNoah Goldstein; CHECK-LABEL: @srem_posC_okay0(
156*9facaaddSNoah Goldstein; CHECK-NEXT:    ret i1 true
157aa7076fcSNoah Goldstein;
158aa7076fcSNoah Goldstein  %val = srem i8 34, %x
159aa7076fcSNoah Goldstein  %r = icmp sle i8 %val, 34
160aa7076fcSNoah Goldstein  ret i1 %r
161aa7076fcSNoah Goldstein}
162aa7076fcSNoah Goldstein
163aa7076fcSNoah Goldsteindefine i1 @srem_posC_okay1(i8 %x) {
164aa7076fcSNoah Goldstein; CHECK-LABEL: @srem_posC_okay1(
165*9facaaddSNoah Goldstein; CHECK-NEXT:    ret i1 true
166aa7076fcSNoah Goldstein;
167aa7076fcSNoah Goldstein  %val = srem i8 34, %x
168aa7076fcSNoah Goldstein  %r = icmp sge i8 %val, -3
169aa7076fcSNoah Goldstein  ret i1 %r
170aa7076fcSNoah Goldstein}
171aa7076fcSNoah Goldstein
172aa7076fcSNoah Goldsteindefine i1 @srem_negC_okay0(i8 %x) {
173aa7076fcSNoah Goldstein; CHECK-LABEL: @srem_negC_okay0(
174*9facaaddSNoah Goldstein; CHECK-NEXT:    ret i1 true
175aa7076fcSNoah Goldstein;
176aa7076fcSNoah Goldstein  %val = srem i8 -34, %x
177aa7076fcSNoah Goldstein  %r = icmp sle i8 %val, 0
178aa7076fcSNoah Goldstein  ret i1 %r
179aa7076fcSNoah Goldstein}
180aa7076fcSNoah Goldstein
181aa7076fcSNoah Goldsteindefine i1 @srem_negC_okay1(i8 %x) {
182aa7076fcSNoah Goldstein; CHECK-LABEL: @srem_negC_okay1(
183*9facaaddSNoah Goldstein; CHECK-NEXT:    ret i1 true
184aa7076fcSNoah Goldstein;
185aa7076fcSNoah Goldstein  %val = srem i8 -34, %x
186aa7076fcSNoah Goldstein  %r = icmp sge i8 %val, -34
187aa7076fcSNoah Goldstein  ret i1 %r
188aa7076fcSNoah Goldstein}
189aa7076fcSNoah Goldstein
190aa7076fcSNoah Goldsteindefine i1 @srem_posC_fail0(i8 %x) {
191aa7076fcSNoah Goldstein; CHECK-LABEL: @srem_posC_fail0(
192aa7076fcSNoah Goldstein; CHECK-NEXT:    [[VAL:%.*]] = srem i8 34, [[X:%.*]]
193aa7076fcSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[VAL]], 32
194aa7076fcSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
195aa7076fcSNoah Goldstein;
196aa7076fcSNoah Goldstein  %val = srem i8 34, %x
197aa7076fcSNoah Goldstein  %r = icmp sle i8 %val, 32
198aa7076fcSNoah Goldstein  ret i1 %r
199aa7076fcSNoah Goldstein}
200aa7076fcSNoah Goldstein
201aa7076fcSNoah Goldsteindefine i1 @srem_posC_fail1(i8 %x) {
202aa7076fcSNoah Goldstein; CHECK-LABEL: @srem_posC_fail1(
203aa7076fcSNoah Goldstein; CHECK-NEXT:    [[VAL:%.*]] = srem i8 34, [[X:%.*]]
204aa7076fcSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp sge i8 [[VAL]], 1
205aa7076fcSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
206aa7076fcSNoah Goldstein;
207aa7076fcSNoah Goldstein  %val = srem i8 34, %x
208aa7076fcSNoah Goldstein  %r = icmp sge i8 %val, 1
209aa7076fcSNoah Goldstein  ret i1 %r
210aa7076fcSNoah Goldstein}
211aa7076fcSNoah Goldstein
212aa7076fcSNoah Goldsteindefine i1 @srem_negC_fail0(i8 %x) {
213aa7076fcSNoah Goldstein; CHECK-LABEL: @srem_negC_fail0(
214aa7076fcSNoah Goldstein; CHECK-NEXT:    [[VAL:%.*]] = srem i8 -34, [[X:%.*]]
215aa7076fcSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[VAL]], -1
216aa7076fcSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
217aa7076fcSNoah Goldstein;
218aa7076fcSNoah Goldstein  %val = srem i8 -34, %x
219aa7076fcSNoah Goldstein  %r = icmp sle i8 %val, -1
220aa7076fcSNoah Goldstein  ret i1 %r
221aa7076fcSNoah Goldstein}
222aa7076fcSNoah Goldstein
223aa7076fcSNoah Goldsteindefine i1 @srem_negC_fail1(i8 %x) {
224aa7076fcSNoah Goldstein; CHECK-LABEL: @srem_negC_fail1(
225aa7076fcSNoah Goldstein; CHECK-NEXT:    [[VAL:%.*]] = srem i8 -34, [[X:%.*]]
226aa7076fcSNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp sge i8 [[VAL]], -33
227aa7076fcSNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
228aa7076fcSNoah Goldstein;
229aa7076fcSNoah Goldstein  %val = srem i8 -34, %x
230aa7076fcSNoah Goldstein  %r = icmp sge i8 %val, -33
231aa7076fcSNoah Goldstein  ret i1 %r
232aa7076fcSNoah Goldstein}
233