Skip to content

Commit 2a9b2f8

Browse files
committed
[InstCombine] Add test for shifts from or chains
1 parent 4d60c6d commit 2a9b2f8

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

llvm/test/Transforms/InstCombine/icmp-of-or-x.ll

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,3 +409,122 @@ define i1 @PR38139(i8 %arg) {
409409
%r = icmp ne i8 %masked, %arg
410410
ret i1 %r
411411
}
412+
413+
define i1 @remove_shift_nuw_ab(i8 %a, i8 %b, i8 %s) {
414+
; CHECK-LABEL: @remove_shift_nuw_ab(
415+
; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
416+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
417+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
418+
; CHECK-NEXT: ret i1 [[IC]]
419+
;
420+
%t = shl nuw i8 %a, %s
421+
%or = or i8 %t, %b
422+
%ic = icmp eq i8 %or, 0
423+
ret i1 %ic
424+
}
425+
426+
define i1 @remove_shift_nuw_ba(i8 %a, i8 %b, i8 %s) {
427+
; CHECK-LABEL: @remove_shift_nuw_ba(
428+
; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
429+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[B:%.*]], [[T]]
430+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
431+
; CHECK-NEXT: ret i1 [[IC]]
432+
;
433+
%t = shl nuw i8 %a, %s
434+
%or = or i8 %b, %t
435+
%ic = icmp eq i8 %or, 0
436+
ret i1 %ic
437+
}
438+
439+
define i1 @remove_shift_nsw(i8 %a, i8 %b, i8 %s) {
440+
; CHECK-LABEL: @remove_shift_nsw(
441+
; CHECK-NEXT: [[T:%.*]] = shl nsw i8 [[A:%.*]], [[S:%.*]]
442+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
443+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
444+
; CHECK-NEXT: ret i1 [[IC]]
445+
;
446+
%t = shl nsw i8 %a, %s
447+
%or = or i8 %t, %b
448+
%ic = icmp eq i8 %or, 0
449+
ret i1 %ic
450+
}
451+
452+
define i1 @remove_shift_nuw_ne(i8 %a, i8 %b, i8 %s) {
453+
; CHECK-LABEL: @remove_shift_nuw_ne(
454+
; CHECK-NEXT: [[T:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
455+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
456+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
457+
; CHECK-NEXT: ret i1 [[IC]]
458+
;
459+
%t = shl nuw i8 %a, %s
460+
%or = or i8 %t, %b
461+
%ic = icmp eq i8 %or, 0
462+
ret i1 %ic
463+
}
464+
465+
define i1 @remove_shift_nsw_ne(i8 %a, i8 %b, i8 %s) {
466+
; CHECK-LABEL: @remove_shift_nsw_ne(
467+
; CHECK-NEXT: [[T:%.*]] = shl nsw i8 [[A:%.*]], [[S:%.*]]
468+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
469+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
470+
; CHECK-NEXT: ret i1 [[IC]]
471+
;
472+
%t = shl nsw i8 %a, %s
473+
%or = or i8 %t, %b
474+
%ic = icmp eq i8 %or, 0
475+
ret i1 %ic
476+
}
477+
478+
define i1 @remove_shift_wraps(i8 %a, i8 %b, i8 %s) {
479+
; CHECK-LABEL: @remove_shift_wraps(
480+
; CHECK-NEXT: [[T:%.*]] = shl i8 [[A:%.*]], [[S:%.*]]
481+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]
482+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
483+
; CHECK-NEXT: ret i1 [[IC]]
484+
;
485+
%t = shl i8 %a, %s
486+
%or = or i8 %t, %b
487+
%ic = icmp eq i8 %or, 0
488+
ret i1 %ic
489+
}
490+
491+
define i1 @remove_shift_chain_d(i8 %a, i8 %b, i8 %c, i8 %d, i8 %s) {
492+
; CHECK-LABEL: @remove_shift_chain_d(
493+
; CHECK-NEXT: [[DT:%.*]] = shl nuw i8 [[D:%.*]], [[S:%.*]]
494+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[A:%.*]], [[B:%.*]]
495+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[C:%.*]], [[DT]]
496+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]
497+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
498+
; CHECK-NEXT: ret i1 [[IC]]
499+
;
500+
%dt = shl nuw i8 %d, %s
501+
%or1 = or i8 %a, %b
502+
%or2 = or i8 %c, %dt
503+
%or = or i8 %or1, %or2
504+
%ic = icmp eq i8 %or, 0
505+
ret i1 %ic
506+
}
507+
508+
define i1 @remove_shift_chain_abcd(i8 %a, i8 %b, i8 %c, i8 %d, i8 %s) {
509+
; CHECK-LABEL: @remove_shift_chain_abcd(
510+
; CHECK-NEXT: [[AT:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]
511+
; CHECK-NEXT: [[BT:%.*]] = shl nuw i8 [[B:%.*]], 2
512+
; CHECK-NEXT: [[CT:%.*]] = shl nuw i8 [[C:%.*]], 1
513+
; CHECK-NEXT: [[DT:%.*]] = shl nuw i8 [[D:%.*]], [[S]]
514+
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AT]], [[BT]]
515+
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[DT]]
516+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]
517+
; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0
518+
; CHECK-NEXT: ret i1 [[IC]]
519+
;
520+
%at = shl nuw i8 %a, %s
521+
%bt = shl nuw i8 %b, 2
522+
%ct = shl nuw i8 %c, 1
523+
%dt = shl nuw i8 %d, %s
524+
%or1 = or i8 %at, %bt
525+
%or2 = or i8 %ct, %dt
526+
%or = or i8 %or1, %or2
527+
%ic = icmp eq i8 %or, 0
528+
ret i1 %ic
529+
}
530+

0 commit comments

Comments
 (0)