10c3411bbSchenglin.bi; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*76df706bSchenglin.bi; RUN: opt < %s -passes=aggressive-instcombine -S | FileCheck %s 30c3411bbSchenglin.bi 40c3411bbSchenglin.bidefine i8 @leaf1_and_aa(i8 %a) { 50c3411bbSchenglin.bi; CHECK-LABEL: @leaf1_and_aa( 6*76df706bSchenglin.bi; CHECK-NEXT: [[AND_AA:%.*]] = and i8 [[A:%.*]], [[A]] 7*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[AND_AA]] 80c3411bbSchenglin.bi; 90c3411bbSchenglin.bi %and.aa = and i8 %a, %a 100c3411bbSchenglin.bi ret i8 %and.aa 110c3411bbSchenglin.bi} 120c3411bbSchenglin.bi 130c3411bbSchenglin.bidefine i8 @leaf1_and_a_false(i8 %a) { 140c3411bbSchenglin.bi; CHECK-LABEL: @leaf1_and_a_false( 15*76df706bSchenglin.bi; CHECK-NEXT: [[AND_AA:%.*]] = and i8 [[A:%.*]], 0 16*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[AND_AA]] 170c3411bbSchenglin.bi; 180c3411bbSchenglin.bi %and.aa = and i8 %a, 0 190c3411bbSchenglin.bi ret i8 %and.aa 200c3411bbSchenglin.bi} 210c3411bbSchenglin.bi 220c3411bbSchenglin.bidefine i8 @leaf1_xor_aa(i8 %a) { 230c3411bbSchenglin.bi; CHECK-LABEL: @leaf1_xor_aa( 24*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AA:%.*]] = xor i8 [[A:%.*]], [[A]] 25*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[XOR_AA]] 260c3411bbSchenglin.bi; 270c3411bbSchenglin.bi %xor.aa = xor i8 %a, %a 280c3411bbSchenglin.bi ret i8 %xor.aa 290c3411bbSchenglin.bi} 300c3411bbSchenglin.bi 310c3411bbSchenglin.bidefine i8 @leaf1_and_not(i8 %a) { 320c3411bbSchenglin.bi; CHECK-LABEL: @leaf1_and_not( 33*76df706bSchenglin.bi; CHECK-NEXT: [[NOT_A:%.*]] = xor i8 [[A:%.*]], -1 34*76df706bSchenglin.bi; CHECK-NEXT: [[AND:%.*]] = and i8 [[A]], [[NOT_A]] 35*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[AND]] 360c3411bbSchenglin.bi; 370c3411bbSchenglin.bi %not.a = xor i8 %a, -1 380c3411bbSchenglin.bi %and = and i8 %a, %not.a 390c3411bbSchenglin.bi ret i8 %and 400c3411bbSchenglin.bi} 410c3411bbSchenglin.bi 420c3411bbSchenglin.bidefine i8 @leaf1_or_not(i8 %a) { 430c3411bbSchenglin.bi; CHECK-LABEL: @leaf1_or_not( 44*76df706bSchenglin.bi; CHECK-NEXT: [[NOT_A:%.*]] = xor i8 [[A:%.*]], -1 45*76df706bSchenglin.bi; CHECK-NEXT: [[OR:%.*]] = or i8 [[A]], [[NOT_A]] 46*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[OR]] 470c3411bbSchenglin.bi; 480c3411bbSchenglin.bi %not.a = xor i8 %a, -1 490c3411bbSchenglin.bi %or = or i8 %a, %not.a 500c3411bbSchenglin.bi ret i8 %or 510c3411bbSchenglin.bi} 520c3411bbSchenglin.bi 530c3411bbSchenglin.bidefine i8 @leaf2_xor(i8 %a, i8 %b) { 540c3411bbSchenglin.bi; CHECK-LABEL: @leaf2_xor( 55*76df706bSchenglin.bi; CHECK-NEXT: [[AB:%.*]] = xor i8 [[A:%.*]], [[B:%.*]] 56*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AB_A:%.*]] = xor i8 [[AB]], [[A]] 57*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[XOR_AB_A]] 580c3411bbSchenglin.bi; 590c3411bbSchenglin.bi %ab = xor i8 %a, %b 600c3411bbSchenglin.bi %xor.ab.a = xor i8 %ab, %a 610c3411bbSchenglin.bi ret i8 %xor.ab.a 620c3411bbSchenglin.bi} 630c3411bbSchenglin.bi 640c3411bbSchenglin.bidefine i8 @leaf2_xor_ret_const_false(i8 %a, i8 %b) { 650c3411bbSchenglin.bi; CHECK-LABEL: @leaf2_xor_ret_const_false( 66*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AB:%.*]] = xor i8 [[A:%.*]], [[B:%.*]] 67*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AB_A:%.*]] = xor i8 [[XOR_AB]], [[A]] 68*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AB_A_B:%.*]] = xor i8 [[XOR_AB_A]], [[B]] 69*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[XOR_AB_A_B]] 700c3411bbSchenglin.bi; 710c3411bbSchenglin.bi %xor.ab = xor i8 %a, %b 720c3411bbSchenglin.bi %xor.ab.a = xor i8 %xor.ab, %a 730c3411bbSchenglin.bi %xor.ab.a.b = xor i8 %xor.ab.a, %b 740c3411bbSchenglin.bi ret i8 %xor.ab.a.b 750c3411bbSchenglin.bi} 760c3411bbSchenglin.bi 770c3411bbSchenglin.bidefine i8 @leaf2_or_ret_leaf(i8 %a, i8 %b) { 780c3411bbSchenglin.bi; CHECK-LABEL: @leaf2_or_ret_leaf( 79*76df706bSchenglin.bi; CHECK-NEXT: [[OR_AB:%.*]] = or i8 [[A:%.*]], [[B:%.*]] 80*76df706bSchenglin.bi; CHECK-NEXT: [[AND_AB:%.*]] = and i8 [[A]], [[B]] 81*76df706bSchenglin.bi; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[OR_AB]], [[AND_AB]] 82*76df706bSchenglin.bi; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[XOR1]], [[A]] 83*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[XOR2]] 840c3411bbSchenglin.bi; 850c3411bbSchenglin.bi %or.ab = or i8 %a, %b 860c3411bbSchenglin.bi %and.ab = and i8 %a, %b 870c3411bbSchenglin.bi %xor1 = xor i8 %or.ab, %and.ab 880c3411bbSchenglin.bi %xor2 = xor i8 %xor1, %a 890c3411bbSchenglin.bi ret i8 %xor2 900c3411bbSchenglin.bi} 910c3411bbSchenglin.bi 920c3411bbSchenglin.bidefine i8 @leaf2_or_ret_const_false(i8 %a, i8 %b) { 930c3411bbSchenglin.bi; CHECK-LABEL: @leaf2_or_ret_const_false( 94*76df706bSchenglin.bi; CHECK-NEXT: [[OR_AB:%.*]] = or i8 [[A:%.*]], [[B:%.*]] 95*76df706bSchenglin.bi; CHECK-NEXT: [[AND_AB:%.*]] = and i8 [[A]], [[B]] 96*76df706bSchenglin.bi; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[OR_AB]], [[AND_AB]] 97*76df706bSchenglin.bi; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[XOR1]], [[A]] 98*76df706bSchenglin.bi; CHECK-NEXT: [[XOR3:%.*]] = xor i8 [[XOR1]], [[B]] 99*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[XOR3]] 1000c3411bbSchenglin.bi; 1010c3411bbSchenglin.bi %or.ab = or i8 %a, %b 1020c3411bbSchenglin.bi %and.ab = and i8 %a, %b 1030c3411bbSchenglin.bi %xor1 = xor i8 %or.ab, %and.ab 1040c3411bbSchenglin.bi %xor2 = xor i8 %xor1, %a 105*76df706bSchenglin.bi %xor3 = xor i8 %xor1, %b 1060c3411bbSchenglin.bi ret i8 %xor3 1070c3411bbSchenglin.bi} 1080c3411bbSchenglin.bi 1090c3411bbSchenglin.bidefine i1 @leaf2_type_is_i1(i1 %a, i1 %b) { 1100c3411bbSchenglin.bi; CHECK-LABEL: @leaf2_type_is_i1( 111*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AB:%.*]] = xor i1 [[A:%.*]], [[B:%.*]] 112*76df706bSchenglin.bi; CHECK-NEXT: [[NOT_A:%.*]] = xor i1 [[A]], true 113*76df706bSchenglin.bi; CHECK-NEXT: [[XOR2:%.*]] = xor i1 [[NOT_A]], [[B]] 114*76df706bSchenglin.bi; CHECK-NEXT: [[OR:%.*]] = or i1 [[XOR2]], [[XOR_AB]] 115*76df706bSchenglin.bi; CHECK-NEXT: ret i1 [[OR]] 1160c3411bbSchenglin.bi; 1170c3411bbSchenglin.bi %xor.ab = xor i1 %a, %b 1180c3411bbSchenglin.bi %not.a = xor i1 %a, true 1190c3411bbSchenglin.bi %xor2 = xor i1 %not.a, %b 1200c3411bbSchenglin.bi %or = or i1 %xor2, %xor.ab 1210c3411bbSchenglin.bi ret i1 %or 1220c3411bbSchenglin.bi} 1230c3411bbSchenglin.bi 1240c3411bbSchenglin.bidefine i8 @leaf3_complex_ret_const_false(i8 %a, i8 %b, i8 %c) { 1250c3411bbSchenglin.bi; CHECK-LABEL: @leaf3_complex_ret_const_false( 126*76df706bSchenglin.bi; CHECK-NEXT: [[AB:%.*]] = or i8 [[A:%.*]], [[B:%.*]] 127*76df706bSchenglin.bi; CHECK-NEXT: [[ABC:%.*]] = or i8 [[AB]], [[C:%.*]] 128*76df706bSchenglin.bi; CHECK-NEXT: [[NOT_ABC:%.*]] = xor i8 [[ABC]], -1 129*76df706bSchenglin.bi; CHECK-NEXT: [[R:%.*]] = and i8 [[NOT_ABC]], [[A]] 130*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[R]] 1310c3411bbSchenglin.bi; 1320c3411bbSchenglin.bi %ab = or i8 %a, %b 1330c3411bbSchenglin.bi %abc = or i8 %ab, %c 1340c3411bbSchenglin.bi %not.abc = xor i8 %abc, -1 1350c3411bbSchenglin.bi %r = and i8 %not.abc, %a 1360c3411bbSchenglin.bi ret i8 %r 1370c3411bbSchenglin.bi} 1380c3411bbSchenglin.bi 1390c3411bbSchenglin.bidefine i8 @leaf3_complex_ret_leaf(i8 %a, i8 %b, i8 %c) { 1400c3411bbSchenglin.bi; CHECK-LABEL: @leaf3_complex_ret_leaf( 141*76df706bSchenglin.bi; CHECK-NEXT: [[AB:%.*]] = and i8 [[A:%.*]], [[B:%.*]] 142*76df706bSchenglin.bi; CHECK-NEXT: [[BC:%.*]] = and i8 [[B]], [[C:%.*]] 143*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AC:%.*]] = xor i8 [[A]], [[C]] 144*76df706bSchenglin.bi; CHECK-NEXT: [[OR:%.*]] = or i8 [[AB]], [[XOR_AC]] 145*76df706bSchenglin.bi; CHECK-NEXT: [[NOT_BC:%.*]] = xor i8 [[BC]], -1 146*76df706bSchenglin.bi; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_BC]], [[A]] 147*76df706bSchenglin.bi; CHECK-NEXT: [[COND:%.*]] = xor i8 [[AND]], [[OR]] 148*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[COND]] 1490c3411bbSchenglin.bi; 1500c3411bbSchenglin.bi %ab = and i8 %a, %b 1510c3411bbSchenglin.bi %bc = and i8 %b, %c 1520c3411bbSchenglin.bi %xor.ac = xor i8 %a, %c 1530c3411bbSchenglin.bi %or = or i8 %ab, %xor.ac 1540c3411bbSchenglin.bi %not.bc = xor i8 %bc, -1 1550c3411bbSchenglin.bi %and = and i8 %not.bc, %a 1560c3411bbSchenglin.bi %cond = xor i8 %and, %or 1570c3411bbSchenglin.bi ret i8 %cond 1580c3411bbSchenglin.bi} 1590c3411bbSchenglin.bi 1600c3411bbSchenglin.bidefine i8 @leaf4_ret_const_true(i8 %a, i8 %b, i8 %c, i8 %d) { 1610c3411bbSchenglin.bi; CHECK-LABEL: @leaf4_ret_const_true( 162*76df706bSchenglin.bi; CHECK-NEXT: [[BD:%.*]] = and i8 [[B:%.*]], [[D:%.*]] 163*76df706bSchenglin.bi; CHECK-NEXT: [[NOT_BD:%.*]] = xor i8 [[BD]], -1 164*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AB:%.*]] = xor i8 [[A:%.*]], [[B]] 165*76df706bSchenglin.bi; CHECK-NEXT: [[OR1:%.*]] = or i8 [[XOR_AB]], [[C:%.*]] 166*76df706bSchenglin.bi; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[NOT_BD]] 167*76df706bSchenglin.bi; CHECK-NEXT: [[OR3:%.*]] = or i8 [[OR2]], [[A]] 168*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[OR3]] 1690c3411bbSchenglin.bi; 1700c3411bbSchenglin.bi %bd = and i8 %b, %d 1710c3411bbSchenglin.bi %not.bd = xor i8 %bd, -1 1720c3411bbSchenglin.bi %xor.ab = xor i8 %a, %b 1730c3411bbSchenglin.bi %or1 = or i8 %xor.ab, %c 1740c3411bbSchenglin.bi %or2 = or i8 %or1, %not.bd 1750c3411bbSchenglin.bi %or3 = or i8 %or2, %a 1760c3411bbSchenglin.bi ret i8 %or3 1770c3411bbSchenglin.bi} 1780c3411bbSchenglin.bi 1790c3411bbSchenglin.bidefine i8 @leaf4_ret_leaf(i8 %a, i8 %b, i8 %c, i8 %d) { 1800c3411bbSchenglin.bi; CHECK-LABEL: @leaf4_ret_leaf( 181*76df706bSchenglin.bi; CHECK-NEXT: [[BD:%.*]] = and i8 [[B:%.*]], [[D:%.*]] 182*76df706bSchenglin.bi; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[BD]], [[C:%.*]] 183*76df706bSchenglin.bi; CHECK-NEXT: [[NOT_BD:%.*]] = xor i8 [[XOR]], -1 184*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AB:%.*]] = xor i8 [[A:%.*]], [[B]] 185*76df706bSchenglin.bi; CHECK-NEXT: [[OR1:%.*]] = or i8 [[XOR_AB]], [[C]] 186*76df706bSchenglin.bi; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[NOT_BD]] 187*76df706bSchenglin.bi; CHECK-NEXT: [[OR3:%.*]] = or i8 [[OR2]], [[A]] 188*76df706bSchenglin.bi; CHECK-NEXT: [[AND:%.*]] = and i8 [[OR3]], [[B]] 189*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[AND]] 1900c3411bbSchenglin.bi; 1910c3411bbSchenglin.bi %bd = and i8 %b, %d 1920c3411bbSchenglin.bi %xor = xor i8 %bd, %c 1930c3411bbSchenglin.bi %not.bd = xor i8 %xor, -1 1940c3411bbSchenglin.bi %xor.ab = xor i8 %a, %b 1950c3411bbSchenglin.bi %or1 = or i8 %xor.ab, %c 1960c3411bbSchenglin.bi %or2 = or i8 %or1, %not.bd 1970c3411bbSchenglin.bi %or3 = or i8 %or2, %a 1980c3411bbSchenglin.bi %and = and i8 %or3, %b 1990c3411bbSchenglin.bi ret i8 %and 2000c3411bbSchenglin.bi} 2010c3411bbSchenglin.bi 2020c3411bbSchenglin.bidefine i8 @leaf4_ret_leaf2(i8 %a, i8 %b, i8 %c, i8 %d) { 2030c3411bbSchenglin.bi; CHECK-LABEL: @leaf4_ret_leaf2( 204*76df706bSchenglin.bi; CHECK-NEXT: [[BD:%.*]] = and i8 [[B:%.*]], [[D:%.*]] 205*76df706bSchenglin.bi; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[BD]], [[C:%.*]] 206*76df706bSchenglin.bi; CHECK-NEXT: [[NOT_BD:%.*]] = xor i8 [[XOR]], -1 207*76df706bSchenglin.bi; CHECK-NEXT: [[XOR_AB:%.*]] = xor i8 [[A:%.*]], [[B]] 208*76df706bSchenglin.bi; CHECK-NEXT: [[OR1:%.*]] = or i8 [[XOR_AB]], [[C]] 209*76df706bSchenglin.bi; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[NOT_BD]] 210*76df706bSchenglin.bi; CHECK-NEXT: [[OR3:%.*]] = or i8 [[OR2]], [[A]] 211*76df706bSchenglin.bi; CHECK-NEXT: [[AND:%.*]] = and i8 [[OR3]], [[B]] 212*76df706bSchenglin.bi; CHECK-NEXT: ret i8 [[AND]] 2130c3411bbSchenglin.bi; 2140c3411bbSchenglin.bi %bd = and i8 %b, %d 2150c3411bbSchenglin.bi %xor = xor i8 %bd, %c 2160c3411bbSchenglin.bi %not.bd = xor i8 %xor, -1 2170c3411bbSchenglin.bi %xor.ab = xor i8 %a, %b 2180c3411bbSchenglin.bi %or1 = or i8 %xor.ab, %c 2190c3411bbSchenglin.bi %or2 = or i8 %or1, %not.bd 2200c3411bbSchenglin.bi %or3 = or i8 %or2, %a 2210c3411bbSchenglin.bi %and = and i8 %or3, %b 2220c3411bbSchenglin.bi ret i8 %and 2230c3411bbSchenglin.bi} 224