xref: /llvm-project/llvm/test/Analysis/ValueTracking/knownbits-rem.ll (revision 3fee3e83a8a802cd23e79fbf2f1320bb8f961d0c)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define i8 @urem_low_bits_know(i8 %xx, i8 %yy) {
5; CHECK-LABEL: @urem_low_bits_know(
6; CHECK-NEXT:    ret i8 2
7;
8  %x = or i8 %xx, 2
9  %y = and i8 %yy, -4
10  %rem = urem i8 %x, %y
11  %r = and i8 %rem, 2
12  ret i8 %r
13}
14
15define i8 @urem_high_bits_know(i8 %xx, i8 %yy) {
16; CHECK-LABEL: @urem_high_bits_know(
17; CHECK-NEXT:    ret i8 0
18;
19  %x = and i8 %xx, 2
20  %y = and i8 %yy, -4
21  %rem = urem i8 %x, %y
22  %r = and i8 %rem, 8
23  ret i8 %r
24}
25
26define i8 @urem_low_bits_know2(i8 %xx, i8 %yy) {
27; CHECK-LABEL: @urem_low_bits_know2(
28; CHECK-NEXT:    ret i8 2
29;
30  %xo = or i8 %xx, 2
31  %x = and i8 %xo, 254
32  %y = and i8 %yy, -4
33  %rem = urem i8 %x, %y
34  %r = and i8 %rem, 3
35  ret i8 %r
36}
37
38define i8 @urem_todo_low_bits_partially_know_should_fold_out_urem(i8 %xx, i8 %yy) {
39; CHECK-LABEL: @urem_todo_low_bits_partially_know_should_fold_out_urem(
40; CHECK-NEXT:    [[X:%.*]] = or i8 [[XX:%.*]], 2
41; CHECK-NEXT:    [[Y:%.*]] = and i8 [[YY:%.*]], -4
42; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], [[Y]]
43; CHECK-NEXT:    [[R:%.*]] = and i8 [[REM]], 3
44; CHECK-NEXT:    ret i8 [[R]]
45;
46  %x = or i8 %xx, 2
47  %y = and i8 %yy, -4
48  %rem = urem i8 %x, %y
49  %r = and i8 %rem, 3
50  ret i8 %r
51}
52
53define i8 @urem_fail_low_bits_unknown(i8 %xx, i8 %yy) {
54; CHECK-LABEL: @urem_fail_low_bits_unknown(
55; CHECK-NEXT:    [[X:%.*]] = or i8 [[XX:%.*]], 4
56; CHECK-NEXT:    [[Y:%.*]] = and i8 [[YY:%.*]], -4
57; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], [[Y]]
58; CHECK-NEXT:    [[R:%.*]] = and i8 [[REM]], 2
59; CHECK-NEXT:    ret i8 [[R]]
60;
61  %x = or i8 %xx, 4
62  %y = and i8 %yy, -4
63  %rem = urem i8 %x, %y
64  %r = and i8 %rem, 2
65  ret i8 %r
66}
67
68define i8 @urem_fail_low_bits_unknown2(i8 %xx, i8 %yy) {
69; CHECK-LABEL: @urem_fail_low_bits_unknown2(
70; CHECK-NEXT:    [[X:%.*]] = or i8 [[XX:%.*]], 1
71; CHECK-NEXT:    [[Y:%.*]] = and i8 [[YY:%.*]], -5
72; CHECK-NEXT:    [[REM:%.*]] = urem i8 [[X]], [[Y]]
73; CHECK-NEXT:    [[R:%.*]] = and i8 [[REM]], 2
74; CHECK-NEXT:    ret i8 [[R]]
75;
76  %x = or i8 %xx, 1
77  %y = and i8 %yy, -5
78  %rem = urem i8 %x, %y
79  %r = and i8 %rem, 2
80  ret i8 %r
81}
82
83define i8 @srem_low_bits_know(i8 %xx, i8 %yy) {
84; CHECK-LABEL: @srem_low_bits_know(
85; CHECK-NEXT:    ret i8 2
86;
87  %x = or i8 %xx, 10
88  %y = and i8 %yy, -4
89  %rem = srem i8 %x, %y
90  %r = and i8 %rem, 2
91  ret i8 %r
92}
93
94define i8 @srem_low_bits_know2(i8 %xx, i8 %yy) {
95; CHECK-LABEL: @srem_low_bits_know2(
96; CHECK-NEXT:    ret i8 1
97;
98  %x = or i8 %xx, 1
99  %y = and i8 %yy, -2
100  %rem = srem i8 %x, %y
101  %r = and i8 %rem, 1
102  ret i8 %r
103}
104
105define i8 @srem_high_bits_know(i8 %xx, i8 %yy) {
106; CHECK-LABEL: @srem_high_bits_know(
107; CHECK-NEXT:    ret i8 -2
108;
109  %x = or i8 %xx, -2
110  %y = and i8 %yy, -4
111  %rem = srem i8 %x, %y
112  %r = and i8 %rem, -2
113  ret i8 %r
114}
115
116define i8 @srem_high_bits_know2(i8 %xx, i8 %yy) {
117; CHECK-LABEL: @srem_high_bits_know2(
118; CHECK-NEXT:    ret i8 0
119;
120  %x = and i8 %xx, 13
121  %y = or i8 %yy, -4
122  %rem = srem i8 %x, %y
123  %r = and i8 %rem, 8
124  ret i8 %r
125}
126
127define i8 @srem_high_bits_know3(i8 %xx, i8 %yy) {
128; CHECK-LABEL: @srem_high_bits_know3(
129; CHECK-NEXT:    ret i8 8
130;
131  %x = or i8 %xx, -13
132  %y = and i8 %yy, 4
133  %rem = srem i8 %x, %y
134  %r = and i8 %rem, 8
135  ret i8 %r
136}
137
138define i8 @srem_high_bits_know4(i8 %xx, i8 %yy) {
139; CHECK-LABEL: @srem_high_bits_know4(
140; CHECK-NEXT:    ret i8 0
141;
142  %x = and i8 %xx, 4
143  %y = or i8 %yy, -13
144  %rem = srem i8 %x, %y
145  %r = and i8 %rem, 8
146  ret i8 %r
147}
148
149define i8 @srem_high_bits_know5(i8 %xx, i8 %yy) {
150; CHECK-LABEL: @srem_high_bits_know5(
151; CHECK-NEXT:    [[X:%.*]] = and i8 [[XX:%.*]], 2
152; CHECK-NEXT:    ret i8 [[X]]
153;
154  %x = and i8 %xx, 2
155  %y = and i8 %yy, 4
156  %rem = srem i8 %x, %y
157  %r = and i8 %rem, 2
158  ret i8 %r
159}
160
161define i8 @srem_todo_low_bits_partially_know_should_fold_out_srem(i8 %xx, i8 %yy) {
162; CHECK-LABEL: @srem_todo_low_bits_partially_know_should_fold_out_srem(
163; CHECK-NEXT:    [[X:%.*]] = or i8 [[XX:%.*]], 10
164; CHECK-NEXT:    [[Y:%.*]] = and i8 [[YY:%.*]], -4
165; CHECK-NEXT:    [[REM:%.*]] = srem i8 [[X]], [[Y]]
166; CHECK-NEXT:    [[R:%.*]] = and i8 [[REM]], 3
167; CHECK-NEXT:    ret i8 [[R]]
168;
169  %x = or i8 %xx, 10
170  %y = and i8 %yy, -4
171  %rem = srem i8 %x, %y
172  %r = and i8 %rem, 3
173  ret i8 %r
174}
175
176define i8 @srem_fail_low_bits_unknown(i8 %xx, i8 %yy) {
177; CHECK-LABEL: @srem_fail_low_bits_unknown(
178; CHECK-NEXT:    [[X:%.*]] = or i8 [[XX:%.*]], 4
179; CHECK-NEXT:    [[Y:%.*]] = and i8 [[YY:%.*]], -4
180; CHECK-NEXT:    [[REM:%.*]] = srem i8 [[X]], [[Y]]
181; CHECK-NEXT:    [[R:%.*]] = and i8 [[REM]], 2
182; CHECK-NEXT:    ret i8 [[R]]
183;
184  %x = or i8 %xx, 4
185  %y = and i8 %yy, -4
186  %rem = srem i8 %x, %y
187  %r = and i8 %rem, 2
188  ret i8 %r
189}
190
191define i8 @srem_fail_irrelivent_bits_known(i8 %xx, i8 %yy) {
192; CHECK-LABEL: @srem_fail_irrelivent_bits_known(
193; CHECK-NEXT:    [[X:%.*]] = or i8 [[XX:%.*]], 3
194; CHECK-NEXT:    [[Y:%.*]] = and i8 [[YY:%.*]], -6
195; CHECK-NEXT:    [[REM:%.*]] = srem i8 [[X]], [[Y]]
196; CHECK-NEXT:    [[R:%.*]] = and i8 [[REM]], 2
197; CHECK-NEXT:    ret i8 [[R]]
198;
199  %x = or i8 %xx, 3
200  %y = and i8 %yy, -6
201  %rem = srem i8 %x, %y
202  %r = and i8 %rem, 2
203  ret i8 %r
204}
205