@@ -12,6 +12,17 @@ define i8 @urem_low_bits_know(i8 %xx, i8 %yy) {
12
12
ret i8 %r
13
13
}
14
14
15
+ define 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
+
15
26
define i8 @urem_low_bits_know2 (i8 %xx , i8 %yy ) {
16
27
; CHECK-LABEL: @urem_low_bits_know2(
17
28
; CHECK-NEXT: ret i8 2
@@ -91,6 +102,74 @@ define i8 @srem_low_bits_know2(i8 %xx, i8 %yy) {
91
102
ret i8 %r
92
103
}
93
104
105
+ define i8 @srem_high_bits_know (i8 %xx , i8 %yy ) {
106
+ ; CHECK-LABEL: @srem_high_bits_know(
107
+ ; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], -2
108
+ ; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], -4
109
+ ; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]]
110
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], -2
111
+ ; CHECK-NEXT: ret i8 [[R]]
112
+ ;
113
+ %x = or i8 %xx , -2
114
+ %y = and i8 %yy , -4
115
+ %rem = srem i8 %x , %y
116
+ %r = and i8 %rem , -2
117
+ ret i8 %r
118
+ }
119
+
120
+ define i8 @srem_high_bits_know2 (i8 %xx , i8 %yy ) {
121
+ ; CHECK-LABEL: @srem_high_bits_know2(
122
+ ; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], 13
123
+ ; CHECK-NEXT: [[Y:%.*]] = or i8 [[YY:%.*]], -4
124
+ ; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]]
125
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 8
126
+ ; CHECK-NEXT: ret i8 [[R]]
127
+ ;
128
+ %x = and i8 %xx , 13
129
+ %y = or i8 %yy , -4
130
+ %rem = srem i8 %x , %y
131
+ %r = and i8 %rem , 8
132
+ ret i8 %r
133
+ }
134
+
135
+ define i8 @srem_high_bits_know3 (i8 %xx , i8 %yy ) {
136
+ ; CHECK-LABEL: @srem_high_bits_know3(
137
+ ; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], -13
138
+ ; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], 4
139
+ ; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]]
140
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[REM]], 8
141
+ ; CHECK-NEXT: ret i8 [[R]]
142
+ ;
143
+ %x = or i8 %xx , -13
144
+ %y = and i8 %yy , 4
145
+ %rem = srem i8 %x , %y
146
+ %r = and i8 %rem , 8
147
+ ret i8 %r
148
+ }
149
+
150
+ define i8 @srem_high_bits_know4 (i8 %xx , i8 %yy ) {
151
+ ; CHECK-LABEL: @srem_high_bits_know4(
152
+ ; CHECK-NEXT: ret i8 0
153
+ ;
154
+ %x = and i8 %xx , 4
155
+ %y = or i8 %yy , -13
156
+ %rem = srem i8 %x , %y
157
+ %r = and i8 %rem , 8
158
+ ret i8 %r
159
+ }
160
+
161
+ define i8 @srem_high_bits_know5 (i8 %xx , i8 %yy ) {
162
+ ; CHECK-LABEL: @srem_high_bits_know5(
163
+ ; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], 2
164
+ ; CHECK-NEXT: ret i8 [[X]]
165
+ ;
166
+ %x = and i8 %xx , 2
167
+ %y = and i8 %yy , 4
168
+ %rem = srem i8 %x , %y
169
+ %r = and i8 %rem , 2
170
+ ret i8 %r
171
+ }
172
+
94
173
define i8 @srem_todo_low_bits_partially_know_should_fold_out_srem (i8 %xx , i8 %yy ) {
95
174
; CHECK-LABEL: @srem_todo_low_bits_partially_know_should_fold_out_srem(
96
175
; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 10
0 commit comments