Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / InstCombine / select-factorize.ll
blob386c8e522759e2b8c753b89accfa53c18f7c275e
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instcombine -S < %s | FileCheck %s
4 declare void @use(i1)
6 define 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]]
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
18 define 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]]
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
30 define 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]]
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
42 define 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]]
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
54 define 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]]
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
66 define 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]]
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
78 define 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]]
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
90 define 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]]
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
102 define <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> <i1 true, i1 true, 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]]
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
114 define <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> <i1 true, i1 true, 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]]
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
126 define <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> <i1 true, i1 true, i1 true>, <3 x i1> [[BC]]
131 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
139 define <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> <i1 true, i1 true, 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]]
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
151 ; negative test: not one use for both op
153 define 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]]
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
170 define 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]]
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
182 define 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]]
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
194 define 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]]
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
206 define 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]]
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
218 define 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]]
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
230 define 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 [[TMP1]], [[C:%.*]]
234 ; CHECK-NEXT:    ret i1 [[OR]]
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
242 define 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]]
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
254 define 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 [[TMP1]], [[C:%.*]]
258 ; CHECK-NEXT:    ret i1 [[OR]]
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
266 define <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> <i1 true, i1 true, 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]]
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
278 define <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> <i1 true, i1 true, 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]]
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
290 define <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> <i1 true, i1 true, 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]]
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
302 define 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]]
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
319 define 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 [[TMP1]], [[C:%.*]]
323 ; CHECK-NEXT:    ret i1 [[OR]]
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
331 define 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 [[TMP1]], [[C:%.*]]
335 ; CHECK-NEXT:    ret i1 [[OR]]
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
343 define <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> <i1 true, i1 true, i1 true>, <3 x i1> [[B:%.*]]
346 ; CHECK-NEXT:    [[OR:%.*]] = and <3 x i1> [[TMP1]], [[C:%.*]]
347 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
355 define <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> <i1 true, i1 true, i1 true>, <3 x i1> [[B:%.*]]
358 ; CHECK-NEXT:    [[OR:%.*]] = and <3 x i1> [[TMP1]], [[C:%.*]]
359 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
367 define 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]]
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
384 define 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]]
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
396 define 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]]
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
408 define 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]]
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
420 define 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]]
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
432 define 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]]
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
444 define 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]]
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
456 define 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]]
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
468 define 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]]
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
480 define <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> <i1 true, i1 true, i1 true>, <3 x i1> [[TMP1]]
484 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
492 define <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> <i1 true, i1 true, 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]]
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
505 define <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]]
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
517 define <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> <i1 true, i1 true, i1 true>, <3 x i1> [[TMP1]]
521 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
529 ; negative test: not one use for both op
531 define 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]]
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
548 define 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]]
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
560 define 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]]
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
572 define 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]]
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
584 define 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 [[TMP1]], [[C:%.*]]
588 ; CHECK-NEXT:    ret i1 [[OR]]
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
596 define 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]]
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
608 define 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]]
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
620 define 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]]
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
632 define 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 [[TMP1]], [[C:%.*]]
636 ; CHECK-NEXT:    ret i1 [[OR]]
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
644 define <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> <i1 true, i1 true, i1 true>, <3 x i1> [[TMP1]]
648 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
656 define <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]]
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
668 define <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> <i1 true, i1 true, i1 true>, <3 x i1> [[TMP1]]
672 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
680 define 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]]
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
697 define 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 [[TMP1]], [[C:%.*]]
701 ; CHECK-NEXT:    ret i1 [[OR]]
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
709 define 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 [[TMP1]], [[C:%.*]]
713 ; CHECK-NEXT:    ret i1 [[OR]]
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
721 define <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> [[TMP1]], [[C:%.*]]
725 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
733 define <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> [[TMP1]], [[C:%.*]]
737 ; CHECK-NEXT:    ret <3 x i1> [[OR]]
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
745 define 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]]
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