xref: /llvm-project/llvm/test/Transforms/InstCombine/select-factorize.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3
4declare void @use(i1)
5
6define i1 @logic_and_logic_or_1(i1 %c, i1 %a, i1 %b) {
7; CHECK-LABEL: @logic_and_logic_or_1(
8; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
9; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
10; CHECK-NEXT:    ret i1 [[OR]]
11;
12  %ac = select i1 %c, i1 %a, i1 false
13  %bc = select i1 %c, i1 %b, i1 false
14  %or = select i1 %ac, i1 true, i1 %bc
15  ret i1 %or
16}
17
18define i1 @logic_and_logic_or_2(i1 %c, i1 %a, i1 %b) {
19; CHECK-LABEL: @logic_and_logic_or_2(
20; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
21; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
22; CHECK-NEXT:    ret i1 [[OR]]
23;
24  %ac = select i1 %a, i1 %c, i1 false
25  %bc = select i1 %c, i1 %b, i1 false
26  %or = select i1 %ac, i1 true, i1 %bc
27  ret i1 %or
28}
29
30define i1 @logic_and_logic_or_3(i1 %c, i1 %a, i1 %b) {
31; CHECK-LABEL: @logic_and_logic_or_3(
32; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
33; CHECK-NEXT:    [[OR:%.*]] = select i1 [[TMP1]], i1 [[C:%.*]], i1 false
34; CHECK-NEXT:    ret i1 [[OR]]
35;
36  %ac = select i1 %a, i1 %c, i1 false
37  %bc = select i1 %b, i1 %c, i1 false
38  %or = select i1 %ac, i1 true, i1 %bc
39  ret i1 %or
40}
41
42define i1 @logic_and_logic_or_4(i1 %c, i1 %a, i1 %b) {
43; CHECK-LABEL: @logic_and_logic_or_4(
44; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
45; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
46; CHECK-NEXT:    ret i1 [[OR]]
47;
48  %ac = select i1 %c, i1 %a, i1 false
49  %bc = select i1 %b, i1 %c, i1 false
50  %or = select i1 %ac, i1 true, i1 %bc
51  ret i1 %or
52}
53
54define i1 @logic_and_logic_or_5(i1 %c, i1 %a, i1 %b) {
55; CHECK-LABEL: @logic_and_logic_or_5(
56; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
57; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
58; CHECK-NEXT:    ret i1 [[OR]]
59;
60  %ac = select i1 %c, i1 %a, i1 false
61  %bc = select i1 %c, i1 %b, i1 false
62  %or = select i1 %bc, i1 true, i1 %ac
63  ret i1 %or
64}
65
66define i1 @logic_and_logic_or_6(i1 %c, i1 %a, i1 %b) {
67; CHECK-LABEL: @logic_and_logic_or_6(
68; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
69; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
70; CHECK-NEXT:    ret i1 [[OR]]
71;
72  %ac = select i1 %a, i1 %c, i1 false
73  %bc = select i1 %c, i1 %b, i1 false
74  %or = select i1 %bc, i1 true, i1 %ac
75  ret i1 %or
76}
77
78define i1 @logic_and_logic_or_7(i1 %c, i1 %a, i1 %b) {
79; CHECK-LABEL: @logic_and_logic_or_7(
80; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
81; CHECK-NEXT:    [[OR:%.*]] = select i1 [[TMP1]], i1 [[C:%.*]], i1 false
82; CHECK-NEXT:    ret i1 [[OR]]
83;
84  %ac = select i1 %a, i1 %c, i1 false
85  %bc = select i1 %b, i1 %c, i1 false
86  %or = select i1 %bc, i1 true, i1 %ac
87  ret i1 %or
88}
89
90define i1 @logic_and_logic_or_8(i1 %c, i1 %a, i1 %b) {
91; CHECK-LABEL: @logic_and_logic_or_8(
92; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
93; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
94; CHECK-NEXT:    ret i1 [[OR]]
95;
96  %ac = select i1 %c, i1 %a, i1 false
97  %bc = select i1 %b, i1 %c, i1 false
98  %or = select i1 %bc, i1 true, i1 %ac
99  ret i1 %or
100}
101
102define <3 x i1> @logic_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
103; CHECK-LABEL: @logic_and_logic_or_vector(
104; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
105; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer
106; CHECK-NEXT:    ret <3 x i1> [[OR]]
107;
108  %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false>
109  %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>
110  %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc
111  ret <3 x i1> %or
112}
113
114define <3 x i1> @logic_and_logic_or_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
115; CHECK-LABEL: @logic_and_logic_or_vector_poison1(
116; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
117; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer
118; CHECK-NEXT:    ret <3 x i1> [[OR]]
119;
120  %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false>
121  %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>
122  %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 poison>, <3 x i1> %bc
123  ret <3 x i1> %or
124}
125
126define <3 x i1> @logic_and_logic_or_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
127; CHECK-LABEL: @logic_and_logic_or_vector_poison2(
128; CHECK-NEXT:    [[AC:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[A:%.*]], <3 x i1> <i1 false, i1 poison, i1 false>
129; CHECK-NEXT:    [[BC:%.*]] = select <3 x i1> [[C]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
130; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[AC]], <3 x i1> splat (i1 true), <3 x i1> [[BC]]
131; CHECK-NEXT:    ret <3 x i1> [[OR]]
132;
133  %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 poison, i1 false>
134  %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>
135  %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc
136  ret <3 x i1> %or
137}
138
139define <3 x i1> @logic_and_logic_or_vector_poison3(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
140; CHECK-LABEL: @logic_and_logic_or_vector_poison3(
141; CHECK-NEXT:    [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
142; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[BC]], <3 x i1> <i1 poison, i1 false, i1 false>
143; CHECK-NEXT:    ret <3 x i1> [[OR]]
144;
145  %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false>
146  %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 poison, i1 false, i1 false>
147  %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc
148  ret <3 x i1> %or
149}
150
151; negative test: not one use for both op
152
153define i1 @logic_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) {
154; CHECK-LABEL: @logic_and_logic_or_not_one_use(
155; CHECK-NEXT:    [[AC:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 false
156; CHECK-NEXT:    [[BC:%.*]] = select i1 [[C]], i1 [[B:%.*]], i1 false
157; CHECK-NEXT:    [[OR:%.*]] = select i1 [[AC]], i1 true, i1 [[BC]]
158; CHECK-NEXT:    call void @use(i1 [[AC]])
159; CHECK-NEXT:    call void @use(i1 [[BC]])
160; CHECK-NEXT:    ret i1 [[OR]]
161;
162  %ac = select i1 %c, i1 %a, i1 false
163  %bc = select i1 %c, i1 %b, i1 false
164  %or = select i1 %ac, i1 true, i1 %bc
165  call void @use(i1 %ac)
166  call void @use(i1 %bc)
167  ret i1 %or
168}
169
170define i1 @and_logic_and_logic_or_1(i1 %c, i1 %a, i1 %b) {
171; CHECK-LABEL: @and_logic_and_logic_or_1(
172; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
173; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
174; CHECK-NEXT:    ret i1 [[OR]]
175;
176  %ac = and i1 %c, %a
177  %bc = select i1 %c, i1 %b, i1 false
178  %or = select i1 %ac, i1 true, i1 %bc
179  ret i1 %or
180}
181
182define i1 @and_logic_and_logic_or_2(i1 %c, i1 %a, i1 %b) {
183; CHECK-LABEL: @and_logic_and_logic_or_2(
184; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
185; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
186; CHECK-NEXT:    ret i1 [[OR]]
187;
188  %ac = and i1 %c, %a
189  %bc = select i1 %b, i1 %c, i1 false
190  %or = select i1 %ac, i1 true, i1 %bc
191  ret i1 %or
192}
193
194define i1 @and_logic_and_logic_or_3(i1 %c, i1 %a, i1 %b) {
195; CHECK-LABEL: @and_logic_and_logic_or_3(
196; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
197; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
198; CHECK-NEXT:    ret i1 [[OR]]
199;
200  %ac = and i1 %a, %c
201  %bc = select i1 %c, i1 %b, i1 false
202  %or = select i1 %ac, i1 true, i1 %bc
203  ret i1 %or
204}
205
206define i1 @and_logic_and_logic_or_4(i1 %c, i1 %a, i1 %b) {
207; CHECK-LABEL: @and_logic_and_logic_or_4(
208; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
209; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
210; CHECK-NEXT:    ret i1 [[OR]]
211;
212  %ac = and i1 %a, %c
213  %bc = select i1 %b, i1 %c, i1 false
214  %or = select i1 %ac, i1 true, i1 %bc
215  ret i1 %or
216}
217
218define i1 @and_logic_and_logic_or_5(i1 %c, i1 %a, i1 %b) {
219; CHECK-LABEL: @and_logic_and_logic_or_5(
220; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
221; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
222; CHECK-NEXT:    ret i1 [[OR]]
223;
224  %ac = and i1 %c, %a
225  %bc = select i1 %c, i1 %b, i1 false
226  %or = select i1 %bc, i1 true, i1 %ac
227  ret i1 %or
228}
229
230define i1 @and_logic_and_logic_or_6(i1 %c, i1 %a, i1 %b) {
231; CHECK-LABEL: @and_logic_and_logic_or_6(
232; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
233; CHECK-NEXT:    [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]]
234; CHECK-NEXT:    ret i1 [[OR]]
235;
236  %ac = and i1 %c, %a
237  %bc = select i1 %b, i1 %c, i1 false
238  %or = select i1 %bc, i1 true, i1 %ac
239  ret i1 %or
240}
241
242define i1 @and_logic_and_logic_or_7(i1 %c, i1 %a, i1 %b) {
243; CHECK-LABEL: @and_logic_and_logic_or_7(
244; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
245; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false
246; CHECK-NEXT:    ret i1 [[OR]]
247;
248  %ac = and i1 %a, %c
249  %bc = select i1 %c, i1 %b, i1 false
250  %or = select i1 %bc, i1 true, i1 %ac
251  ret i1 %or
252}
253
254define i1 @and_logic_and_logic_or_8(i1 %c, i1 %a, i1 %b) {
255; CHECK-LABEL: @and_logic_and_logic_or_8(
256; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
257; CHECK-NEXT:    [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]]
258; CHECK-NEXT:    ret i1 [[OR]]
259;
260  %ac = and i1 %a, %c
261  %bc = select i1 %b, i1 %c, i1 false
262  %or = select i1 %bc, i1 true, i1 %ac
263  ret i1 %or
264}
265
266define <3 x i1> @and_logic_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
267; CHECK-LABEL: @and_logic_and_logic_or_vector(
268; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
269; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer
270; CHECK-NEXT:    ret <3 x i1> [[OR]]
271;
272  %ac = and <3 x i1> %c, %a
273  %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>
274  %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc
275  ret <3 x i1> %or
276}
277
278define <3 x i1> @and_logic_and_logic_or_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
279; CHECK-LABEL: @and_logic_and_logic_or_vector_poison1(
280; CHECK-NEXT:    [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
281; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[BC]], <3 x i1> <i1 false, i1 poison, i1 false>
282; CHECK-NEXT:    ret <3 x i1> [[OR]]
283;
284  %ac = and <3 x i1> %c, %a
285  %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 poison, i1 false>
286  %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc
287  ret <3 x i1> %or
288}
289
290define <3 x i1> @and_logic_and_logic_or_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
291; CHECK-LABEL: @and_logic_and_logic_or_vector_poison2(
292; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
293; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer
294; CHECK-NEXT:    ret <3 x i1> [[OR]]
295;
296  %ac = and <3 x i1> %c, %a
297  %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false>
298  %or = select <3 x i1> %ac, <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> %bc
299  ret <3 x i1> %or
300}
301
302define i1 @and_logic_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) {
303; CHECK-LABEL: @and_logic_and_logic_or_not_one_use(
304; CHECK-NEXT:    [[AC:%.*]] = and i1 [[A:%.*]], [[C:%.*]]
305; CHECK-NEXT:    [[BC:%.*]] = select i1 [[B:%.*]], i1 [[C]], i1 false
306; CHECK-NEXT:    [[OR:%.*]] = select i1 [[B]], i1 [[C]], i1 [[AC]]
307; CHECK-NEXT:    call void @use(i1 [[AC]])
308; CHECK-NEXT:    call void @use(i1 [[BC]])
309; CHECK-NEXT:    ret i1 [[OR]]
310;
311  %ac = and i1 %a, %c
312  %bc = select i1 %b, i1 %c, i1 false
313  %or = select i1 %bc, i1 true, i1 %ac
314  call void @use(i1 %ac)
315  call void @use(i1 %bc)
316  ret i1 %or
317}
318
319define i1 @and_and_logic_or_1(i1 %c, i1 %a, i1 %b) {
320; CHECK-LABEL: @and_and_logic_or_1(
321; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
322; CHECK-NEXT:    [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]]
323; CHECK-NEXT:    ret i1 [[OR]]
324;
325  %ac = and i1 %c, %a
326  %bc = and i1 %c, %b
327  %or = select i1 %ac, i1 true, i1 %bc
328  ret i1 %or
329}
330
331define i1 @and_and_logic_or_2(i1 %c, i1 %a, i1 %b) {
332; CHECK-LABEL: @and_and_logic_or_2(
333; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]]
334; CHECK-NEXT:    [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]]
335; CHECK-NEXT:    ret i1 [[OR]]
336;
337  %ac = and i1 %a, %c
338  %bc = and i1 %c, %b
339  %or = select i1 %bc, i1 true, i1 %ac
340  ret i1 %or
341}
342
343define <3 x i1>  @and_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
344; CHECK-LABEL: @and_and_logic_or_vector(
345; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
346; CHECK-NEXT:    [[OR:%.*]] = and <3 x i1> [[C:%.*]], [[TMP1]]
347; CHECK-NEXT:    ret <3 x i1> [[OR]]
348;
349  %ac = and <3 x i1> %c, %a
350  %bc = and <3 x i1> %c, %b
351  %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1>  %bc
352  ret <3 x i1> %or
353}
354
355define <3 x i1>  @and_and_logic_or_vector_poison(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
356; CHECK-LABEL: @and_and_logic_or_vector_poison(
357; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
358; CHECK-NEXT:    [[OR:%.*]] = and <3 x i1> [[C:%.*]], [[TMP1]]
359; CHECK-NEXT:    ret <3 x i1> [[OR]]
360;
361  %ac = and <3 x i1> %c, %a
362  %bc = and <3 x i1> %c, %b
363  %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %bc
364  ret <3 x i1> %or
365}
366
367define i1 @and_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) {
368; CHECK-LABEL: @and_and_logic_or_not_one_use(
369; CHECK-NEXT:    [[AC:%.*]] = and i1 [[A:%.*]], [[C:%.*]]
370; CHECK-NEXT:    [[BC:%.*]] = and i1 [[C]], [[B:%.*]]
371; CHECK-NEXT:    [[OR:%.*]] = select i1 [[B]], i1 [[C]], i1 [[AC]]
372; CHECK-NEXT:    call void @use(i1 [[AC]])
373; CHECK-NEXT:    call void @use(i1 [[BC]])
374; CHECK-NEXT:    ret i1 [[OR]]
375;
376  %ac = and i1 %a, %c
377  %bc = and i1 %c, %b
378  %or = select i1 %bc, i1 true, i1 %ac
379  call void @use(i1 %ac)
380  call void @use(i1 %bc)
381  ret i1 %or
382}
383
384define i1 @logic_or_logic_and_1(i1 %c, i1 %a, i1 %b) {
385; CHECK-LABEL: @logic_or_logic_and_1(
386; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
387; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
388; CHECK-NEXT:    ret i1 [[OR]]
389;
390  %ac = select i1 %c, i1 true, i1 %a
391  %bc = select i1 %c, i1 true, i1 %b
392  %or = select i1 %ac, i1 %bc, i1 false
393  ret i1 %or
394}
395
396define i1 @logic_or_logic_and_2(i1 %c, i1 %a, i1 %b) {
397; CHECK-LABEL: @logic_or_logic_and_2(
398; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
399; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
400; CHECK-NEXT:    ret i1 [[OR]]
401;
402  %ac = select i1 %a, i1 true, i1 %c
403  %bc = select i1 %c, i1 true, i1 %b
404  %or = select i1 %ac, i1 %bc, i1 false
405  ret i1 %or
406}
407
408define i1 @logic_or_logic_and_3(i1 %c, i1 %a, i1 %b) {
409; CHECK-LABEL: @logic_or_logic_and_3(
410; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
411; CHECK-NEXT:    [[OR:%.*]] = select i1 [[TMP1]], i1 true, i1 [[C:%.*]]
412; CHECK-NEXT:    ret i1 [[OR]]
413;
414  %ac = select i1 %a, i1 true, i1 %c
415  %bc = select i1 %b, i1 true, i1 %c
416  %or = select i1 %ac, i1 %bc, i1 false
417  ret i1 %or
418}
419
420define i1 @logic_or_logic_and_4(i1 %c, i1 %a, i1 %b) {
421; CHECK-LABEL: @logic_or_logic_and_4(
422; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
423; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
424; CHECK-NEXT:    ret i1 [[OR]]
425;
426  %ac = select i1 %c, i1 true, i1 %a
427  %bc = select i1 %b, i1 true, i1 %c
428  %or = select i1 %ac, i1 %bc, i1 false
429  ret i1 %or
430}
431
432define i1 @logic_or_logic_and_5(i1 %c, i1 %a, i1 %b) {
433; CHECK-LABEL: @logic_or_logic_and_5(
434; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
435; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
436; CHECK-NEXT:    ret i1 [[OR]]
437;
438  %ac = select i1 %c, i1 true, i1 %a
439  %bc = select i1 %c, i1 true, i1 %b
440  %or = select i1 %bc, i1 %ac, i1 false
441  ret i1 %or
442}
443
444define i1 @logic_or_logic_and_6(i1 %c, i1 %a, i1 %b) {
445; CHECK-LABEL: @logic_or_logic_and_6(
446; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
447; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
448; CHECK-NEXT:    ret i1 [[OR]]
449;
450  %ac = select i1 %a, i1 true, i1 %c
451  %bc = select i1 %c, i1 true, i1 %b
452  %or = select i1 %bc, i1 %ac, i1 false
453  ret i1 %or
454}
455
456define i1 @logic_or_logic_and_7(i1 %c, i1 %a, i1 %b) {
457; CHECK-LABEL: @logic_or_logic_and_7(
458; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
459; CHECK-NEXT:    [[OR:%.*]] = select i1 [[TMP1]], i1 true, i1 [[C:%.*]]
460; CHECK-NEXT:    ret i1 [[OR]]
461;
462  %ac = select i1 %a, i1 true, i1 %c
463  %bc = select i1 %b, i1 true, i1 %c
464  %or = select i1 %bc, i1 %ac, i1 false
465  ret i1 %or
466}
467
468define i1 @logic_or_logic_and_8(i1 %c, i1 %a, i1 %b) {
469; CHECK-LABEL: @logic_or_logic_and_8(
470; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
471; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
472; CHECK-NEXT:    ret i1 [[OR]]
473;
474  %ac = select i1 %c, i1 true, i1 %a
475  %bc = select i1 %b, i1 true, i1 %c
476  %or = select i1 %bc, i1 %ac, i1 false
477  ret i1 %or
478}
479
480define <3 x i1> @logic_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
481; CHECK-LABEL: @logic_or_logic_and_vector(
482; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
483; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]]
484; CHECK-NEXT:    ret <3 x i1> [[OR]]
485;
486  %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a
487  %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b
488  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>
489  ret <3 x i1> %or
490}
491
492define <3 x i1> @logic_or_logic_and_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
493; CHECK-LABEL: @logic_or_logic_and_vector_poison1(
494; CHECK-NEXT:    [[AC:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> [[A:%.*]]
495; CHECK-NEXT:    [[BC:%.*]] = select <3 x i1> [[C]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]]
496; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[AC]], <3 x i1> [[BC]], <3 x i1> zeroinitializer
497; CHECK-NEXT:    ret <3 x i1> [[OR]]
498;
499  %ac = select <3 x i1> %c, <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> %a
500  %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b
501  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>
502  ret <3 x i1> %or
503}
504
505define <3 x i1> @logic_or_logic_and_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
506; CHECK-LABEL: @logic_or_logic_and_vector_poison2(
507; CHECK-NEXT:    [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
508; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> [[BC]]
509; CHECK-NEXT:    ret <3 x i1> [[OR]]
510;
511  %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a
512  %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %b
513  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>
514  ret <3 x i1> %or
515}
516
517define <3 x i1> @logic_or_logic_and_vector_poison3(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
518; CHECK-LABEL: @logic_or_logic_and_vector_poison3(
519; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
520; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]]
521; CHECK-NEXT:    ret <3 x i1> [[OR]]
522;
523  %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a
524  %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b
525  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 poison>
526  ret <3 x i1> %or
527}
528
529; negative test: not one use for both op
530
531define i1 @logic_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) {
532; CHECK-LABEL: @logic_or_logic_and_not_one_use(
533; CHECK-NEXT:    [[AC:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[A:%.*]]
534; CHECK-NEXT:    [[BC:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[C]]
535; CHECK-NEXT:    [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]]
536; CHECK-NEXT:    call void @use(i1 [[AC]])
537; CHECK-NEXT:    call void @use(i1 [[BC]])
538; CHECK-NEXT:    ret i1 [[OR]]
539;
540  %ac = select i1 %c, i1 true, i1 %a
541  %bc = select i1 %b, i1 true, i1 %c
542  %or = select i1 %bc, i1 %ac, i1 false
543  call void @use(i1 %ac)
544  call void @use(i1 %bc)
545  ret i1 %or
546}
547
548define i1 @or_logic_or_logic_and_1(i1 %c, i1 %a, i1 %b) {
549; CHECK-LABEL: @or_logic_or_logic_and_1(
550; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
551; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
552; CHECK-NEXT:    ret i1 [[OR]]
553;
554  %ac = or i1 %c, %a
555  %bc = select i1 %c, i1 true, i1 %b
556  %or = select i1 %ac, i1 %bc, i1 false
557  ret i1 %or
558}
559
560define i1 @or_logic_or_logic_and_2(i1 %c, i1 %a, i1 %b) {
561; CHECK-LABEL: @or_logic_or_logic_and_2(
562; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
563; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
564; CHECK-NEXT:    ret i1 [[OR]]
565;
566  %ac = or i1 %c, %a
567  %bc = select i1 %b, i1 true, i1 %c
568  %or = select i1 %ac, i1 %bc, i1 false
569  ret i1 %or
570}
571
572define i1 @or_logic_or_logic_and_3(i1 %c, i1 %a, i1 %b) {
573; CHECK-LABEL: @or_logic_or_logic_and_3(
574; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
575; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
576; CHECK-NEXT:    ret i1 [[OR]]
577;
578  %ac = or i1 %c, %a
579  %bc = select i1 %c, i1 true, i1 %b
580  %or = select i1 %bc, i1 %ac, i1 false
581  ret i1 %or
582}
583
584define i1 @or_logic_or_logic_and_4(i1 %c, i1 %a, i1 %b) {
585; CHECK-LABEL: @or_logic_or_logic_and_4(
586; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
587; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]]
588; CHECK-NEXT:    ret i1 [[OR]]
589;
590  %ac = or i1 %c, %a
591  %bc = select i1 %b, i1 true, i1 %c
592  %or = select i1 %bc, i1 %ac, i1 false
593  ret i1 %or
594}
595
596define i1 @or_logic_or_logic_and_5(i1 %c, i1 %a, i1 %b) {
597; CHECK-LABEL: @or_logic_or_logic_and_5(
598; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
599; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
600; CHECK-NEXT:    ret i1 [[OR]]
601;
602  %ac = or i1 %a, %c
603  %bc = select i1 %c, i1 true, i1 %b
604  %or = select i1 %ac, i1 %bc, i1 false
605  ret i1 %or
606}
607
608define i1 @or_logic_or_logic_and_6(i1 %c, i1 %a, i1 %b) {
609; CHECK-LABEL: @or_logic_or_logic_and_6(
610; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
611; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
612; CHECK-NEXT:    ret i1 [[OR]]
613;
614  %ac = or i1 %a, %c
615  %bc = select i1 %b, i1 true, i1 %c
616  %or = select i1 %ac, i1 %bc, i1 false
617  ret i1 %or
618}
619
620define i1 @or_logic_or_logic_and_7(i1 %c, i1 %a, i1 %b) {
621; CHECK-LABEL: @or_logic_or_logic_and_7(
622; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
623; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]]
624; CHECK-NEXT:    ret i1 [[OR]]
625;
626  %ac = or i1 %a, %c
627  %bc = select i1 %c, i1 true, i1 %b
628  %or = select i1 %bc, i1 %ac, i1 false
629  ret i1 %or
630}
631
632define i1 @or_logic_or_logic_and_8(i1 %c, i1 %a, i1 %b) {
633; CHECK-LABEL: @or_logic_or_logic_and_8(
634; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
635; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]]
636; CHECK-NEXT:    ret i1 [[OR]]
637;
638  %ac = or i1 %a, %c
639  %bc = select i1 %b, i1 true, i1 %c
640  %or = select i1 %bc, i1 %ac, i1 false
641  ret i1 %or
642}
643
644define <3 x i1> @or_logic_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
645; CHECK-LABEL: @or_logic_or_logic_and_vector(
646; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
647; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]]
648; CHECK-NEXT:    ret <3 x i1> [[OR]]
649;
650  %ac = or <3 x i1> %c, %a
651  %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b
652  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>
653  ret <3 x i1> %or
654}
655
656define <3 x i1> @or_logic_or_logic_and_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
657; CHECK-LABEL: @or_logic_or_logic_and_vector_poison1(
658; CHECK-NEXT:    [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
659; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> [[BC]]
660; CHECK-NEXT:    ret <3 x i1> [[OR]]
661;
662  %ac = or <3 x i1> %c, %a
663  %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %b
664  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>
665  ret <3 x i1> %or
666}
667
668define <3 x i1> @or_logic_or_logic_and_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
669; CHECK-LABEL: @or_logic_or_logic_and_vector_poison2(
670; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
671; CHECK-NEXT:    [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]]
672; CHECK-NEXT:    ret <3 x i1> [[OR]]
673;
674  %ac = or <3 x i1> %c, %a
675  %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b
676  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 poison>
677  ret <3 x i1> %or
678}
679
680define i1 @or_logic_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) {
681; CHECK-LABEL: @or_logic_or_logic_and_not_one_use(
682; CHECK-NEXT:    [[AC:%.*]] = or i1 [[C:%.*]], [[A:%.*]]
683; CHECK-NEXT:    [[BC:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[C]]
684; CHECK-NEXT:    [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]]
685; CHECK-NEXT:    call void @use(i1 [[AC]])
686; CHECK-NEXT:    call void @use(i1 [[BC]])
687; CHECK-NEXT:    ret i1 [[OR]]
688;
689  %ac = or i1 %c, %a
690  %bc = select i1 %b, i1 true, i1 %c
691  %or = select i1 %bc, i1 %ac, i1 false
692  call void @use(i1 %ac)
693  call void @use(i1 %bc)
694  ret i1 %or
695}
696
697define i1 @or_or_logic_and_1(i1 %c, i1 %a, i1 %b) {
698; CHECK-LABEL: @or_or_logic_and_1(
699; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
700; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]]
701; CHECK-NEXT:    ret i1 [[OR]]
702;
703  %ac = or i1 %c, %a
704  %bc = or i1 %b, %c
705  %or = select i1 %ac, i1 %bc, i1 false
706  ret i1 %or
707}
708
709define i1 @or_or_logic_and_2(i1 %c, i1 %a, i1 %b) {
710; CHECK-LABEL: @or_or_logic_and_2(
711; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false
712; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]]
713; CHECK-NEXT:    ret i1 [[OR]]
714;
715  %ac = or i1 %c, %a
716  %bc = or i1 %b, %c
717  %or = select i1 %bc, i1 %ac, i1 false
718  ret i1 %or
719}
720
721define <3 x i1> @or_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
722; CHECK-LABEL: @or_or_logic_and_vector(
723; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
724; CHECK-NEXT:    [[OR:%.*]] = or <3 x i1> [[C:%.*]], [[TMP1]]
725; CHECK-NEXT:    ret <3 x i1> [[OR]]
726;
727  %ac = or <3 x i1> %c, %a
728  %bc = or <3 x i1> %b, %c
729  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false>
730  ret <3 x i1> %or
731}
732
733define <3 x i1> @or_or_logic_and_vector_poison(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) {
734; CHECK-LABEL: @or_or_logic_and_vector_poison(
735; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer
736; CHECK-NEXT:    [[OR:%.*]] = or <3 x i1> [[C:%.*]], [[TMP1]]
737; CHECK-NEXT:    ret <3 x i1> [[OR]]
738;
739  %ac = or <3 x i1> %c, %a
740  %bc = or <3 x i1> %b, %c
741  %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 poison, i1 false, i1 false>
742  ret <3 x i1> %or
743}
744
745define i1 @or_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) {
746; CHECK-LABEL: @or_or_logic_and_not_one_use(
747; CHECK-NEXT:    [[AC:%.*]] = or i1 [[C:%.*]], [[A:%.*]]
748; CHECK-NEXT:    [[BC:%.*]] = or i1 [[B:%.*]], [[C]]
749; CHECK-NEXT:    [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]]
750; CHECK-NEXT:    call void @use(i1 [[AC]])
751; CHECK-NEXT:    call void @use(i1 [[BC]])
752; CHECK-NEXT:    ret i1 [[OR]]
753;
754  %ac = or i1 %c, %a
755  %bc = or i1 %b, %c
756  %or = select i1 %bc, i1 %ac, i1 false
757  call void @use(i1 %ac)
758  call void @use(i1 %bc)
759  ret i1 %or
760}
761