224 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=aggressive-instcombine -S | FileCheck %s3 4define i8 @leaf1_and_aa(i8 %a) {5; CHECK-LABEL: @leaf1_and_aa(6; CHECK-NEXT: [[AND_AA:%.*]] = and i8 [[A:%.*]], [[A]]7; CHECK-NEXT: ret i8 [[AND_AA]]8;9 %and.aa = and i8 %a, %a10 ret i8 %and.aa11}12 13define i8 @leaf1_and_a_false(i8 %a) {14; CHECK-LABEL: @leaf1_and_a_false(15; CHECK-NEXT: [[AND_AA:%.*]] = and i8 [[A:%.*]], 016; CHECK-NEXT: ret i8 [[AND_AA]]17;18 %and.aa = and i8 %a, 019 ret i8 %and.aa20}21 22define i8 @leaf1_xor_aa(i8 %a) {23; CHECK-LABEL: @leaf1_xor_aa(24; CHECK-NEXT: [[XOR_AA:%.*]] = xor i8 [[A:%.*]], [[A]]25; CHECK-NEXT: ret i8 [[XOR_AA]]26;27 %xor.aa = xor i8 %a, %a28 ret i8 %xor.aa29}30 31define i8 @leaf1_and_not(i8 %a) {32; CHECK-LABEL: @leaf1_and_not(33; CHECK-NEXT: [[NOT_A:%.*]] = xor i8 [[A:%.*]], -134; CHECK-NEXT: [[AND:%.*]] = and i8 [[A]], [[NOT_A]]35; CHECK-NEXT: ret i8 [[AND]]36;37 %not.a = xor i8 %a, -138 %and = and i8 %a, %not.a39 ret i8 %and40}41 42define i8 @leaf1_or_not(i8 %a) {43; CHECK-LABEL: @leaf1_or_not(44; CHECK-NEXT: [[NOT_A:%.*]] = xor i8 [[A:%.*]], -145; CHECK-NEXT: [[OR:%.*]] = or i8 [[A]], [[NOT_A]]46; CHECK-NEXT: ret i8 [[OR]]47;48 %not.a = xor i8 %a, -149 %or = or i8 %a, %not.a50 ret i8 %or51}52 53define i8 @leaf2_xor(i8 %a, i8 %b) {54; CHECK-LABEL: @leaf2_xor(55; CHECK-NEXT: [[AB:%.*]] = xor i8 [[A:%.*]], [[B:%.*]]56; CHECK-NEXT: [[XOR_AB_A:%.*]] = xor i8 [[AB]], [[A]]57; CHECK-NEXT: ret i8 [[XOR_AB_A]]58;59 %ab = xor i8 %a, %b60 %xor.ab.a = xor i8 %ab, %a61 ret i8 %xor.ab.a62}63 64define i8 @leaf2_xor_ret_const_false(i8 %a, i8 %b) {65; CHECK-LABEL: @leaf2_xor_ret_const_false(66; CHECK-NEXT: [[XOR_AB:%.*]] = xor i8 [[A:%.*]], [[B:%.*]]67; CHECK-NEXT: [[XOR_AB_A:%.*]] = xor i8 [[XOR_AB]], [[A]]68; CHECK-NEXT: [[XOR_AB_A_B:%.*]] = xor i8 [[XOR_AB_A]], [[B]]69; CHECK-NEXT: ret i8 [[XOR_AB_A_B]]70;71 %xor.ab = xor i8 %a, %b72 %xor.ab.a = xor i8 %xor.ab, %a73 %xor.ab.a.b = xor i8 %xor.ab.a, %b74 ret i8 %xor.ab.a.b75}76 77define i8 @leaf2_or_ret_leaf(i8 %a, i8 %b) {78; CHECK-LABEL: @leaf2_or_ret_leaf(79; CHECK-NEXT: [[OR_AB:%.*]] = or i8 [[A:%.*]], [[B:%.*]]80; CHECK-NEXT: [[AND_AB:%.*]] = and i8 [[A]], [[B]]81; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[OR_AB]], [[AND_AB]]82; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[XOR1]], [[A]]83; CHECK-NEXT: ret i8 [[XOR2]]84;85 %or.ab = or i8 %a, %b86 %and.ab = and i8 %a, %b87 %xor1 = xor i8 %or.ab, %and.ab88 %xor2 = xor i8 %xor1, %a89 ret i8 %xor290}91 92define i8 @leaf2_or_ret_const_false(i8 %a, i8 %b) {93; CHECK-LABEL: @leaf2_or_ret_const_false(94; CHECK-NEXT: [[OR_AB:%.*]] = or i8 [[A:%.*]], [[B:%.*]]95; CHECK-NEXT: [[AND_AB:%.*]] = and i8 [[A]], [[B]]96; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[OR_AB]], [[AND_AB]]97; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[XOR1]], [[A]]98; CHECK-NEXT: [[XOR3:%.*]] = xor i8 [[XOR1]], [[B]]99; CHECK-NEXT: ret i8 [[XOR3]]100;101 %or.ab = or i8 %a, %b102 %and.ab = and i8 %a, %b103 %xor1 = xor i8 %or.ab, %and.ab104 %xor2 = xor i8 %xor1, %a105 %xor3 = xor i8 %xor1, %b106 ret i8 %xor3107}108 109define i1 @leaf2_type_is_i1(i1 %a, i1 %b) {110; CHECK-LABEL: @leaf2_type_is_i1(111; CHECK-NEXT: [[XOR_AB:%.*]] = xor i1 [[A:%.*]], [[B:%.*]]112; CHECK-NEXT: [[NOT_A:%.*]] = xor i1 [[A]], true113; CHECK-NEXT: [[XOR2:%.*]] = xor i1 [[NOT_A]], [[B]]114; CHECK-NEXT: [[OR:%.*]] = or i1 [[XOR2]], [[XOR_AB]]115; CHECK-NEXT: ret i1 [[OR]]116;117 %xor.ab = xor i1 %a, %b118 %not.a = xor i1 %a, true119 %xor2 = xor i1 %not.a, %b120 %or = or i1 %xor2, %xor.ab121 ret i1 %or122}123 124define i8 @leaf3_complex_ret_const_false(i8 %a, i8 %b, i8 %c) {125; CHECK-LABEL: @leaf3_complex_ret_const_false(126; CHECK-NEXT: [[AB:%.*]] = or i8 [[A:%.*]], [[B:%.*]]127; CHECK-NEXT: [[ABC:%.*]] = or i8 [[AB]], [[C:%.*]]128; CHECK-NEXT: [[NOT_ABC:%.*]] = xor i8 [[ABC]], -1129; CHECK-NEXT: [[R:%.*]] = and i8 [[NOT_ABC]], [[A]]130; CHECK-NEXT: ret i8 [[R]]131;132 %ab = or i8 %a, %b133 %abc = or i8 %ab, %c134 %not.abc = xor i8 %abc, -1135 %r = and i8 %not.abc, %a136 ret i8 %r137}138 139define i8 @leaf3_complex_ret_leaf(i8 %a, i8 %b, i8 %c) {140; CHECK-LABEL: @leaf3_complex_ret_leaf(141; CHECK-NEXT: [[AB:%.*]] = and i8 [[A:%.*]], [[B:%.*]]142; CHECK-NEXT: [[BC:%.*]] = and i8 [[B]], [[C:%.*]]143; CHECK-NEXT: [[XOR_AC:%.*]] = xor i8 [[A]], [[C]]144; CHECK-NEXT: [[OR:%.*]] = or i8 [[AB]], [[XOR_AC]]145; CHECK-NEXT: [[NOT_BC:%.*]] = xor i8 [[BC]], -1146; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_BC]], [[A]]147; CHECK-NEXT: [[COND:%.*]] = xor i8 [[AND]], [[OR]]148; CHECK-NEXT: ret i8 [[COND]]149;150 %ab = and i8 %a, %b151 %bc = and i8 %b, %c152 %xor.ac = xor i8 %a, %c153 %or = or i8 %ab, %xor.ac154 %not.bc = xor i8 %bc, -1155 %and = and i8 %not.bc, %a156 %cond = xor i8 %and, %or157 ret i8 %cond158}159 160define i8 @leaf4_ret_const_true(i8 %a, i8 %b, i8 %c, i8 %d) {161; CHECK-LABEL: @leaf4_ret_const_true(162; CHECK-NEXT: [[BD:%.*]] = and i8 [[B:%.*]], [[D:%.*]]163; CHECK-NEXT: [[NOT_BD:%.*]] = xor i8 [[BD]], -1164; CHECK-NEXT: [[XOR_AB:%.*]] = xor i8 [[A:%.*]], [[B]]165; CHECK-NEXT: [[OR1:%.*]] = or i8 [[XOR_AB]], [[C:%.*]]166; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[NOT_BD]]167; CHECK-NEXT: [[OR3:%.*]] = or i8 [[OR2]], [[A]]168; CHECK-NEXT: ret i8 [[OR3]]169;170 %bd = and i8 %b, %d171 %not.bd = xor i8 %bd, -1172 %xor.ab = xor i8 %a, %b173 %or1 = or i8 %xor.ab, %c174 %or2 = or i8 %or1, %not.bd175 %or3 = or i8 %or2, %a176 ret i8 %or3177}178 179define i8 @leaf4_ret_leaf(i8 %a, i8 %b, i8 %c, i8 %d) {180; CHECK-LABEL: @leaf4_ret_leaf(181; CHECK-NEXT: [[BD:%.*]] = and i8 [[B:%.*]], [[D:%.*]]182; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[BD]], [[C:%.*]]183; CHECK-NEXT: [[NOT_BD:%.*]] = xor i8 [[XOR]], -1184; CHECK-NEXT: [[XOR_AB:%.*]] = xor i8 [[A:%.*]], [[B]]185; CHECK-NEXT: [[OR1:%.*]] = or i8 [[XOR_AB]], [[C]]186; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[NOT_BD]]187; CHECK-NEXT: [[OR3:%.*]] = or i8 [[OR2]], [[A]]188; CHECK-NEXT: [[AND:%.*]] = and i8 [[OR3]], [[B]]189; CHECK-NEXT: ret i8 [[AND]]190;191 %bd = and i8 %b, %d192 %xor = xor i8 %bd, %c193 %not.bd = xor i8 %xor, -1194 %xor.ab = xor i8 %a, %b195 %or1 = or i8 %xor.ab, %c196 %or2 = or i8 %or1, %not.bd197 %or3 = or i8 %or2, %a198 %and = and i8 %or3, %b199 ret i8 %and200}201 202define i8 @leaf4_ret_leaf2(i8 %a, i8 %b, i8 %c, i8 %d) {203; CHECK-LABEL: @leaf4_ret_leaf2(204; CHECK-NEXT: [[BD:%.*]] = and i8 [[B:%.*]], [[D:%.*]]205; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[BD]], [[C:%.*]]206; CHECK-NEXT: [[NOT_BD:%.*]] = xor i8 [[XOR]], -1207; CHECK-NEXT: [[XOR_AB:%.*]] = xor i8 [[A:%.*]], [[B]]208; CHECK-NEXT: [[OR1:%.*]] = or i8 [[XOR_AB]], [[C]]209; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[NOT_BD]]210; CHECK-NEXT: [[OR3:%.*]] = or i8 [[OR2]], [[A]]211; CHECK-NEXT: [[AND:%.*]] = and i8 [[OR3]], [[B]]212; CHECK-NEXT: ret i8 [[AND]]213;214 %bd = and i8 %b, %d215 %xor = xor i8 %bd, %c216 %not.bd = xor i8 %xor, -1217 %xor.ab = xor i8 %a, %b218 %or1 = or i8 %xor.ab, %c219 %or2 = or i8 %or1, %not.bd220 %or3 = or i8 %or2, %a221 %and = and i8 %or3, %b222 ret i8 %and223}224