xref: /llvm-project/llvm/test/Transforms/AggressiveInstCombine/logic-combine.ll (revision 76df706bca14affdcf0dd91561c8e6805035608f)
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