xref: /llvm-project/llvm/test/Transforms/Reassociate/reassoc_bool.ll (revision aac83fcf3ec6bbe5e0d83b76d2d236b1b4bfbe89)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt < %s -passes=reassociate -S | FileCheck %s
3
4define i1 @scalar(i1 %b0, i1 %b1, i1 %b2, i1 %b3, i1 %b4, i1 %b5, i1 %b6, i1 %b7) {
5; CHECK-LABEL: define i1 @scalar(
6; CHECK-SAME: i1 [[B0:%.*]], i1 [[B1:%.*]], i1 [[B2:%.*]], i1 [[B3:%.*]], i1 [[B4:%.*]], i1 [[B5:%.*]], i1 [[B6:%.*]], i1 [[B7:%.*]]) {
7; CHECK-NEXT:    [[OR01:%.*]] = or i1 [[B0]], [[B1]]
8; CHECK-NEXT:    [[OR23:%.*]] = or i1 [[B2]], [[B3]]
9; CHECK-NEXT:    [[OR45:%.*]] = or i1 [[B4]], [[B5]]
10; CHECK-NEXT:    [[OR67:%.*]] = or i1 [[B6]], [[B7]]
11; CHECK-NEXT:    [[OR0123:%.*]] = or i1 [[OR01]], [[OR23]]
12; CHECK-NEXT:    [[OR4567:%.*]] = or i1 [[OR45]], [[OR67]]
13; CHECK-NEXT:    [[OR01234567:%.*]] = or i1 [[OR0123]], [[OR4567]]
14; CHECK-NEXT:    ret i1 [[OR01234567]]
15;
16  %or01 = or i1 %b0, %b1
17  %or23 = or i1 %b2, %b3
18  %or45 = or i1 %b4, %b5
19  %or67 = or i1 %b6, %b7
20  %or0123 = or i1 %or01, %or23
21  %or4567 = or i1 %or45, %or67
22  %or01234567 = or i1 %or0123, %or4567
23  ret i1 %or01234567
24}
25
26
27define i1 @scalar1(i1 %a, i1 %b0, i1 %b1, i1 %b2, i1 %b3, i1 %b4, i1 %b5, i1 %b6, i1 %b7) {
28; CHECK-LABEL: define i1 @scalar1(
29; CHECK-SAME: i1 [[A:%.*]], i1 [[B0:%.*]], i1 [[B1:%.*]], i1 [[B2:%.*]], i1 [[B3:%.*]], i1 [[B4:%.*]], i1 [[B5:%.*]], i1 [[B6:%.*]], i1 [[B7:%.*]]) {
30; CHECK-NEXT:    [[OR0:%.*]] = or i1 [[A]], [[B0]]
31; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[A]], [[B1]]
32; CHECK-NEXT:    [[OR2:%.*]] = or i1 [[A]], [[B2]]
33; CHECK-NEXT:    [[OR3:%.*]] = or i1 [[A]], [[B3]]
34; CHECK-NEXT:    [[OR4:%.*]] = or i1 [[A]], [[B4]]
35; CHECK-NEXT:    [[OR5:%.*]] = or i1 [[A]], [[B5]]
36; CHECK-NEXT:    [[OR6:%.*]] = or i1 [[A]], [[B6]]
37; CHECK-NEXT:    [[OR7:%.*]] = or i1 [[A]], [[B7]]
38; CHECK-NEXT:    [[XOR0:%.*]] = xor i1 [[OR0]], [[OR1]]
39; CHECK-NEXT:    [[XOR1:%.*]] = xor i1 [[XOR0]], [[OR2]]
40; CHECK-NEXT:    [[XOR2:%.*]] = xor i1 [[XOR1]], [[OR3]]
41; CHECK-NEXT:    [[XOR3:%.*]] = xor i1 [[XOR2]], [[OR4]]
42; CHECK-NEXT:    [[XOR4:%.*]] = xor i1 [[XOR3]], [[OR5]]
43; CHECK-NEXT:    [[XOR5:%.*]] = xor i1 [[XOR4]], [[OR6]]
44; CHECK-NEXT:    [[XOR6:%.*]] = xor i1 [[XOR5]], [[OR7]]
45; CHECK-NEXT:    [[OR001:%.*]] = or i1 [[XOR0]], [[XOR1]]
46; CHECK-NEXT:    [[OR023:%.*]] = or i1 [[XOR2]], [[XOR3]]
47; CHECK-NEXT:    [[OR045:%.*]] = or i1 [[XOR4]], [[XOR5]]
48; CHECK-NEXT:    [[OR060:%.*]] = or i1 [[XOR0]], [[XOR6]]
49; CHECK-NEXT:    [[OR0123:%.*]] = or i1 [[OR001]], [[OR023]]
50; CHECK-NEXT:    [[OR4560:%.*]] = or i1 [[OR045]], [[OR060]]
51; CHECK-NEXT:    [[OR01234567:%.*]] = or i1 [[OR0123]], [[OR4560]]
52; CHECK-NEXT:    ret i1 [[OR01234567]]
53;
54  %or0 = or i1 %b0, %a
55  %or1 = or i1 %b1, %a
56  %or2 = or i1 %b2, %a
57  %or3 = or i1 %b3, %a
58  %or4 = or i1 %b4, %a
59  %or5 = or i1 %b5, %a
60  %or6 = or i1 %b6, %a
61  %or7 = or i1 %b7, %a
62  %xor0 = xor i1 %or0, %or1
63  %xor1 = xor i1 %xor0, %or2
64  %xor2 = xor i1 %xor1, %or3
65  %xor3 = xor i1 %xor2, %or4
66  %xor4 = xor i1 %xor3, %or5
67  %xor5 = xor i1 %xor4, %or6
68  %xor6 = xor i1 %xor5, %or7
69  %or001 = or i1 %xor0, %xor1
70  %or023 = or i1 %xor2, %xor3
71  %or045 = or i1 %xor4, %xor5
72  %or060 = or i1 %xor6, %xor0
73  %or0123 = or i1 %or001, %or023
74  %or4560 = or i1 %or045, %or060
75  %or01234567 = or i1 %or0123, %or4560
76  ret i1 %or01234567
77}
78
79define i1 @scalar2(i1 %a, i1 %b0, i1 %b1, i1 %b2, i1 %b3, i1 %b4, i1 %b5, i1 %b6, i1 %b7) {
80; CHECK-LABEL: define i1 @scalar2(
81; CHECK-SAME: i1 [[A:%.*]], i1 [[B0:%.*]], i1 [[B1:%.*]], i1 [[B2:%.*]], i1 [[B3:%.*]], i1 [[B4:%.*]], i1 [[B5:%.*]], i1 [[B6:%.*]], i1 [[B7:%.*]]) {
82; CHECK-NEXT:    [[OR0:%.*]] = or i1 [[A]], [[B0]]
83; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[A]], [[B1]]
84; CHECK-NEXT:    [[OR2:%.*]] = or i1 [[A]], [[B2]]
85; CHECK-NEXT:    [[OR3:%.*]] = or i1 [[A]], [[B3]]
86; CHECK-NEXT:    [[OR4:%.*]] = or i1 [[A]], [[B4]]
87; CHECK-NEXT:    [[OR5:%.*]] = or i1 [[A]], [[B5]]
88; CHECK-NEXT:    [[OR6:%.*]] = or i1 [[A]], [[B6]]
89; CHECK-NEXT:    [[OR7:%.*]] = or i1 [[A]], [[B7]]
90; CHECK-NEXT:    [[XOR0:%.*]] = xor i1 [[OR0]], [[OR1]]
91; CHECK-NEXT:    [[XOR1:%.*]] = xor i1 [[OR2]], [[OR3]]
92; CHECK-NEXT:    [[XOR2:%.*]] = xor i1 [[OR4]], [[OR5]]
93; CHECK-NEXT:    [[XOR3:%.*]] = xor i1 [[OR6]], [[OR7]]
94; CHECK-NEXT:    [[OR01:%.*]] = xor i1 [[XOR0]], [[XOR1]]
95; CHECK-NEXT:    [[OR23:%.*]] = xor i1 [[XOR2]], [[XOR3]]
96; CHECK-NEXT:    [[OR0123:%.*]] = xor i1 [[OR01]], [[OR23]]
97; CHECK-NEXT:    ret i1 [[OR0123]]
98;
99  %or0 = or i1 %b0, %a
100  %or1 = or i1 %b1, %a
101  %or2 = or i1 %b2, %a
102  %or3 = or i1 %b3, %a
103  %or4 = or i1 %b4, %a
104  %or5 = or i1 %b5, %a
105  %or6 = or i1 %b6, %a
106  %or7 = or i1 %b7, %a
107  %xor0 = xor i1 %or0, %or1
108  %xor1 = xor i1 %or2, %or3
109  %xor2 = xor i1 %or4, %or5
110  %xor3 = xor i1 %or6, %or7
111  %or01 = xor i1 %xor0, %xor1
112  %or23 = xor i1 %xor2, %xor3
113  %or0123 = xor i1 %or01, %or23
114  ret i1 %or0123
115}
116
117define i1 @scalar3(i1 %a, i1 %b0, i1 %b1, i1 %b2, i1 %b3, i1 %b4, i1 %b5, i1 %b6, i1 %b7) {
118; CHECK-LABEL: define i1 @scalar3(
119; CHECK-SAME: i1 [[A:%.*]], i1 [[B0:%.*]], i1 [[B1:%.*]], i1 [[B2:%.*]], i1 [[B3:%.*]], i1 [[B4:%.*]], i1 [[B5:%.*]], i1 [[B6:%.*]], i1 [[B7:%.*]]) {
120; CHECK-NEXT:    [[XOR0:%.*]] = xor i1 [[A]], [[B0]]
121; CHECK-NEXT:    [[XOR1:%.*]] = xor i1 [[A]], [[B1]]
122; CHECK-NEXT:    [[XOR2:%.*]] = xor i1 [[A]], [[B2]]
123; CHECK-NEXT:    [[XOR3:%.*]] = xor i1 [[A]], [[B3]]
124; CHECK-NEXT:    [[XOR4:%.*]] = xor i1 [[A]], [[B4]]
125; CHECK-NEXT:    [[XOR5:%.*]] = xor i1 [[A]], [[B5]]
126; CHECK-NEXT:    [[XOR6:%.*]] = xor i1 [[A]], [[B6]]
127; CHECK-NEXT:    [[XOR7:%.*]] = xor i1 [[A]], [[B7]]
128; CHECK-NEXT:    [[AND0:%.*]] = and i1 [[XOR0]], [[XOR1]]
129; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[XOR2]], [[XOR3]]
130; CHECK-NEXT:    [[AND2:%.*]] = and i1 [[XOR4]], [[XOR5]]
131; CHECK-NEXT:    [[AND3:%.*]] = and i1 [[XOR6]], [[XOR7]]
132; CHECK-NEXT:    [[OR01:%.*]] = and i1 [[AND0]], [[AND1]]
133; CHECK-NEXT:    [[OR23:%.*]] = and i1 [[AND2]], [[AND3]]
134; CHECK-NEXT:    [[OR0123:%.*]] = and i1 [[OR01]], [[OR23]]
135; CHECK-NEXT:    ret i1 [[OR0123]]
136;
137  %xor0 = xor i1 %b0, %a
138  %xor1 = xor i1 %b1, %a
139  %xor2 = xor i1 %b2, %a
140  %xor3 = xor i1 %b3, %a
141  %xor4 = xor i1 %b4, %a
142  %xor5 = xor i1 %b5, %a
143  %xor6 = xor i1 %b6, %a
144  %xor7 = xor i1 %b7, %a
145  %and0 = and i1 %xor0, %xor1
146  %and1 = and i1 %xor2, %xor3
147  %and2 = and i1 %xor4, %xor5
148  %and3 = and i1 %xor6, %xor7
149  %or01 = and i1 %and0, %and1
150  %or23 = and i1 %and2, %and3
151  %or0123 = and i1 %or01, %or23
152  ret i1 %or0123
153}
154
155define i1 @scalar4(i1 %a, i1 %b0, i1 %b1, i1 %b2, i1 %b3, i1 %b4, i1 %b5, i1 %b6, i1 %b7) {
156; CHECK-LABEL: define i1 @scalar4(
157; CHECK-SAME: i1 [[A:%.*]], i1 [[B0:%.*]], i1 [[B1:%.*]], i1 [[B2:%.*]], i1 [[B3:%.*]], i1 [[B4:%.*]], i1 [[B5:%.*]], i1 [[B6:%.*]], i1 [[B7:%.*]]) {
158; CHECK-NEXT:    [[XOR0:%.*]] = xor i1 [[A]], [[B0]]
159; CHECK-NEXT:    [[XOR1:%.*]] = xor i1 [[A]], [[B1]]
160; CHECK-NEXT:    [[XOR2:%.*]] = xor i1 [[A]], [[B2]]
161; CHECK-NEXT:    [[XOR3:%.*]] = xor i1 [[A]], [[B3]]
162; CHECK-NEXT:    [[XOR4:%.*]] = xor i1 [[A]], [[B4]]
163; CHECK-NEXT:    [[XOR5:%.*]] = xor i1 [[A]], [[B5]]
164; CHECK-NEXT:    [[XOR6:%.*]] = xor i1 [[A]], [[B6]]
165; CHECK-NEXT:    [[XOR7:%.*]] = xor i1 [[A]], [[B7]]
166; CHECK-NEXT:    [[OR0:%.*]] = or i1 [[XOR0]], [[XOR1]]
167; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[XOR2]], [[XOR3]]
168; CHECK-NEXT:    [[OR2:%.*]] = or i1 [[XOR4]], [[XOR5]]
169; CHECK-NEXT:    [[OR3:%.*]] = or i1 [[XOR6]], [[XOR7]]
170; CHECK-NEXT:    [[OR4:%.*]] = or i1 [[B0]], [[B1]]
171; CHECK-NEXT:    [[OR5:%.*]] = or i1 [[B2]], [[B3]]
172; CHECK-NEXT:    [[OR6:%.*]] = or i1 [[B4]], [[B5]]
173; CHECK-NEXT:    [[OR7:%.*]] = or i1 [[B6]], [[B7]]
174; CHECK-NEXT:    [[OR01:%.*]] = or i1 [[OR0]], [[OR1]]
175; CHECK-NEXT:    [[OR23:%.*]] = or i1 [[OR2]], [[OR3]]
176; CHECK-NEXT:    [[OR45:%.*]] = or i1 [[OR4]], [[OR5]]
177; CHECK-NEXT:    [[OR67:%.*]] = or i1 [[OR6]], [[OR7]]
178; CHECK-NEXT:    [[OR0123:%.*]] = or i1 [[OR01]], [[OR23]]
179; CHECK-NEXT:    [[OR4567:%.*]] = or i1 [[OR45]], [[OR67]]
180; CHECK-NEXT:    [[OR01234567:%.*]] = or i1 [[OR4567]], [[OR0123]]
181; CHECK-NEXT:    ret i1 [[OR01234567]]
182;
183  %xor0 = xor i1 %b0, %a
184  %xor1 = xor i1 %b1, %a
185  %xor2 = xor i1 %b2, %a
186  %xor3 = xor i1 %b3, %a
187  %xor4 = xor i1 %b4, %a
188  %xor5 = xor i1 %b5, %a
189  %xor6 = xor i1 %b6, %a
190  %xor7 = xor i1 %b7, %a
191  %or0 = or i1 %xor0, %xor1
192  %or1 = or i1 %xor2, %xor3
193  %or2 = or i1 %xor4, %xor5
194  %or3 = or i1 %xor6, %xor7
195  %or4 = or i1 %b0, %b1
196  %or5 = or i1 %b2, %b3
197  %or6 = or i1 %b4, %b5
198  %or7 = or i1 %b6, %b7
199  %or01 = or i1 %or0, %or1
200  %or23 = or i1 %or2, %or3
201  %or45 = or i1 %or4, %or5
202  %or67 = or i1 %or6, %or7
203  %or0123 = or i1 %or01, %or23
204  %or4567 = or i1 %or45, %or67
205  %or01234567 = or i1 %or0123, %or4567
206  ret i1 %or01234567
207}
208