• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -vector-combine -S -mtriple=x86_64-- -mattr=SSE2 | FileCheck %s --check-prefixes=CHECK,SSE
3; RUN: opt < %s -vector-combine -S -mtriple=x86_64-- -mattr=AVX2 | FileCheck %s --check-prefixes=CHECK,AVX
4
5define <2 x i64> @add_constant(i64 %x) {
6; CHECK-LABEL: @add_constant(
7; CHECK-NEXT:    [[BO_SCALAR:%.*]] = add i64 [[X:%.*]], 42
8; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
9; CHECK-NEXT:    ret <2 x i64> [[BO]]
10;
11  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
12  %bo = add <2 x i64> %ins, <i64 42, i64 undef>
13  ret <2 x i64> %bo
14}
15
16define <2 x i64> @add_constant_not_undef_lane(i64 %x) {
17; CHECK-LABEL: @add_constant_not_undef_lane(
18; CHECK-NEXT:    [[BO_SCALAR:%.*]] = add i64 [[X:%.*]], 42
19; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
20; CHECK-NEXT:    ret <2 x i64> [[BO]]
21;
22  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
23  %bo = add <2 x i64> %ins, <i64 42, i64 -42>
24  ret <2 x i64> %bo
25}
26
27define <2 x i64> @add_constant_load(i64* %p) {
28; CHECK-LABEL: @add_constant_load(
29; CHECK-NEXT:    [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4
30; CHECK-NEXT:    [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 0
31; CHECK-NEXT:    [[BO:%.*]] = add <2 x i64> [[INS]], <i64 42, i64 -42>
32; CHECK-NEXT:    ret <2 x i64> [[BO]]
33;
34  %ld = load i64, i64* %p
35  %ins = insertelement <2 x i64> undef, i64 %ld, i32 0
36  %bo = add <2 x i64> %ins, <i64 42, i64 -42>
37  ret <2 x i64> %bo
38}
39
40; IR flags are not required, but they should propagate.
41
42define <4 x i32> @sub_constant_op0(i32 %x) {
43; CHECK-LABEL: @sub_constant_op0(
44; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sub nuw nsw i32 -42, [[X:%.*]]
45; CHECK-NEXT:    [[BO:%.*]] = insertelement <4 x i32> undef, i32 [[BO_SCALAR]], i64 1
46; CHECK-NEXT:    ret <4 x i32> [[BO]]
47;
48  %ins = insertelement <4 x i32> undef, i32 %x, i32 1
49  %bo = sub nsw nuw <4 x i32> <i32 undef, i32 -42, i32 undef, i32 undef>, %ins
50  ret <4 x i32> %bo
51}
52
53define <4 x i32> @sub_constant_op0_not_undef_lane(i32 %x) {
54; CHECK-LABEL: @sub_constant_op0_not_undef_lane(
55; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sub nuw i32 42, [[X:%.*]]
56; CHECK-NEXT:    [[BO:%.*]] = insertelement <4 x i32> undef, i32 [[BO_SCALAR]], i64 1
57; CHECK-NEXT:    ret <4 x i32> [[BO]]
58;
59  %ins = insertelement <4 x i32> undef, i32 %x, i32 1
60  %bo = sub nuw <4 x i32> <i32 1, i32 42, i32 42, i32 -42>, %ins
61  ret <4 x i32> %bo
62}
63
64define <8 x i16> @sub_constant_op1(i16 %x) {
65; CHECK-LABEL: @sub_constant_op1(
66; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sub nuw i16 [[X:%.*]], 42
67; CHECK-NEXT:    [[BO:%.*]] = insertelement <8 x i16> undef, i16 [[BO_SCALAR]], i64 0
68; CHECK-NEXT:    ret <8 x i16> [[BO]]
69;
70  %ins = insertelement <8 x i16> undef, i16 %x, i32 0
71  %bo = sub nuw <8 x i16> %ins, <i16 42, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef>
72  ret <8 x i16> %bo
73}
74
75define <8 x i16> @sub_constant_op1_not_undef_lane(i16 %x) {
76; CHECK-LABEL: @sub_constant_op1_not_undef_lane(
77; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sub nuw i16 [[X:%.*]], 42
78; CHECK-NEXT:    [[BO:%.*]] = insertelement <8 x i16> undef, i16 [[BO_SCALAR]], i64 0
79; CHECK-NEXT:    ret <8 x i16> [[BO]]
80;
81  %ins = insertelement <8 x i16> undef, i16 %x, i32 0
82  %bo = sub nuw <8 x i16> %ins, <i16 42, i16 -42, i16 0, i16 1, i16 -2, i16 3, i16 -4, i16 5>
83  ret <8 x i16> %bo
84}
85
86define <16 x i8> @mul_constant(i8 %x) {
87; CHECK-LABEL: @mul_constant(
88; CHECK-NEXT:    [[BO_SCALAR:%.*]] = mul i8 [[X:%.*]], -42
89; CHECK-NEXT:    [[BO:%.*]] = insertelement <16 x i8> <i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 [[BO_SCALAR]], i64 2
90; CHECK-NEXT:    ret <16 x i8> [[BO]]
91;
92  %ins = insertelement <16 x i8> undef, i8 %x, i32 2
93  %bo = mul <16 x i8> %ins, <i8 undef, i8 undef, i8 -42, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>
94  ret <16 x i8> %bo
95}
96
97define <3 x i64> @mul_constant_not_undef_lane(i64 %x) {
98; CHECK-LABEL: @mul_constant_not_undef_lane(
99; CHECK-NEXT:    [[BO_SCALAR:%.*]] = mul i64 [[X:%.*]], -42
100; CHECK-NEXT:    [[BO:%.*]] = insertelement <3 x i64> <i64 0, i64 undef, i64 0>, i64 [[BO_SCALAR]], i64 2
101; CHECK-NEXT:    ret <3 x i64> [[BO]]
102;
103  %ins = insertelement <3 x i64> undef, i64 %x, i32 2
104  %bo = mul <3 x i64> %ins, <i64 42, i64 undef, i64 -42>
105  ret <3 x i64> %bo
106}
107
108define <16 x i8> @mul_constant_multiuse(i8 %a0, <16 x i8> %a1) {
109; SSE-LABEL: @mul_constant_multiuse(
110; SSE-NEXT:    [[INS:%.*]] = insertelement <16 x i8> <i8 undef, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, i8 [[A0:%.*]], i32 0
111; SSE-NEXT:    [[MUL:%.*]] = mul <16 x i8> [[INS]], <i8 3, i8 7, i8 9, i8 11, i8 13, i8 15, i8 17, i8 19, i8 21, i8 23, i8 25, i8 27, i8 29, i8 31, i8 33, i8 35>
112; SSE-NEXT:    [[AND:%.*]] = and <16 x i8> [[INS]], [[A1:%.*]]
113; SSE-NEXT:    [[XOR:%.*]] = xor <16 x i8> [[AND]], [[MUL]]
114; SSE-NEXT:    ret <16 x i8> [[XOR]]
115;
116; AVX-LABEL: @mul_constant_multiuse(
117; AVX-NEXT:    [[INS:%.*]] = insertelement <16 x i8> <i8 undef, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, i8 [[A0:%.*]], i32 0
118; AVX-NEXT:    [[MUL_SCALAR:%.*]] = mul i8 [[A0]], 3
119; AVX-NEXT:    [[MUL:%.*]] = insertelement <16 x i8> <i8 undef, i8 7, i8 18, i8 33, i8 52, i8 75, i8 102, i8 -123, i8 -88, i8 -49, i8 -6, i8 41, i8 92, i8 -109, i8 -50, i8 13>, i8 [[MUL_SCALAR]], i64 0
120; AVX-NEXT:    [[AND:%.*]] = and <16 x i8> [[INS]], [[A1:%.*]]
121; AVX-NEXT:    [[XOR:%.*]] = xor <16 x i8> [[AND]], [[MUL]]
122; AVX-NEXT:    ret <16 x i8> [[XOR]]
123;
124  %ins = insertelement <16 x i8> <i8 undef, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, i8 %a0, i32 0
125  %mul = mul <16 x i8> %ins, <i8 3, i8 7, i8 9, i8 11, i8 13, i8 15, i8 17, i8 19, i8 21, i8 23, i8 25, i8 27, i8 29, i8 31, i8 33, i8 35>
126  %and = and <16 x i8> %ins, %a1
127  %xor = xor <16 x i8> %and, %mul
128  ret <16 x i8> %xor
129}
130
131define <2 x i64> @shl_constant_op0(i64 %x) {
132; CHECK-LABEL: @shl_constant_op0(
133; CHECK-NEXT:    [[BO_SCALAR:%.*]] = shl i64 2, [[X:%.*]]
134; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1
135; CHECK-NEXT:    ret <2 x i64> [[BO]]
136;
137  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
138  %bo = shl <2 x i64> <i64 undef, i64 2>, %ins
139  ret <2 x i64> %bo
140}
141
142define <2 x i64> @shl_constant_op0_not_undef_lane(i64 %x) {
143; CHECK-LABEL: @shl_constant_op0_not_undef_lane(
144; CHECK-NEXT:    [[BO_SCALAR:%.*]] = shl i64 2, [[X:%.*]]
145; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1
146; CHECK-NEXT:    ret <2 x i64> [[BO]]
147;
148  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
149  %bo = shl <2 x i64> <i64 5, i64 2>, %ins
150  ret <2 x i64> %bo
151}
152
153define <2 x i64> @shl_constant_op0_load(i64* %p) {
154; CHECK-LABEL: @shl_constant_op0_load(
155; CHECK-NEXT:    [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4
156; CHECK-NEXT:    [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 1
157; CHECK-NEXT:    [[BO:%.*]] = shl <2 x i64> <i64 undef, i64 2>, [[INS]]
158; CHECK-NEXT:    ret <2 x i64> [[BO]]
159;
160  %ld = load i64, i64* %p
161  %ins = insertelement <2 x i64> undef, i64 %ld, i32 1
162  %bo = shl <2 x i64> <i64 undef, i64 2>, %ins
163  ret <2 x i64> %bo
164}
165
166define <4 x i32> @shl_constant_op0_multiuse(i32 %a0, <4 x i32> %a1) {
167; SSE-LABEL: @shl_constant_op0_multiuse(
168; SSE-NEXT:    [[INS:%.*]] = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 [[A0:%.*]], i32 0
169; SSE-NEXT:    [[MUL_SCALAR:%.*]] = shl i32 [[A0]], 3
170; SSE-NEXT:    [[MUL:%.*]] = insertelement <4 x i32> <i32 0, i32 16, i32 64, i32 192>, i32 [[MUL_SCALAR]], i64 0
171; SSE-NEXT:    [[AND:%.*]] = and <4 x i32> [[INS]], [[A1:%.*]]
172; SSE-NEXT:    [[XOR:%.*]] = xor <4 x i32> [[AND]], [[MUL]]
173; SSE-NEXT:    ret <4 x i32> [[XOR]]
174;
175; AVX-LABEL: @shl_constant_op0_multiuse(
176; AVX-NEXT:    [[INS:%.*]] = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 [[A0:%.*]], i32 0
177; AVX-NEXT:    [[MUL:%.*]] = shl <4 x i32> [[INS]], <i32 3, i32 4, i32 5, i32 6>
178; AVX-NEXT:    [[AND:%.*]] = and <4 x i32> [[INS]], [[A1:%.*]]
179; AVX-NEXT:    [[XOR:%.*]] = xor <4 x i32> [[AND]], [[MUL]]
180; AVX-NEXT:    ret <4 x i32> [[XOR]]
181;
182  %ins = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 %a0, i32 0
183  %mul = shl <4 x i32> %ins, <i32 3, i32 4, i32 5, i32 6>
184  %and = and <4 x i32> %ins, %a1
185  %xor = xor <4 x i32> %and, %mul
186  ret <4 x i32> %xor
187}
188
189define <2 x i64> @shl_constant_op1(i64 %x) {
190; CHECK-LABEL: @shl_constant_op1(
191; CHECK-NEXT:    [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5
192; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 poison>, i64 [[BO_SCALAR]], i64 0
193; CHECK-NEXT:    ret <2 x i64> [[BO]]
194;
195  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
196  %bo = shl nuw <2 x i64> %ins, <i64 5, i64 undef>
197  ret <2 x i64> %bo
198}
199
200define <2 x i64> @shl_constant_op1_not_undef_lane(i64 %x) {
201; CHECK-LABEL: @shl_constant_op1_not_undef_lane(
202; CHECK-NEXT:    [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5
203; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
204; CHECK-NEXT:    ret <2 x i64> [[BO]]
205;
206  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
207  %bo = shl nuw <2 x i64> %ins, <i64 5, i64 2>
208  ret <2 x i64> %bo
209}
210
211define <2 x i64> @shl_constant_op1_load(i64* %p) {
212; CHECK-LABEL: @shl_constant_op1_load(
213; CHECK-NEXT:    [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4
214; CHECK-NEXT:    [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 0
215; CHECK-NEXT:    [[BO:%.*]] = shl nuw <2 x i64> [[INS]], <i64 5, i64 2>
216; CHECK-NEXT:    ret <2 x i64> [[BO]]
217;
218  %ld = load i64, i64* %p
219  %ins = insertelement <2 x i64> undef, i64 %ld, i32 0
220  %bo = shl nuw <2 x i64> %ins, <i64 5, i64 2>
221  ret <2 x i64> %bo
222}
223
224define <2 x i64> @ashr_constant_op0(i64 %x) {
225; CHECK-LABEL: @ashr_constant_op0(
226; CHECK-NEXT:    [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]]
227; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1
228; CHECK-NEXT:    ret <2 x i64> [[BO]]
229;
230  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
231  %bo = ashr exact <2 x i64> <i64 undef, i64 2>, %ins
232  ret <2 x i64> %bo
233}
234
235define <2 x i64> @ashr_constant_op0_not_undef_lane(i64 %x) {
236; CHECK-LABEL: @ashr_constant_op0_not_undef_lane(
237; CHECK-NEXT:    [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]]
238; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1
239; CHECK-NEXT:    ret <2 x i64> [[BO]]
240;
241  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
242  %bo = ashr exact <2 x i64> <i64 5, i64 2>, %ins
243  ret <2 x i64> %bo
244}
245
246define <2 x i64> @ashr_constant_op1(i64 %x) {
247; CHECK-LABEL: @ashr_constant_op1(
248; CHECK-NEXT:    [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5
249; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 poison>, i64 [[BO_SCALAR]], i64 0
250; CHECK-NEXT:    ret <2 x i64> [[BO]]
251;
252  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
253  %bo = ashr <2 x i64> %ins, <i64 5, i64 undef>
254  ret <2 x i64> %bo
255}
256
257define <2 x i64> @ashr_constant_op1_not_undef_lane(i64 %x) {
258; CHECK-LABEL: @ashr_constant_op1_not_undef_lane(
259; CHECK-NEXT:    [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5
260; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
261; CHECK-NEXT:    ret <2 x i64> [[BO]]
262;
263  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
264  %bo = ashr <2 x i64> %ins, <i64 5, i64 2>
265  ret <2 x i64> %bo
266}
267
268define <2 x i64> @lshr_constant_op0(i64 %x) {
269; CHECK-LABEL: @lshr_constant_op0(
270; CHECK-NEXT:    [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]]
271; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
272; CHECK-NEXT:    ret <2 x i64> [[BO]]
273;
274  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
275  %bo = lshr <2 x i64> <i64 5, i64 undef>, %ins
276  ret <2 x i64> %bo
277}
278
279define <2 x i64> @lshr_constant_op0_not_undef_lane(i64 %x) {
280; CHECK-LABEL: @lshr_constant_op0_not_undef_lane(
281; CHECK-NEXT:    [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]]
282; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
283; CHECK-NEXT:    ret <2 x i64> [[BO]]
284;
285  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
286  %bo = lshr <2 x i64> <i64 5, i64 2>, %ins
287  ret <2 x i64> %bo
288}
289
290define <2 x i64> @lshr_constant_op1(i64 %x) {
291; CHECK-LABEL: @lshr_constant_op1(
292; CHECK-NEXT:    [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2
293; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
294; CHECK-NEXT:    ret <2 x i64> [[BO]]
295;
296  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
297  %bo = lshr exact <2 x i64> %ins, <i64 undef, i64 2>
298  ret <2 x i64> %bo
299}
300
301define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) {
302; CHECK-LABEL: @lshr_constant_op1_not_undef_lane(
303; CHECK-NEXT:    [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2
304; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
305; CHECK-NEXT:    ret <2 x i64> [[BO]]
306;
307  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
308  %bo = lshr exact <2 x i64> %ins, <i64 5, i64 2>
309  ret <2 x i64> %bo
310}
311
312define <2 x i64> @urem_constant_op0(i64 %x) {
313; CHECK-LABEL: @urem_constant_op0(
314; CHECK-NEXT:    [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
315; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
316; CHECK-NEXT:    ret <2 x i64> [[BO]]
317;
318  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
319  %bo = urem <2 x i64> <i64 5, i64 undef>, %ins
320  ret <2 x i64> %bo
321}
322
323define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) {
324; CHECK-LABEL: @urem_constant_op0_not_undef_lane(
325; CHECK-NEXT:    [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
326; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
327; CHECK-NEXT:    ret <2 x i64> [[BO]]
328;
329  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
330  %bo = urem <2 x i64> <i64 5, i64 2>, %ins
331  ret <2 x i64> %bo
332}
333
334define <2 x i64> @urem_constant_op1(i64 %x) {
335; CHECK-LABEL: @urem_constant_op1(
336; CHECK-NEXT:    [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2
337; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
338; CHECK-NEXT:    ret <2 x i64> [[BO]]
339;
340  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
341  %bo = urem <2 x i64> %ins, <i64 undef, i64 2>
342  ret <2 x i64> %bo
343}
344
345define <2 x i64> @urem_constant_op1_not_undef_lane(i64 %x) {
346; CHECK-LABEL: @urem_constant_op1_not_undef_lane(
347; CHECK-NEXT:    [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2
348; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
349; CHECK-NEXT:    ret <2 x i64> [[BO]]
350;
351  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
352  %bo = urem <2 x i64> %ins, <i64 5, i64 2>
353  ret <2 x i64> %bo
354}
355
356define <2 x i64> @srem_constant_op0(i64 %x) {
357; CHECK-LABEL: @srem_constant_op0(
358; CHECK-NEXT:    [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
359; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
360; CHECK-NEXT:    ret <2 x i64> [[BO]]
361;
362  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
363  %bo = srem <2 x i64> <i64 5, i64 undef>, %ins
364  ret <2 x i64> %bo
365}
366
367define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) {
368; CHECK-LABEL: @srem_constant_op0_not_undef_lane(
369; CHECK-NEXT:    [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
370; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
371; CHECK-NEXT:    ret <2 x i64> [[BO]]
372;
373  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
374  %bo = srem <2 x i64> <i64 5, i64 2>, %ins
375  ret <2 x i64> %bo
376}
377
378define <2 x i64> @srem_constant_op1(i64 %x) {
379; CHECK-LABEL: @srem_constant_op1(
380; CHECK-NEXT:    [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2
381; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
382; CHECK-NEXT:    ret <2 x i64> [[BO]]
383;
384  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
385  %bo = srem <2 x i64> %ins, <i64 undef, i64 2>
386  ret <2 x i64> %bo
387}
388
389define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) {
390; CHECK-LABEL: @srem_constant_op1_not_undef_lane(
391; CHECK-NEXT:    [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2
392; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
393; CHECK-NEXT:    ret <2 x i64> [[BO]]
394;
395  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
396  %bo = srem <2 x i64> %ins, <i64 5, i64 2>
397  ret <2 x i64> %bo
398}
399
400define <2 x i64> @udiv_constant_op0(i64 %x) {
401; CHECK-LABEL: @udiv_constant_op0(
402; CHECK-NEXT:    [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
403; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
404; CHECK-NEXT:    ret <2 x i64> [[BO]]
405;
406  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
407  %bo = udiv exact <2 x i64> <i64 5, i64 undef>, %ins
408  ret <2 x i64> %bo
409}
410
411define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) {
412; CHECK-LABEL: @udiv_constant_op0_not_undef_lane(
413; CHECK-NEXT:    [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
414; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
415; CHECK-NEXT:    ret <2 x i64> [[BO]]
416;
417  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
418  %bo = udiv exact <2 x i64> <i64 5, i64 2>, %ins
419  ret <2 x i64> %bo
420}
421
422define <2 x i64> @udiv_constant_op1(i64 %x) {
423; CHECK-LABEL: @udiv_constant_op1(
424; CHECK-NEXT:    [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2
425; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
426; CHECK-NEXT:    ret <2 x i64> [[BO]]
427;
428  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
429  %bo = udiv <2 x i64> %ins, <i64 undef, i64 2>
430  ret <2 x i64> %bo
431}
432
433define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) {
434; CHECK-LABEL: @udiv_constant_op1_not_undef_lane(
435; CHECK-NEXT:    [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2
436; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
437; CHECK-NEXT:    ret <2 x i64> [[BO]]
438;
439  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
440  %bo = udiv <2 x i64> %ins, <i64 5, i64 2>
441  ret <2 x i64> %bo
442}
443
444define <2 x i64> @sdiv_constant_op0(i64 %x) {
445; CHECK-LABEL: @sdiv_constant_op0(
446; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
447; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
448; CHECK-NEXT:    ret <2 x i64> [[BO]]
449;
450  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
451  %bo = sdiv <2 x i64> <i64 5, i64 undef>, %ins
452  ret <2 x i64> %bo
453}
454
455define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) {
456; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane(
457; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
458; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
459; CHECK-NEXT:    ret <2 x i64> [[BO]]
460;
461  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
462  %bo = sdiv <2 x i64> <i64 5, i64 2>, %ins
463  ret <2 x i64> %bo
464}
465
466define <2 x i64> @sdiv_constant_op1(i64 %x) {
467; CHECK-LABEL: @sdiv_constant_op1(
468; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2
469; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
470; CHECK-NEXT:    ret <2 x i64> [[BO]]
471;
472  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
473  %bo = sdiv exact <2 x i64> %ins, <i64 undef, i64 2>
474  ret <2 x i64> %bo
475}
476
477define <2 x i64> @sdiv_constant_op1_not_undef_lane(i64 %x) {
478; CHECK-LABEL: @sdiv_constant_op1_not_undef_lane(
479; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2
480; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
481; CHECK-NEXT:    ret <2 x i64> [[BO]]
482;
483  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
484  %bo = sdiv exact <2 x i64> %ins, <i64 5, i64 2>
485  ret <2 x i64> %bo
486}
487
488define <2 x i64> @and_constant(i64 %x) {
489; CHECK-LABEL: @and_constant(
490; CHECK-NEXT:    [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42
491; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 undef>, i64 [[BO_SCALAR]], i64 0
492; CHECK-NEXT:    ret <2 x i64> [[BO]]
493;
494  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
495  %bo = and <2 x i64> %ins, <i64 42, i64 undef>
496  ret <2 x i64> %bo
497}
498
499define <2 x i64> @and_constant_not_undef_lane(i64 %x) {
500; CHECK-LABEL: @and_constant_not_undef_lane(
501; CHECK-NEXT:    [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42
502; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
503; CHECK-NEXT:    ret <2 x i64> [[BO]]
504;
505  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
506  %bo = and <2 x i64> %ins, <i64 42, i64 -42>
507  ret <2 x i64> %bo
508}
509
510define <2 x i64> @or_constant(i64 %x) {
511; CHECK-LABEL: @or_constant(
512; CHECK-NEXT:    [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42
513; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 undef, i64 -1>, i64 [[BO_SCALAR]], i64 1
514; CHECK-NEXT:    ret <2 x i64> [[BO]]
515;
516  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
517  %bo = or <2 x i64> %ins, <i64 undef, i64 -42>
518  ret <2 x i64> %bo
519}
520
521define <2 x i64> @or_constant_not_undef_lane(i64 %x) {
522; CHECK-LABEL: @or_constant_not_undef_lane(
523; CHECK-NEXT:    [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42
524; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 -1, i64 -1>, i64 [[BO_SCALAR]], i64 1
525; CHECK-NEXT:    ret <2 x i64> [[BO]]
526;
527  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
528  %bo = or <2 x i64> %ins, <i64 42, i64 -42>
529  ret <2 x i64> %bo
530}
531
532define <2 x i64> @xor_constant(i64 %x) {
533; CHECK-LABEL: @xor_constant(
534; CHECK-NEXT:    [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42
535; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 undef, i64 0>, i64 [[BO_SCALAR]], i64 0
536; CHECK-NEXT:    ret <2 x i64> [[BO]]
537;
538  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
539  %bo = xor <2 x i64> %ins, <i64 42, i64 undef>
540  ret <2 x i64> %bo
541}
542
543define <2 x i64> @xor_constant_not_undef_lane(i64 %x) {
544; CHECK-LABEL: @xor_constant_not_undef_lane(
545; CHECK-NEXT:    [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42
546; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
547; CHECK-NEXT:    ret <2 x i64> [[BO]]
548;
549  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
550  %bo = xor <2 x i64> %ins, <i64 42, i64 -42>
551  ret <2 x i64> %bo
552}
553
554define <2 x double> @fadd_constant(double %x) {
555; CHECK-LABEL: @fadd_constant(
556; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], 4.200000e+01
557; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
558; CHECK-NEXT:    ret <2 x double> [[BO]]
559;
560  %ins = insertelement <2 x double> undef, double %x, i32 0
561  %bo = fadd <2 x double> %ins, <double 42.0, double undef>
562  ret <2 x double> %bo
563}
564
565define <2 x double> @fadd_constant_not_undef_lane(double %x) {
566; CHECK-LABEL: @fadd_constant_not_undef_lane(
567; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], -4.200000e+01
568; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
569; CHECK-NEXT:    ret <2 x double> [[BO]]
570;
571  %ins = insertelement <2 x double> undef, double %x, i32 1
572  %bo = fadd <2 x double> %ins, <double 42.0, double -42.0>
573  ret <2 x double> %bo
574}
575
576define <2 x double> @fsub_constant_op0(double %x) {
577; CHECK-LABEL: @fsub_constant_op0(
578; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fsub fast double 4.200000e+01, [[X:%.*]]
579; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
580; CHECK-NEXT:    ret <2 x double> [[BO]]
581;
582  %ins = insertelement <2 x double> undef, double %x, i32 0
583  %bo = fsub fast <2 x double> <double 42.0, double undef>, %ins
584  ret <2 x double> %bo
585}
586
587define <2 x double> @fsub_constant_op0_not_undef_lane(double %x) {
588; CHECK-LABEL: @fsub_constant_op0_not_undef_lane(
589; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fsub nsz double -4.200000e+01, [[X:%.*]]
590; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
591; CHECK-NEXT:    ret <2 x double> [[BO]]
592;
593  %ins = insertelement <2 x double> undef, double %x, i32 1
594  %bo = fsub nsz <2 x double> <double 42.0, double -42.0>, %ins
595  ret <2 x double> %bo
596}
597
598define <2 x double> @fsub_constant_op1(double %x) {
599; CHECK-LABEL: @fsub_constant_op1(
600; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01
601; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
602; CHECK-NEXT:    ret <2 x double> [[BO]]
603;
604  %ins = insertelement <2 x double> undef, double %x, i32 1
605  %bo = fsub <2 x double> %ins, <double undef, double 42.0>
606  ret <2 x double> %bo
607}
608
609define <2 x double> @fsub_constant_op1_not_undef_lane(double %x) {
610; CHECK-LABEL: @fsub_constant_op1_not_undef_lane(
611; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01
612; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 0
613; CHECK-NEXT:    ret <2 x double> [[BO]]
614;
615  %ins = insertelement <2 x double> undef, double %x, i32 0
616  %bo = fsub <2 x double> %ins, <double 42.0, double -42.0>
617  ret <2 x double> %bo
618}
619
620define <2 x double> @fmul_constant(double %x) {
621; CHECK-LABEL: @fmul_constant(
622; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fmul reassoc double [[X:%.*]], 4.200000e+01
623; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
624; CHECK-NEXT:    ret <2 x double> [[BO]]
625;
626  %ins = insertelement <2 x double> undef, double %x, i32 0
627  %bo = fmul reassoc <2 x double> %ins, <double 42.0, double undef>
628  ret <2 x double> %bo
629}
630
631define <2 x double> @fmul_constant_not_undef_lane(double %x) {
632; CHECK-LABEL: @fmul_constant_not_undef_lane(
633; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fmul double [[X:%.*]], -4.200000e+01
634; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
635; CHECK-NEXT:    ret <2 x double> [[BO]]
636;
637  %ins = insertelement <2 x double> undef, double %x, i32 1
638  %bo = fmul <2 x double> %ins, <double 42.0, double -42.0>
639  ret <2 x double> %bo
640}
641
642define <2 x double> @fdiv_constant_op0(double %x) {
643; CHECK-LABEL: @fdiv_constant_op0(
644; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fdiv nnan double 4.200000e+01, [[X:%.*]]
645; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
646; CHECK-NEXT:    ret <2 x double> [[BO]]
647;
648  %ins = insertelement <2 x double> undef, double %x, i32 1
649  %bo = fdiv nnan <2 x double> <double undef, double 42.0>, %ins
650  ret <2 x double> %bo
651}
652
653define <2 x double> @fdiv_constant_op0_not_undef_lane(double %x) {
654; CHECK-LABEL: @fdiv_constant_op0_not_undef_lane(
655; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fdiv ninf double 4.200000e+01, [[X:%.*]]
656; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 0
657; CHECK-NEXT:    ret <2 x double> [[BO]]
658;
659  %ins = insertelement <2 x double> undef, double %x, i32 0
660  %bo = fdiv ninf <2 x double> <double 42.0, double -42.0>, %ins
661  ret <2 x double> %bo
662}
663
664define <2 x double> @fdiv_constant_op1(double %x) {
665; CHECK-LABEL: @fdiv_constant_op1(
666; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01
667; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
668; CHECK-NEXT:    ret <2 x double> [[BO]]
669;
670  %ins = insertelement <2 x double> undef, double %x, i32 0
671  %bo = fdiv <2 x double> %ins, <double 42.0, double undef>
672  ret <2 x double> %bo
673}
674
675define <2 x double> @fdiv_constant_op1_not_undef_lane(double %x) {
676; CHECK-LABEL: @fdiv_constant_op1_not_undef_lane(
677; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01
678; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 0
679; CHECK-NEXT:    ret <2 x double> [[BO]]
680;
681  %ins = insertelement <2 x double> undef, double %x, i32 0
682  %bo = fdiv <2 x double> %ins, <double 42.0, double -42.0>
683  ret <2 x double> %bo
684}
685
686define <2 x double> @frem_constant_op0(double %x) {
687; CHECK-LABEL: @frem_constant_op0(
688; CHECK-NEXT:    [[BO_SCALAR:%.*]] = frem fast double 4.200000e+01, [[X:%.*]]
689; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
690; CHECK-NEXT:    ret <2 x double> [[BO]]
691;
692  %ins = insertelement <2 x double> undef, double %x, i32 0
693  %bo = frem fast <2 x double> <double 42.0, double undef>, %ins
694  ret <2 x double> %bo
695}
696
697define <2 x double> @frem_constant_op0_not_undef_lane(double %x) {
698; CHECK-LABEL: @frem_constant_op0_not_undef_lane(
699; CHECK-NEXT:    [[BO_SCALAR:%.*]] = frem double -4.200000e+01, [[X:%.*]]
700; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
701; CHECK-NEXT:    ret <2 x double> [[BO]]
702;
703  %ins = insertelement <2 x double> undef, double %x, i32 1
704  %bo = frem <2 x double> <double 42.0, double -42.0>, %ins
705  ret <2 x double> %bo
706}
707
708define <2 x double> @frem_constant_op1(double %x) {
709; CHECK-LABEL: @frem_constant_op1(
710; CHECK-NEXT:    [[BO_SCALAR:%.*]] = frem ninf double [[X:%.*]], 4.200000e+01
711; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
712; CHECK-NEXT:    ret <2 x double> [[BO]]
713;
714  %ins = insertelement <2 x double> undef, double %x, i32 1
715  %bo = frem ninf <2 x double> %ins, <double undef, double 42.0>
716  ret <2 x double> %bo
717}
718
719define <2 x double> @frem_constant_op1_not_undef_lane(double %x) {
720; CHECK-LABEL: @frem_constant_op1_not_undef_lane(
721; CHECK-NEXT:    [[BO_SCALAR:%.*]] = frem nnan double [[X:%.*]], 4.200000e+01
722; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 0
723; CHECK-NEXT:    ret <2 x double> [[BO]]
724;
725  %ins = insertelement <2 x double> undef, double %x, i32 0
726  %bo = frem nnan <2 x double> %ins, <double 42.0, double -42.0>
727  ret <2 x double> %bo
728}
729