1*fc8d3766SFlorian Hahn // RUN: %clang_cc1 %s -triple x86_64-linux-gnu -Wno-unused -std=c++11 -emit-llvm -o - | FileCheck %s
2*fc8d3766SFlorian Hahn 
3*fc8d3766SFlorian Hahn using FourShorts = short __attribute__((__vector_size__(8)));
4*fc8d3766SFlorian Hahn using TwoInts = int __attribute__((__vector_size__(8)));
5*fc8d3766SFlorian Hahn using TwoUInts = unsigned __attribute__((__vector_size__(8)));
6*fc8d3766SFlorian Hahn using FourInts = int __attribute__((__vector_size__(16)));
7*fc8d3766SFlorian Hahn using FourUInts = unsigned __attribute__((__vector_size__(16)));
8*fc8d3766SFlorian Hahn using TwoLongLong = long long __attribute__((__vector_size__(16)));
9*fc8d3766SFlorian Hahn using FourLongLong = long long __attribute__((__vector_size__(32)));
10*fc8d3766SFlorian Hahn using TwoFloats = float __attribute__((__vector_size__(8)));
11*fc8d3766SFlorian Hahn using FourFloats = float __attribute__((__vector_size__(16)));
12*fc8d3766SFlorian Hahn using TwoDoubles = double __attribute__((__vector_size__(16)));
13*fc8d3766SFlorian Hahn using FourDoubles = double __attribute__((__vector_size__(32)));
14*fc8d3766SFlorian Hahn 
15*fc8d3766SFlorian Hahn FourShorts four_shorts;
16*fc8d3766SFlorian Hahn TwoInts two_ints;
17*fc8d3766SFlorian Hahn TwoUInts two_uints;
18*fc8d3766SFlorian Hahn FourInts four_ints;
19*fc8d3766SFlorian Hahn FourUInts four_uints;
20*fc8d3766SFlorian Hahn TwoLongLong two_ll;
21*fc8d3766SFlorian Hahn FourLongLong four_ll;
22*fc8d3766SFlorian Hahn TwoFloats two_floats;
23*fc8d3766SFlorian Hahn FourFloats four_floats;
24*fc8d3766SFlorian Hahn TwoDoubles two_doubles;
25*fc8d3766SFlorian Hahn FourDoubles four_doubles;
26*fc8d3766SFlorian Hahn 
27*fc8d3766SFlorian Hahn short some_short;
28*fc8d3766SFlorian Hahn unsigned short some_ushort;
29*fc8d3766SFlorian Hahn int some_int;
30*fc8d3766SFlorian Hahn float some_float;
31*fc8d3766SFlorian Hahn unsigned int some_uint;
32*fc8d3766SFlorian Hahn long long some_ll;
33*fc8d3766SFlorian Hahn unsigned long long some_ull;
34*fc8d3766SFlorian Hahn double some_double;
35*fc8d3766SFlorian Hahn 
36*fc8d3766SFlorian Hahn // CHECK: TwoVectorOps
TwoVectorOps()37*fc8d3766SFlorian Hahn void TwoVectorOps() {
38*fc8d3766SFlorian Hahn   two_ints ? two_ints : two_ints;
39*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <2 x i32>
40*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <2 x i32>
41*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load <2 x i32>
42*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <2 x i32> %[[COND]], zeroinitializer
43*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <2 x i1> %[[NEZERO]], <2 x i32> %[[LHS]], <2 x i32> %[[RHS]]
44*fc8d3766SFlorian Hahn 
45*fc8d3766SFlorian Hahn   two_ints ? two_floats : two_floats;
46*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <2 x i32>
47*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <2 x float>
48*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load <2 x float>
49*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <2 x i32> %[[COND]], zeroinitializer
50*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <2 x i1> %[[NEZERO]], <2 x float> %[[LHS]], <2 x float> %[[RHS]]
51*fc8d3766SFlorian Hahn 
52*fc8d3766SFlorian Hahn   two_ll ? two_doubles : two_doubles;
53*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <2 x i64>
54*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <2 x double>
55*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load <2 x double>
56*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <2 x i64> %[[COND]], zeroinitializer
57*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <2 x i1> %[[NEZERO]], <2 x double> %[[LHS]], <2 x double> %[[RHS]]
58*fc8d3766SFlorian Hahn }
59*fc8d3766SFlorian Hahn 
60*fc8d3766SFlorian Hahn // CHECK: TwoScalarOps
TwoScalarOps()61*fc8d3766SFlorian Hahn void TwoScalarOps() {
62*fc8d3766SFlorian Hahn   four_shorts ? some_short : some_short;
63*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i16>
64*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load i16
65*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT_INSERT:.+]] = insertelement <4 x i16> poison, i16 %[[LHS]], i32 0
66*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT:.+]] = shufflevector <4 x i16> %[[LHS_SPLAT_INSERT]], <4 x i16> poison, <4 x i32> zeroinitializer
67*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load i16
68*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i16> poison, i16 %[[RHS]], i32 0
69*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i16> %[[RHS_SPLAT_INSERT]], <4 x i16> poison, <4 x i32> zeroinitializer
70*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i16> %[[COND]], zeroinitializer
71*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i16> %[[LHS_SPLAT]], <4 x i16> %[[RHS_SPLAT]]
72*fc8d3766SFlorian Hahn 
73*fc8d3766SFlorian Hahn   four_shorts ? some_ushort : some_ushort;
74*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i16>
75*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load i16
76*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT_INSERT:.+]] = insertelement <4 x i16> poison, i16 %[[LHS]], i32 0
77*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT:.+]] = shufflevector <4 x i16> %[[LHS_SPLAT_INSERT]], <4 x i16> poison, <4 x i32> zeroinitializer
78*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load i16
79*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i16> poison, i16 %[[RHS]], i32 0
80*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i16> %[[RHS_SPLAT_INSERT]], <4 x i16> poison, <4 x i32> zeroinitializer
81*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i16> %[[COND]], zeroinitializer
82*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i16> %[[LHS_SPLAT]], <4 x i16> %[[RHS_SPLAT]]
83*fc8d3766SFlorian Hahn 
84*fc8d3766SFlorian Hahn   four_ints ? some_ushort : some_short;
85*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
86*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load i16
87*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_ZEXT:.+]] = zext i16 %[[LHS]] to i32
88*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT_INSERT:.+]] = insertelement <4 x i32> poison, i32 %[[LHS_ZEXT]], i32 0
89*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT:.+]] = shufflevector <4 x i32> %[[LHS_SPLAT_INSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
90*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load i16
91*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SEXT:.+]] = sext i16 %[[RHS]] to i32
92*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i32> poison, i32 %[[RHS_SEXT]], i32 0
93*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i32> %[[RHS_SPLAT_INSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
94*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
95*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i32> %[[LHS_SPLAT]], <4 x i32> %[[RHS_SPLAT]]
96*fc8d3766SFlorian Hahn 
97*fc8d3766SFlorian Hahn   four_ints ? some_int : some_float;
98*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
99*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load i32
100*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_CONV:.+]] = sitofp i32 %[[LHS]] to float
101*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT_INSERT:.+]] = insertelement <4 x float> poison, float %[[LHS_CONV]], i32 0
102*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT:.+]] = shufflevector <4 x float> %[[LHS_SPLAT_INSERT]], <4 x float> poison, <4 x i32> zeroinitializer
103*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load float
104*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x float> poison, float %[[RHS]], i32 0
105*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x float> %[[RHS_SPLAT_INSERT]], <4 x float> poison, <4 x i32> zeroinitializer
106*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
107*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x float> %[[LHS_SPLAT]], <4 x float> %[[RHS_SPLAT]]
108*fc8d3766SFlorian Hahn 
109*fc8d3766SFlorian Hahn   four_ll ? some_double : some_ll;
110*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i64>
111*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load double
112*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT_INSERT:.+]] = insertelement <4 x double> poison, double %[[LHS]], i32 0
113*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT:.+]] = shufflevector <4 x double> %[[LHS_SPLAT_INSERT]], <4 x double> poison, <4 x i32> zeroinitializer
114*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load i64
115*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_CONV:.+]] = sitofp i64 %[[RHS]] to double
116*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x double> poison, double %[[RHS_CONV]], i32 0
117*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x double> %[[RHS_SPLAT_INSERT]], <4 x double> poison, <4 x i32> zeroinitializer
118*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i64> %[[COND]], zeroinitializer
119*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x double> %[[LHS_SPLAT]], <4 x double> %[[RHS_SPLAT]]
120*fc8d3766SFlorian Hahn 
121*fc8d3766SFlorian Hahn   four_ints ? some_int : some_short;
122*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
123*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load i32
124*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT_INSERT:.+]] = insertelement <4 x i32> poison, i32 %[[LHS]], i32 0
125*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT:.+]] = shufflevector <4 x i32> %[[LHS_SPLAT_INSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
126*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load i16
127*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SEXT:.+]] = sext i16 %[[RHS]] to i32
128*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i32> poison, i32 %[[RHS_SEXT]], i32 0
129*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i32> %[[RHS_SPLAT_INSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
130*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
131*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i32> %[[LHS_SPLAT]], <4 x i32> %[[RHS_SPLAT]]
132*fc8d3766SFlorian Hahn }
133*fc8d3766SFlorian Hahn 
134*fc8d3766SFlorian Hahn // CHECK: OneScalarOp
OneScalarOp()135*fc8d3766SFlorian Hahn void OneScalarOp() {
136*fc8d3766SFlorian Hahn   four_ints ? four_ints : some_int;
137*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
138*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x i32>
139*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load i32
140*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i32> poison, i32 %[[RHS]], i32 0
141*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i32> %[[RHS_SPLAT_INSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
142*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
143*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i32> %[[LHS]], <4 x i32> %[[RHS_SPLAT]]
144*fc8d3766SFlorian Hahn 
145*fc8d3766SFlorian Hahn   four_ints ? four_ints : 5;
146*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
147*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x i32>
148*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
149*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i32> %[[LHS]], <4 x i32> <i32 5, i32 5, i32 5, i32 5>
150*fc8d3766SFlorian Hahn 
151*fc8d3766SFlorian Hahn   four_ints ?: some_float;
152*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
153*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load float
154*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_CONV:.+]] = fptosi float %[[RHS]] to i32
155*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i32> poison, i32 %[[RHS_CONV]], i32 0
156*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i32> %[[RHS_SPLAT_INSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
157*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
158*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i32> %[[COND]], <4 x i32> %[[RHS_SPLAT]]
159*fc8d3766SFlorian Hahn 
160*fc8d3766SFlorian Hahn   four_ints ? four_ints : 5.0f;
161*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
162*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x i32>
163*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
164*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i32> %[[LHS]], <4 x i32> <i32 5, i32 5, i32 5, i32 5>
165*fc8d3766SFlorian Hahn 
166*fc8d3766SFlorian Hahn   four_ints ? some_float : four_ints;
167*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
168*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load float
169*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_CONV:.+]] = fptosi float %[[LHS]] to i32
170*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT_INSERT:.+]] = insertelement <4 x i32> poison, i32 %[[LHS_CONV]], i32 0
171*fc8d3766SFlorian Hahn   // CHECK: %[[LHS_SPLAT:.+]] = shufflevector <4 x i32> %[[LHS_SPLAT_INSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
172*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load <4 x i32>
173*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
174*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i32> %[[LHS_SPLAT]], <4 x i32> %[[RHS]]
175*fc8d3766SFlorian Hahn 
176*fc8d3766SFlorian Hahn   four_ints ? four_floats : some_float;
177*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i32>
178*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x float>
179*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load float
180*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x float> poison, float %[[RHS]], i32 0
181*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x float> %[[RHS_SPLAT_INSERT]], <4 x float> poison, <4 x i32> zeroinitializer
182*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i32> %[[COND]], zeroinitializer
183*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x float> %[[LHS]], <4 x float> %[[RHS_SPLAT]]
184*fc8d3766SFlorian Hahn 
185*fc8d3766SFlorian Hahn   four_ll ? four_doubles : 6.0;
186*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i64>
187*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x double>
188*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i64> %[[COND]], zeroinitializer
189*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x double> %[[LHS]], <4 x double> <double 6.{{.+}}, double 6.{{.+}}, double 6.{{.+}}>
190*fc8d3766SFlorian Hahn 
191*fc8d3766SFlorian Hahn   four_ll ? four_ll : 6.0;
192*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i64>
193*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x i64>
194*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i64> %[[COND]], zeroinitializer
195*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i64> %[[LHS]], <4 x i64> <i64 6, i64 6, i64 6, i64 6>
196*fc8d3766SFlorian Hahn 
197*fc8d3766SFlorian Hahn   four_ll ? four_ll : 6;
198*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i64>
199*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x i64>
200*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i64> %[[COND]], zeroinitializer
201*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i64> %[[LHS]], <4 x i64> <i64 6, i64 6, i64 6, i64 6>
202*fc8d3766SFlorian Hahn 
203*fc8d3766SFlorian Hahn   four_ll ? four_ll : some_int;
204*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i64>
205*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x i64>
206*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load i32
207*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_CONV:.+]] = sext i32 %[[RHS]] to i64
208*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i64> poison, i64 %[[RHS_CONV]], i32 0
209*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i64> %[[RHS_SPLAT_INSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
210*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i64> %[[COND]], zeroinitializer
211*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i64> %[[LHS]], <4 x i64> %[[RHS_SPLAT]]
212*fc8d3766SFlorian Hahn 
213*fc8d3766SFlorian Hahn   four_ll ? four_ll : some_ll;
214*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i64>
215*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x i64>
216*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load i64
217*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i64> poison, i64 %[[RHS]], i32 0
218*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i64> %[[RHS_SPLAT_INSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
219*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i64> %[[COND]], zeroinitializer
220*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i64> %[[LHS]], <4 x i64> %[[RHS_SPLAT]]
221*fc8d3766SFlorian Hahn 
222*fc8d3766SFlorian Hahn   four_ll ? four_ll : some_double;
223*fc8d3766SFlorian Hahn   // CHECK: %[[COND:.+]] = load <4 x i64>
224*fc8d3766SFlorian Hahn   // CHECK: %[[LHS:.+]] = load <4 x i64>
225*fc8d3766SFlorian Hahn   // CHECK: %[[RHS:.+]] = load double
226*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_CONV:.+]] = fptosi double %[[RHS]] to i64
227*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT_INSERT:.+]] = insertelement <4 x i64> poison, i64 %[[RHS_CONV]], i32 0
228*fc8d3766SFlorian Hahn   // CHECK: %[[RHS_SPLAT:.+]] = shufflevector <4 x i64> %[[RHS_SPLAT_INSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
229*fc8d3766SFlorian Hahn   // CHECK: %[[NEZERO:.+]] = icmp ne <4 x i64> %[[COND]], zeroinitializer
230*fc8d3766SFlorian Hahn   // CHECK: %[[SELECT:.+]] = select <4 x i1> %[[NEZERO]], <4 x i64> %[[LHS]], <4 x i64> %[[RHS_SPLAT]]
231*fc8d3766SFlorian Hahn }
232