xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/logical-select.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo(
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = icmp slt i32 %a, %b
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[J:%.*]] = select i1 [[E]], i32 %c, i32 %d
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[J]]
10*9880d681SAndroid Build Coastguard Worker;
11*9880d681SAndroid Build Coastguard Worker  %e = icmp slt i32 %a, %b
12*9880d681SAndroid Build Coastguard Worker  %f = sext i1 %e to i32
13*9880d681SAndroid Build Coastguard Worker  %g = and i32 %c, %f
14*9880d681SAndroid Build Coastguard Worker  %h = xor i32 %f, -1
15*9880d681SAndroid Build Coastguard Worker  %i = and i32 %d, %h
16*9880d681SAndroid Build Coastguard Worker  %j = or i32 %g, %i
17*9880d681SAndroid Build Coastguard Worker  ret i32 %j
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar(
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = icmp slt i32 %a, %b
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[J:%.*]] = select i1 [[E]], i32 %c, i32 %d
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[J]]
25*9880d681SAndroid Build Coastguard Worker;
26*9880d681SAndroid Build Coastguard Worker  %e = icmp slt i32 %a, %b
27*9880d681SAndroid Build Coastguard Worker  %f = sext i1 %e to i32
28*9880d681SAndroid Build Coastguard Worker  %g = and i32 %c, %f
29*9880d681SAndroid Build Coastguard Worker  %h = xor i32 %f, -1
30*9880d681SAndroid Build Coastguard Worker  %i = and i32 %d, %h
31*9880d681SAndroid Build Coastguard Worker  %j = or i32 %i, %g
32*9880d681SAndroid Build Coastguard Worker  ret i32 %j
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine i32 @goo(i32 %a, i32 %b, i32 %c, i32 %d) {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @goo(
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 %a, %b
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T3:%.*]] = select i1 [[T0]], i32 %c, i32 %d
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[T3]]
40*9880d681SAndroid Build Coastguard Worker;
41*9880d681SAndroid Build Coastguard Worker  %t0 = icmp slt i32 %a, %b
42*9880d681SAndroid Build Coastguard Worker  %iftmp.0.0 = select i1 %t0, i32 -1, i32 0
43*9880d681SAndroid Build Coastguard Worker  %t1 = and i32 %iftmp.0.0, %c
44*9880d681SAndroid Build Coastguard Worker  %not = xor i32 %iftmp.0.0, -1
45*9880d681SAndroid Build Coastguard Worker  %t2 = and i32 %not, %d
46*9880d681SAndroid Build Coastguard Worker  %t3 = or i32 %t1, %t2
47*9880d681SAndroid Build Coastguard Worker  ret i32 %t3
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) {
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @poo(
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 %a, %b
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T3:%.*]] = select i1 [[T0]], i32 %c, i32 %d
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[T3]]
55*9880d681SAndroid Build Coastguard Worker;
56*9880d681SAndroid Build Coastguard Worker  %t0 = icmp slt i32 %a, %b
57*9880d681SAndroid Build Coastguard Worker  %iftmp.0.0 = select i1 %t0, i32 -1, i32 0
58*9880d681SAndroid Build Coastguard Worker  %t1 = and i32 %iftmp.0.0, %c
59*9880d681SAndroid Build Coastguard Worker  %iftmp = select i1 %t0, i32 0, i32 -1
60*9880d681SAndroid Build Coastguard Worker  %t2 = and i32 %iftmp, %d
61*9880d681SAndroid Build Coastguard Worker  %t3 = or i32 %t1, %t2
62*9880d681SAndroid Build Coastguard Worker  ret i32 %t3
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine i32 @par(i32 %a, i32 %b, i32 %c, i32 %d) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @par(
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T0:%.*]] = icmp slt i32 %a, %b
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T3:%.*]] = select i1 [[T0]], i32 %c, i32 %d
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[T3]]
70*9880d681SAndroid Build Coastguard Worker;
71*9880d681SAndroid Build Coastguard Worker  %t0 = icmp slt i32 %a, %b
72*9880d681SAndroid Build Coastguard Worker  %iftmp.1.0 = select i1 %t0, i32 -1, i32 0
73*9880d681SAndroid Build Coastguard Worker  %t1 = and i32 %iftmp.1.0, %c
74*9880d681SAndroid Build Coastguard Worker  %not = xor i32 %iftmp.1.0, -1
75*9880d681SAndroid Build Coastguard Worker  %t2 = and i32 %not, %d
76*9880d681SAndroid Build Coastguard Worker  %t3 = or i32 %t1, %t2
77*9880d681SAndroid Build Coastguard Worker  ret i32 %t3
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; In the following tests (8 commutation variants), verify that a bitcast doesn't get
81*9880d681SAndroid Build Coastguard Worker; in the way of a select transform. These bitcasts are common in SSE/AVX and possibly
82*9880d681SAndroid Build Coastguard Worker; other vector code because of canonicalization to i64 elements for vectors.
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; The fptosi instructions are included to avoid commutation canonicalization based on
85*9880d681SAndroid Build Coastguard Worker; operator weight. Using another cast operator ensures that both operands of all logic
86*9880d681SAndroid Build Coastguard Worker; ops are equally weighted, and this ensures that we're testing all commutation
87*9880d681SAndroid Build Coastguard Worker; possibilities.
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap0(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap0(
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64>
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64>
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32>
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32>
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]]
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64>
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[OR]]
98*9880d681SAndroid Build Coastguard Worker;
99*9880d681SAndroid Build Coastguard Worker  %sia = fptosi <2 x double> %a to <2 x i64>
100*9880d681SAndroid Build Coastguard Worker  %sib = fptosi <2 x double> %b to <2 x i64>
101*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
102*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
103*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %bc1, %sia
104*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
105*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
106*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %bc2, %sib
107*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and1, %and2
108*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap1(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap1(
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64>
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64>
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32>
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32>
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]]
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64>
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[OR]]
120*9880d681SAndroid Build Coastguard Worker;
121*9880d681SAndroid Build Coastguard Worker  %sia = fptosi <2 x double> %a to <2 x i64>
122*9880d681SAndroid Build Coastguard Worker  %sib = fptosi <2 x double> %b to <2 x i64>
123*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
124*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
125*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %bc1, %sia
126*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
127*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
128*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %bc2, %sib
129*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and2, %and1
130*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap2(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) {
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap2(
135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64>
136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64>
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32>
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32>
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]]
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64>
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[OR]]
142*9880d681SAndroid Build Coastguard Worker;
143*9880d681SAndroid Build Coastguard Worker  %sia = fptosi <2 x double> %a to <2 x i64>
144*9880d681SAndroid Build Coastguard Worker  %sib = fptosi <2 x double> %b to <2 x i64>
145*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
146*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
147*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %bc1, %sia
148*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
149*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
150*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %sib, %bc2
151*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and1, %and2
152*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap3(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap3(
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64>
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64>
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32>
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32>
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]]
162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64>
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[OR]]
164*9880d681SAndroid Build Coastguard Worker;
165*9880d681SAndroid Build Coastguard Worker  %sia = fptosi <2 x double> %a to <2 x i64>
166*9880d681SAndroid Build Coastguard Worker  %sib = fptosi <2 x double> %b to <2 x i64>
167*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
168*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
169*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %bc1, %sia
170*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
171*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
172*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %sib, %bc2
173*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and2, %and1
174*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap4(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) {
178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap4(
179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64>
180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64>
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32>
182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32>
183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]]
184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64>
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[OR]]
186*9880d681SAndroid Build Coastguard Worker;
187*9880d681SAndroid Build Coastguard Worker  %sia = fptosi <2 x double> %a to <2 x i64>
188*9880d681SAndroid Build Coastguard Worker  %sib = fptosi <2 x double> %b to <2 x i64>
189*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
190*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
191*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %sia, %bc1
192*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
193*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
194*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %bc2, %sib
195*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and1, %and2
196*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap5(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) {
200*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap5(
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64>
202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64>
203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32>
204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32>
205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]]
206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64>
207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[OR]]
208*9880d681SAndroid Build Coastguard Worker;
209*9880d681SAndroid Build Coastguard Worker  %sia = fptosi <2 x double> %a to <2 x i64>
210*9880d681SAndroid Build Coastguard Worker  %sib = fptosi <2 x double> %b to <2 x i64>
211*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
212*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
213*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %sia, %bc1
214*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
215*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
216*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %bc2, %sib
217*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and2, %and1
218*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap6(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) {
222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap6(
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64>
224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64>
225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32>
226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32>
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]]
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64>
229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[OR]]
230*9880d681SAndroid Build Coastguard Worker;
231*9880d681SAndroid Build Coastguard Worker  %sia = fptosi <2 x double> %a to <2 x i64>
232*9880d681SAndroid Build Coastguard Worker  %sib = fptosi <2 x double> %b to <2 x i64>
233*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
234*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
235*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %sia, %bc1
236*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
237*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
238*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %sib, %bc2
239*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and1, %and2
240*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_swap7(<4 x i1> %cmp, <2 x double> %a, <2 x double> %b) {
244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_swap7(
245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIA:%.*]] = fptosi <2 x double> %a to <2 x i64>
246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SIB:%.*]] = fptosi <2 x double> %b to <2 x i64>
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[SIA]] to <4 x i32>
248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <2 x i64> [[SIB]] to <4 x i32>
249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %cmp, <4 x i32> [[TMP1]], <4 x i32> [[TMP2]]
250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = bitcast <4 x i32> [[TMP3]] to <2 x i64>
251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[OR]]
252*9880d681SAndroid Build Coastguard Worker;
253*9880d681SAndroid Build Coastguard Worker  %sia = fptosi <2 x double> %a to <2 x i64>
254*9880d681SAndroid Build Coastguard Worker  %sib = fptosi <2 x double> %b to <2 x i64>
255*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
256*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
257*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %sia, %bc1
258*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
259*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
260*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %sib, %bc2
261*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and2, %and1
262*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
263*9880d681SAndroid Build Coastguard Worker}
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bitcast_select_multi_uses(<4 x i1> %cmp, <2 x i64> %a, <2 x i64> %b) {
266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_select_multi_uses(
267*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SEXT:%.*]] = sext <4 x i1> %cmp to <4 x i32>
268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[BC1:%.*]] = bitcast <4 x i32> [[SEXT]] to <2 x i64>
269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND1:%.*]] = and <2 x i64> [[BC1]], %a
270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[NEG:%.*]] = xor <4 x i32> [[SEXT]], <i32 -1, i32 -1, i32 -1, i32 -1>
271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[BC2:%.*]] = bitcast <4 x i32> [[NEG]] to <2 x i64>
272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND2:%.*]] = and <2 x i64> [[BC2]], %b
273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = or <2 x i64> [[AND2]], [[AND1]]
274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ADD:%.*]] = add <2 x i64> [[AND2]], [[BC2]]
275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB:%.*]] = sub <2 x i64> [[OR]], [[ADD]]
276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[SUB]]
277*9880d681SAndroid Build Coastguard Worker;
278*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
279*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i32> %sext to <2 x i64>
280*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %a, %bc1
281*9880d681SAndroid Build Coastguard Worker  %neg = xor <4 x i32> %sext, <i32 -1, i32 -1, i32 -1, i32 -1>
282*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i32> %neg to <2 x i64>
283*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %b, %bc2
284*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and2, %and1
285*9880d681SAndroid Build Coastguard Worker  %add = add <2 x i64> %and2, %bc2
286*9880d681SAndroid Build Coastguard Worker  %sub = sub <2 x i64> %or, %add
287*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub
288*9880d681SAndroid Build Coastguard Worker}
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Workerdefine i1 @bools(i1 %a, i1 %b, i1 %c) {
291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bools(
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = select i1 %c, i1 %b, i1 %a
293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
294*9880d681SAndroid Build Coastguard Worker;
295*9880d681SAndroid Build Coastguard Worker  %not = xor i1 %c, -1
296*9880d681SAndroid Build Coastguard Worker  %and1 = and i1 %not, %a
297*9880d681SAndroid Build Coastguard Worker  %and2 = and i1 %c, %b
298*9880d681SAndroid Build Coastguard Worker  %or = or i1 %and1, %and2
299*9880d681SAndroid Build Coastguard Worker  ret i1 %or
300*9880d681SAndroid Build Coastguard Worker}
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker; Form a select if we know we can get replace 2 simple logic ops.
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Workerdefine i1 @bools_multi_uses1(i1 %a, i1 %b, i1 %c) {
305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bools_multi_uses1(
306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[NOT:%.*]] = xor i1 %c, true
307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[NOT]], %a
308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = select i1 %c, i1 %b, i1 %a
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[XOR:%.*]] = xor i1 [[TMP1]], [[AND1]]
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[XOR]]
311*9880d681SAndroid Build Coastguard Worker;
312*9880d681SAndroid Build Coastguard Worker  %not = xor i1 %c, -1
313*9880d681SAndroid Build Coastguard Worker  %and1 = and i1 %not, %a
314*9880d681SAndroid Build Coastguard Worker  %and2 = and i1 %c, %b
315*9880d681SAndroid Build Coastguard Worker  %or = or i1 %and1, %and2
316*9880d681SAndroid Build Coastguard Worker  %xor = xor i1 %or, %and1
317*9880d681SAndroid Build Coastguard Worker  ret i1 %xor
318*9880d681SAndroid Build Coastguard Worker}
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker; Don't replace a cheap logic op with a potentially expensive select
321*9880d681SAndroid Build Coastguard Worker; unless we can also eliminate one of the other original ops.
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Workerdefine i1 @bools_multi_uses2(i1 %a, i1 %b, i1 %c) {
324*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bools_multi_uses2(
325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[NOT:%.*]] = xor i1 %c, true
326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[NOT]], %a
327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND2:%.*]] = and i1 %c, %b
328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ADD:%.*]] = xor i1 [[AND1]], [[AND2]]
329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[ADD]]
330*9880d681SAndroid Build Coastguard Worker;
331*9880d681SAndroid Build Coastguard Worker  %not = xor i1 %c, -1
332*9880d681SAndroid Build Coastguard Worker  %and1 = and i1 %not, %a
333*9880d681SAndroid Build Coastguard Worker  %and2 = and i1 %c, %b
334*9880d681SAndroid Build Coastguard Worker  %or = or i1 %and1, %and2
335*9880d681SAndroid Build Coastguard Worker  %add = add i1 %and1, %and2
336*9880d681SAndroid Build Coastguard Worker  %and3 = and i1 %or, %add
337*9880d681SAndroid Build Coastguard Worker  ret i1 %and3
338*9880d681SAndroid Build Coastguard Worker}
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Workerdefine <4 x i1> @vec_of_bools(<4 x i1> %a, <4 x i1> %b, <4 x i1> %c) {
341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_of_bools(
342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = select <4 x i1> %c, <4 x i1> %b, <4 x i1> %a
343*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i1> [[TMP1]]
344*9880d681SAndroid Build Coastguard Worker;
345*9880d681SAndroid Build Coastguard Worker  %not = xor <4 x i1> %c, <i1 true, i1 true, i1 true, i1 true>
346*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i1> %not, %a
347*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i1> %b, %c
348*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i1> %and2, %and1
349*9880d681SAndroid Build Coastguard Worker  ret <4 x i1> %or
350*9880d681SAndroid Build Coastguard Worker}
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Workerdefine i4 @vec_of_casted_bools(i4 %a, i4 %b, <4 x i1> %c) {
353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_of_casted_bools(
354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i4 %a to <4 x i1>
355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i4 %b to <4 x i1>
356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = select <4 x i1> %c, <4 x i1> [[TMP2]], <4 x i1> [[TMP1]]
357*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i4 [[TMP4]]
359*9880d681SAndroid Build Coastguard Worker;
360*9880d681SAndroid Build Coastguard Worker  %not = xor <4 x i1> %c, <i1 true, i1 true, i1 true, i1 true>
361*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x i1> %not to i4
362*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x i1> %c to i4
363*9880d681SAndroid Build Coastguard Worker  %and1 = and i4 %a, %bc1
364*9880d681SAndroid Build Coastguard Worker  %and2 = and i4 %bc2, %b
365*9880d681SAndroid Build Coastguard Worker  %or = or i4 %and1, %and2
366*9880d681SAndroid Build Coastguard Worker  ret i4 %or
367*9880d681SAndroid Build Coastguard Worker}
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker; Inverted 'and' constants mean this is a select.
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vec_sel_consts(<4 x i32> %a, <4 x i32> %b) {
372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_sel_consts(
373*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = select <4 x i1> <i1 true, i1 false, i1 false, i1 true>, <4 x i32> %a, <4 x i32> %b
374*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[TMP1]]
375*9880d681SAndroid Build Coastguard Worker;
376*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %a, <i32 -1, i32 0, i32 0, i32 -1>
377*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %b, <i32 0, i32 -1, i32 -1, i32 0>
378*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
379*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
380*9880d681SAndroid Build Coastguard Worker}
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Worker; The select condition constant is always derived from the first operand of the 'or'.
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Workerdefine <3 x i129> @vec_sel_consts_weird(<3 x i129> %a, <3 x i129> %b) {
385*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_sel_consts_weird(
386*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = select <3 x i1> <i1 false, i1 true, i1 false>, <3 x i129> %b, <3 x i129> %a
387*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <3 x i129> [[TMP1]]
388*9880d681SAndroid Build Coastguard Worker;
389*9880d681SAndroid Build Coastguard Worker  %and1 = and <3 x i129> %a, <i129 -1, i129 0, i129 -1>
390*9880d681SAndroid Build Coastguard Worker  %and2 = and <3 x i129> %b, <i129 0, i129 -1, i129 0>
391*9880d681SAndroid Build Coastguard Worker  %or = or <3 x i129> %and2, %and1
392*9880d681SAndroid Build Coastguard Worker  ret <3 x i129> %or
393*9880d681SAndroid Build Coastguard Worker}
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker; The mask elements must be inverted for this to be a select.
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vec_not_sel_consts(<4 x i32> %a, <4 x i32> %b) {
398*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_not_sel_consts(
399*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND1:%.*]] = and <4 x i32> %a, <i32 -1, i32 0, i32 0, i32 0>
400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND2:%.*]] = and <4 x i32> %b, <i32 0, i32 -1, i32 0, i32 -1>
401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = or <4 x i32> [[AND1]], [[AND2]]
402*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[OR]]
403*9880d681SAndroid Build Coastguard Worker;
404*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %a, <i32 -1, i32 0, i32 0, i32 0>
405*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %b, <i32 0, i32 -1, i32 0, i32 -1>
406*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
407*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
408*9880d681SAndroid Build Coastguard Worker}
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard Worker; The inverted constants may be operands of xor instructions.
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vec_sel_xor(<4 x i32> %a, <4 x i32> %b, <4 x i1> %c) {
413*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_sel_xor(
414*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i1> %c, <i1 false, i1 true, i1 true, i1 true>
415*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = select <4 x i1> [[TMP1]], <4 x i32> %a, <4 x i32> %b
416*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[TMP2]]
417*9880d681SAndroid Build Coastguard Worker;
418*9880d681SAndroid Build Coastguard Worker  %mask = sext <4 x i1> %c to <4 x i32>
419*9880d681SAndroid Build Coastguard Worker  %mask_flip1 = xor <4 x i32> %mask, <i32 -1, i32 0, i32 0, i32 0>
420*9880d681SAndroid Build Coastguard Worker  %not_mask_flip1 = xor <4 x i32> %mask, <i32 0, i32 -1, i32 -1, i32 -1>
421*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %not_mask_flip1, %a
422*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %mask_flip1, %b
423*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
424*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
425*9880d681SAndroid Build Coastguard Worker}
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Worker; Allow the transform even if the mask values have multiple uses because
428*9880d681SAndroid Build Coastguard Worker; there's still a net reduction of instructions from removing the and/and/or.
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vec_sel_xor_multi_use(<4 x i32> %a, <4 x i32> %b, <4 x i1> %c) {
431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_sel_xor_multi_use(
432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MASK:%.*]] = sext <4 x i1> %c to <4 x i32>
433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MASK_FLIP1:%.*]] = xor <4 x i32> [[MASK]], <i32 -1, i32 0, i32 0, i32 0>
434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = xor <4 x i1> %c, <i1 false, i1 true, i1 true, i1 true>
435*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = select <4 x i1> [[TMP1]], <4 x i32> %a, <4 x i32> %b
436*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ADD:%.*]] = add <4 x i32> [[TMP2]], [[MASK_FLIP1]]
437*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[ADD]]
438*9880d681SAndroid Build Coastguard Worker;
439*9880d681SAndroid Build Coastguard Worker  %mask = sext <4 x i1> %c to <4 x i32>
440*9880d681SAndroid Build Coastguard Worker  %mask_flip1 = xor <4 x i32> %mask, <i32 -1, i32 0, i32 0, i32 0>
441*9880d681SAndroid Build Coastguard Worker  %not_mask_flip1 = xor <4 x i32> %mask, <i32 0, i32 -1, i32 -1, i32 -1>
442*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %not_mask_flip1, %a
443*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %mask_flip1, %b
444*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
445*9880d681SAndroid Build Coastguard Worker  %add = add <4 x i32> %or, %mask_flip1
446*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %add
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449