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