@@ -219,3 +219,77 @@ define i1 @negative_test_fold_ashr(i8 %x) {
219
219
%trunc = trunc i8 %ashr to i1
220
220
ret i1 %trunc
221
221
}
222
+
223
+ define i1 @fold_lshr_negated_power_of_2 (i8 %x ) {
224
+ ; CHECK-LABEL: define i1 @fold_lshr_negated_power_of_2(
225
+ ; CHECK-SAME: i8 [[X:%.*]]) {
226
+ ; CHECK-NEXT: [[TRUNC:%.*]] = icmp ugt i8 [[X]], 3
227
+ ; CHECK-NEXT: ret i1 [[TRUNC]]
228
+ ;
229
+ %lshr = lshr i8 -16 , %x
230
+ %trunc = trunc i8 %lshr to i1
231
+ ret i1 %trunc
232
+ }
233
+
234
+ define i1 @fold_ashr_negated_power_of_2 (i8 %x ) {
235
+ ; CHECK-LABEL: define i1 @fold_ashr_negated_power_of_2(
236
+ ; CHECK-SAME: i8 [[X:%.*]]) {
237
+ ; CHECK-NEXT: [[TRUNC:%.*]] = icmp ugt i8 [[X]], 3
238
+ ; CHECK-NEXT: ret i1 [[TRUNC]]
239
+ ;
240
+ %ashr = ashr i8 -16 , %x
241
+ %trunc = trunc i8 %ashr to i1
242
+ ret i1 %trunc
243
+ }
244
+
245
+ define i1 @fold_lshr_negated_power_of_2_multi_use (i8 %x ) {
246
+ ; CHECK-LABEL: define i1 @fold_lshr_negated_power_of_2_multi_use(
247
+ ; CHECK-SAME: i8 [[X:%.*]]) {
248
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i8 -16, [[X]]
249
+ ; CHECK-NEXT: call void @use(i8 [[LSHR]])
250
+ ; CHECK-NEXT: [[TRUNC:%.*]] = icmp ugt i8 [[X]], 3
251
+ ; CHECK-NEXT: ret i1 [[TRUNC]]
252
+ ;
253
+ %lshr = lshr i8 -16 , %x
254
+ call void @use (i8 %lshr )
255
+ %trunc = trunc i8 %lshr to i1
256
+ ret i1 %trunc
257
+ }
258
+
259
+ define i1 @fold_ashr_negated_power_of_2_multi_use (i8 %x ) {
260
+ ; CHECK-LABEL: define i1 @fold_ashr_negated_power_of_2_multi_use(
261
+ ; CHECK-SAME: i8 [[X:%.*]]) {
262
+ ; CHECK-NEXT: [[ASHR:%.*]] = ashr i8 -16, [[X]]
263
+ ; CHECK-NEXT: call void @use(i8 [[ASHR]])
264
+ ; CHECK-NEXT: [[TRUNC:%.*]] = icmp ugt i8 [[X]], 3
265
+ ; CHECK-NEXT: ret i1 [[TRUNC]]
266
+ ;
267
+ %ashr = ashr i8 -16 , %x
268
+ call void @use (i8 %ashr )
269
+ %trunc = trunc i8 %ashr to i1
270
+ ret i1 %trunc
271
+ }
272
+
273
+ define i1 @negative_test_fold_lshr_negated_power_of_2 (i8 %x ) {
274
+ ; CHECK-LABEL: define i1 @negative_test_fold_lshr_negated_power_of_2(
275
+ ; CHECK-SAME: i8 [[X:%.*]]) {
276
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i8 -17, [[X]]
277
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[LSHR]] to i1
278
+ ; CHECK-NEXT: ret i1 [[TRUNC]]
279
+ ;
280
+ %lshr = lshr i8 -17 , %x
281
+ %trunc = trunc i8 %lshr to i1
282
+ ret i1 %trunc
283
+ }
284
+
285
+ define i1 @negative_test_fold_ashr_negated_power_of_2 (i8 %x ) {
286
+ ; CHECK-LABEL: define i1 @negative_test_fold_ashr_negated_power_of_2(
287
+ ; CHECK-SAME: i8 [[X:%.*]]) {
288
+ ; CHECK-NEXT: [[ASHR1:%.*]] = lshr i8 -17, [[X]]
289
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[ASHR1]] to i1
290
+ ; CHECK-NEXT: ret i1 [[TRUNC]]
291
+ ;
292
+ %ashr = ashr i8 -17 , %x
293
+ %trunc = trunc i8 %ashr to i1
294
+ ret i1 %trunc
295
+ }
0 commit comments