138 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=aggressive-instcombine -S | FileCheck %s3 4define i1 @remove_shift_nuw_ab(i8 %a, i8 %b, i8 %s) {5; CHECK-LABEL: @remove_shift_nuw_ab(6; CHECK-NEXT: [[OR:%.*]] = or i8 [[T:%.*]], [[B:%.*]]7; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 08; CHECK-NEXT: ret i1 [[IC]]9;10 %t = shl nuw i8 %a, %s11 %or = or i8 %t, %b12 %ic = icmp eq i8 %or, 013 ret i1 %ic14}15 16define i1 @remove_shift_nuw_ba(i8 %a, i8 %b, i8 %s) {17; CHECK-LABEL: @remove_shift_nuw_ba(18; CHECK-NEXT: [[OR:%.*]] = or i8 [[B:%.*]], [[T:%.*]]19; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 020; CHECK-NEXT: ret i1 [[IC]]21;22 %t = shl nuw i8 %a, %s23 %or = or i8 %b, %t24 %ic = icmp eq i8 %or, 025 ret i1 %ic26}27 28define i1 @remove_shift_nsw(i8 %a, i8 %b, i8 %s) {29; CHECK-LABEL: @remove_shift_nsw(30; CHECK-NEXT: [[OR:%.*]] = or i8 [[T:%.*]], [[B:%.*]]31; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 032; CHECK-NEXT: ret i1 [[IC]]33;34 %t = shl nsw i8 %a, %s35 %or = or i8 %t, %b36 %ic = icmp eq i8 %or, 037 ret i1 %ic38}39 40define i1 @remove_shift_nuw_ne(i8 %a, i8 %b, i8 %s) {41; CHECK-LABEL: @remove_shift_nuw_ne(42; CHECK-NEXT: [[OR:%.*]] = or i8 [[T:%.*]], [[B:%.*]]43; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 044; CHECK-NEXT: ret i1 [[IC]]45;46 %t = shl nuw i8 %a, %s47 %or = or i8 %t, %b48 %ic = icmp eq i8 %or, 049 ret i1 %ic50}51 52define i1 @remove_shift_nsw_ne(i8 %a, i8 %b, i8 %s) {53; CHECK-LABEL: @remove_shift_nsw_ne(54; CHECK-NEXT: [[OR:%.*]] = or i8 [[T:%.*]], [[B:%.*]]55; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 056; CHECK-NEXT: ret i1 [[IC]]57;58 %t = shl nsw i8 %a, %s59 %or = or i8 %t, %b60 %ic = icmp eq i8 %or, 061 ret i1 %ic62}63 64define i1 @remove_shift_wraps(i8 %a, i8 %b, i8 %s) {65; CHECK-LABEL: @remove_shift_wraps(66; CHECK-NEXT: [[T:%.*]] = shl i8 [[A:%.*]], [[S:%.*]]67; CHECK-NEXT: [[OR:%.*]] = or i8 [[T]], [[B:%.*]]68; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 069; CHECK-NEXT: ret i1 [[IC]]70;71 %t = shl i8 %a, %s72 %or = or i8 %t, %b73 %ic = icmp eq i8 %or, 074 ret i1 %ic75}76 77define i1 @remove_shift_chain_d(i8 %a, i8 %b, i8 %c, i8 %d, i8 %s) {78; CHECK-LABEL: @remove_shift_chain_d(79; CHECK-NEXT: [[OR1:%.*]] = or i8 [[A:%.*]], [[B:%.*]]80; CHECK-NEXT: [[OR2:%.*]] = or i8 [[C:%.*]], [[DT:%.*]]81; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]82; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 083; CHECK-NEXT: ret i1 [[IC]]84;85 %dt = shl nuw i8 %d, %s86 %or1 = or i8 %a, %b87 %or2 = or i8 %c, %dt88 %or = or i8 %or1, %or289 %ic = icmp eq i8 %or, 090 ret i1 %ic91}92 93define i1 @remove_shift_chain_abcd(i8 %a, i8 %b, i8 %c, i8 %d, i8 %s) {94; CHECK-LABEL: @remove_shift_chain_abcd(95; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AT:%.*]], [[BT:%.*]]96; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT:%.*]], [[DT:%.*]]97; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]98; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 099; CHECK-NEXT: ret i1 [[IC]]100;101 %at = shl nuw i8 %a, %s102 %bt = shl nuw i8 %b, 2103 %ct = shl nuw i8 %c, 1104 %dt = shl nuw i8 %d, %s105 %or1 = or i8 %at, %bt106 %or2 = or i8 %ct, %dt107 %or = or i8 %or1, %or2108 %ic = icmp eq i8 %or, 0109 ret i1 %ic110}111 112define i1 @remove_shift_chain_abcd_multiuse(i8 %a, i8 %b, i8 %c, i8 %d, i8 %s) {113; CHECK-LABEL: @remove_shift_chain_abcd_multiuse(114; CHECK-NEXT: [[AT:%.*]] = shl nuw i8 [[A:%.*]], [[S:%.*]]115; CHECK-NEXT: [[BT:%.*]] = shl nuw i8 [[B:%.*]], 2116; CHECK-NEXT: [[CT:%.*]] = shl nuw i8 [[C:%.*]], 1117; CHECK-NEXT: [[DT:%.*]] = shl nuw i8 [[D:%.*]], [[S]]118; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AT]], [[BT]]119; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[DT]]120; CHECK-NEXT: [[OR:%.*]] = or i8 [[OR1]], [[OR2]]121; CHECK-NEXT: [[IC:%.*]] = icmp eq i8 [[OR]], 0122; CHECK-NEXT: call void @use(i8 [[OR]])123; CHECK-NEXT: ret i1 [[IC]]124;125 %at = shl nuw i8 %a, %s126 %bt = shl nuw i8 %b, 2127 %ct = shl nuw i8 %c, 1128 %dt = shl nuw i8 %d, %s129 %or1 = or i8 %at, %bt130 %or2 = or i8 %ct, %dt131 %or = or i8 %or1, %or2132 %ic = icmp eq i8 %or, 0133 call void @use(i8 %or)134 ret i1 %ic135}136 137declare void @use(i8)138