[bazel] Add BuiltinsSPIRV (for #121598)
[llvm-project.git] / llvm / test / Analysis / ValueTracking / knownbits-rem.ll
blob0aa340c46bdecab38317f342d3394ca5e4a00e8e
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
4 define i8 @urem_low_bits_know(i8 %xx, i8 %yy) {
5 ; CHECK-LABEL: @urem_low_bits_know(
6 ; CHECK-NEXT:    ret i8 2
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
15 define i8 @urem_high_bits_know(i8 %xx, i8 %yy) {
16 ; CHECK-LABEL: @urem_high_bits_know(
17 ; CHECK-NEXT:    ret i8 0
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
26 define i8 @urem_low_bits_know2(i8 %xx, i8 %yy) {
27 ; CHECK-LABEL: @urem_low_bits_know2(
28 ; CHECK-NEXT:    ret i8 2
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
38 define 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]]
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
53 define 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]]
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
68 define 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]]
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
83 define i8 @srem_low_bits_know(i8 %xx, i8 %yy) {
84 ; CHECK-LABEL: @srem_low_bits_know(
85 ; CHECK-NEXT:    ret i8 2
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
94 define i8 @srem_low_bits_know2(i8 %xx, i8 %yy) {
95 ; CHECK-LABEL: @srem_low_bits_know2(
96 ; CHECK-NEXT:    ret i8 1
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
105 define i8 @srem_high_bits_know(i8 %xx, i8 %yy) {
106 ; CHECK-LABEL: @srem_high_bits_know(
107 ; CHECK-NEXT:    ret i8 -2
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
116 define i8 @srem_high_bits_know2(i8 %xx, i8 %yy) {
117 ; CHECK-LABEL: @srem_high_bits_know2(
118 ; CHECK-NEXT:    ret i8 0
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
127 define i8 @srem_high_bits_know3(i8 %xx, i8 %yy) {
128 ; CHECK-LABEL: @srem_high_bits_know3(
129 ; CHECK-NEXT:    ret i8 8
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
138 define i8 @srem_high_bits_know4(i8 %xx, i8 %yy) {
139 ; CHECK-LABEL: @srem_high_bits_know4(
140 ; CHECK-NEXT:    ret i8 0
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
149 define 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]]
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
161 define 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]]
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
176 define 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]]
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
191 define 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]]
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