xref: /llvm-project/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=SSE2 | FileCheck %s --check-prefixes=CHECK,SSE
3; RUN: opt < %s -passes=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(ptr %p) {
28; CHECK-LABEL: @add_constant_load(
29; CHECK-NEXT:    [[LD:%.*]] = load i64, ptr [[P:%.*]], align 8
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, ptr %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> poison, 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> poison, 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(ptr %p) {
154; CHECK-LABEL: @shl_constant_op0_load(
155; CHECK-NEXT:    [[LD:%.*]] = load i64, ptr [[P:%.*]], align 8
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, ptr %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; CHECK-LABEL: @shl_constant_op0_multiuse(
168; CHECK-NEXT:    [[INS:%.*]] = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 [[A0:%.*]], i32 0
169; CHECK-NEXT:    [[MUL_SCALAR:%.*]] = shl i32 [[A0]], 3
170; CHECK-NEXT:    [[MUL:%.*]] = insertelement <4 x i32> <i32 0, i32 16, i32 64, i32 192>, i32 [[MUL_SCALAR]], i64 0
171; CHECK-NEXT:    [[AND:%.*]] = and <4 x i32> [[INS]], [[A1:%.*]]
172; CHECK-NEXT:    [[XOR:%.*]] = xor <4 x i32> [[AND]], [[MUL]]
173; CHECK-NEXT:    ret <4 x i32> [[XOR]]
174;
175  %ins = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 %a0, i32 0
176  %mul = shl <4 x i32> %ins, <i32 3, i32 4, i32 5, i32 6>
177  %and = and <4 x i32> %ins, %a1
178  %xor = xor <4 x i32> %and, %mul
179  ret <4 x i32> %xor
180}
181
182define <2 x i64> @shl_constant_op1(i64 %x) {
183; CHECK-LABEL: @shl_constant_op1(
184; CHECK-NEXT:    [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5
185; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 poison>, i64 [[BO_SCALAR]], i64 0
186; CHECK-NEXT:    ret <2 x i64> [[BO]]
187;
188  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
189  %bo = shl nuw <2 x i64> %ins, <i64 5, i64 undef>
190  ret <2 x i64> %bo
191}
192
193define <2 x i64> @shl_constant_op1_not_undef_lane(i64 %x) {
194; CHECK-LABEL: @shl_constant_op1_not_undef_lane(
195; CHECK-NEXT:    [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5
196; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
197; CHECK-NEXT:    ret <2 x i64> [[BO]]
198;
199  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
200  %bo = shl nuw <2 x i64> %ins, <i64 5, i64 2>
201  ret <2 x i64> %bo
202}
203
204define <2 x i64> @shl_constant_op1_load(ptr %p) {
205; CHECK-LABEL: @shl_constant_op1_load(
206; CHECK-NEXT:    [[LD:%.*]] = load i64, ptr [[P:%.*]], align 8
207; CHECK-NEXT:    [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 0
208; CHECK-NEXT:    [[BO:%.*]] = shl nuw <2 x i64> [[INS]], <i64 5, i64 2>
209; CHECK-NEXT:    ret <2 x i64> [[BO]]
210;
211  %ld = load i64, ptr %p
212  %ins = insertelement <2 x i64> undef, i64 %ld, i32 0
213  %bo = shl nuw <2 x i64> %ins, <i64 5, i64 2>
214  ret <2 x i64> %bo
215}
216
217define <2 x i64> @ashr_constant_op0(i64 %x) {
218; CHECK-LABEL: @ashr_constant_op0(
219; CHECK-NEXT:    [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]]
220; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 1
221; CHECK-NEXT:    ret <2 x i64> [[BO]]
222;
223  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
224  %bo = ashr exact <2 x i64> <i64 undef, i64 2>, %ins
225  ret <2 x i64> %bo
226}
227
228define <2 x i64> @ashr_constant_op0_not_undef_lane(i64 %x) {
229; CHECK-LABEL: @ashr_constant_op0_not_undef_lane(
230; CHECK-NEXT:    [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]]
231; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 1
232; CHECK-NEXT:    ret <2 x i64> [[BO]]
233;
234  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
235  %bo = ashr exact <2 x i64> <i64 5, i64 2>, %ins
236  ret <2 x i64> %bo
237}
238
239define <2 x i64> @ashr_constant_op1(i64 %x) {
240; CHECK-LABEL: @ashr_constant_op1(
241; CHECK-NEXT:    [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5
242; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 poison>, i64 [[BO_SCALAR]], i64 0
243; CHECK-NEXT:    ret <2 x i64> [[BO]]
244;
245  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
246  %bo = ashr <2 x i64> %ins, <i64 5, i64 undef>
247  ret <2 x i64> %bo
248}
249
250define <2 x i64> @ashr_constant_op1_not_undef_lane(i64 %x) {
251; CHECK-LABEL: @ashr_constant_op1_not_undef_lane(
252; CHECK-NEXT:    [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5
253; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
254; CHECK-NEXT:    ret <2 x i64> [[BO]]
255;
256  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
257  %bo = ashr <2 x i64> %ins, <i64 5, i64 2>
258  ret <2 x i64> %bo
259}
260
261define <2 x i64> @lshr_constant_op0(i64 %x) {
262; CHECK-LABEL: @lshr_constant_op0(
263; CHECK-NEXT:    [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]]
264; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
265; CHECK-NEXT:    ret <2 x i64> [[BO]]
266;
267  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
268  %bo = lshr <2 x i64> <i64 5, i64 undef>, %ins
269  ret <2 x i64> %bo
270}
271
272define <2 x i64> @lshr_constant_op0_not_undef_lane(i64 %x) {
273; CHECK-LABEL: @lshr_constant_op0_not_undef_lane(
274; CHECK-NEXT:    [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]]
275; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
276; CHECK-NEXT:    ret <2 x i64> [[BO]]
277;
278  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
279  %bo = lshr <2 x i64> <i64 5, i64 2>, %ins
280  ret <2 x i64> %bo
281}
282
283define <2 x i64> @lshr_constant_op1(i64 %x) {
284; CHECK-LABEL: @lshr_constant_op1(
285; CHECK-NEXT:    [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2
286; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
287; CHECK-NEXT:    ret <2 x i64> [[BO]]
288;
289  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
290  %bo = lshr exact <2 x i64> %ins, <i64 undef, i64 2>
291  ret <2 x i64> %bo
292}
293
294define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) {
295; CHECK-LABEL: @lshr_constant_op1_not_undef_lane(
296; CHECK-NEXT:    [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2
297; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
298; CHECK-NEXT:    ret <2 x i64> [[BO]]
299;
300  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
301  %bo = lshr exact <2 x i64> %ins, <i64 5, i64 2>
302  ret <2 x i64> %bo
303}
304
305define <2 x i64> @urem_constant_op0(i64 %x) {
306; CHECK-LABEL: @urem_constant_op0(
307; CHECK-NEXT:    [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
308; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
309; CHECK-NEXT:    ret <2 x i64> [[BO]]
310;
311  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
312  %bo = urem <2 x i64> <i64 5, i64 undef>, %ins
313  ret <2 x i64> %bo
314}
315
316define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) {
317; CHECK-LABEL: @urem_constant_op0_not_undef_lane(
318; CHECK-NEXT:    [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
319; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
320; CHECK-NEXT:    ret <2 x i64> [[BO]]
321;
322  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
323  %bo = urem <2 x i64> <i64 5, i64 2>, %ins
324  ret <2 x i64> %bo
325}
326
327define <2 x i64> @urem_constant_op1(i64 %x) {
328; CHECK-LABEL: @urem_constant_op1(
329; CHECK-NEXT:    [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2
330; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
331; CHECK-NEXT:    ret <2 x i64> [[BO]]
332;
333  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
334  %bo = urem <2 x i64> %ins, <i64 undef, i64 2>
335  ret <2 x i64> %bo
336}
337
338define <2 x i64> @urem_constant_op1_not_undef_lane(i64 %x) {
339; CHECK-LABEL: @urem_constant_op1_not_undef_lane(
340; CHECK-NEXT:    [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2
341; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
342; CHECK-NEXT:    ret <2 x i64> [[BO]]
343;
344  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
345  %bo = urem <2 x i64> %ins, <i64 5, i64 2>
346  ret <2 x i64> %bo
347}
348
349define <2 x i64> @srem_constant_op0(i64 %x) {
350; CHECK-LABEL: @srem_constant_op0(
351; CHECK-NEXT:    [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
352; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
353; CHECK-NEXT:    ret <2 x i64> [[BO]]
354;
355  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
356  %bo = srem <2 x i64> <i64 5, i64 undef>, %ins
357  ret <2 x i64> %bo
358}
359
360define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) {
361; CHECK-LABEL: @srem_constant_op0_not_undef_lane(
362; CHECK-NEXT:    [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
363; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
364; CHECK-NEXT:    ret <2 x i64> [[BO]]
365;
366  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
367  %bo = srem <2 x i64> <i64 5, i64 2>, %ins
368  ret <2 x i64> %bo
369}
370
371define <2 x i64> @srem_constant_op1(i64 %x) {
372; CHECK-LABEL: @srem_constant_op1(
373; CHECK-NEXT:    [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2
374; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
375; CHECK-NEXT:    ret <2 x i64> [[BO]]
376;
377  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
378  %bo = srem <2 x i64> %ins, <i64 undef, i64 2>
379  ret <2 x i64> %bo
380}
381
382define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) {
383; CHECK-LABEL: @srem_constant_op1_not_undef_lane(
384; CHECK-NEXT:    [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2
385; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
386; CHECK-NEXT:    ret <2 x i64> [[BO]]
387;
388  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
389  %bo = srem <2 x i64> %ins, <i64 5, i64 2>
390  ret <2 x i64> %bo
391}
392
393define <2 x i64> @udiv_constant_op0(i64 %x) {
394; CHECK-LABEL: @udiv_constant_op0(
395; CHECK-NEXT:    [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
396; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
397; CHECK-NEXT:    ret <2 x i64> [[BO]]
398;
399  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
400  %bo = udiv exact <2 x i64> <i64 5, i64 undef>, %ins
401  ret <2 x i64> %bo
402}
403
404define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) {
405; CHECK-LABEL: @udiv_constant_op0_not_undef_lane(
406; CHECK-NEXT:    [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
407; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
408; CHECK-NEXT:    ret <2 x i64> [[BO]]
409;
410  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
411  %bo = udiv exact <2 x i64> <i64 5, i64 2>, %ins
412  ret <2 x i64> %bo
413}
414
415define <2 x i64> @udiv_constant_op1(i64 %x) {
416; CHECK-LABEL: @udiv_constant_op1(
417; CHECK-NEXT:    [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2
418; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
419; CHECK-NEXT:    ret <2 x i64> [[BO]]
420;
421  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
422  %bo = udiv <2 x i64> %ins, <i64 undef, i64 2>
423  ret <2 x i64> %bo
424}
425
426define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) {
427; CHECK-LABEL: @udiv_constant_op1_not_undef_lane(
428; CHECK-NEXT:    [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2
429; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
430; CHECK-NEXT:    ret <2 x i64> [[BO]]
431;
432  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
433  %bo = udiv <2 x i64> %ins, <i64 5, i64 2>
434  ret <2 x i64> %bo
435}
436
437define <2 x i64> @sdiv_constant_op0(i64 %x) {
438; CHECK-LABEL: @sdiv_constant_op0(
439; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
440; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
441; CHECK-NEXT:    ret <2 x i64> [[BO]]
442;
443  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
444  %bo = sdiv <2 x i64> <i64 5, i64 undef>, %ins
445  ret <2 x i64> %bo
446}
447
448define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) {
449; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane(
450; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
451; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
452; CHECK-NEXT:    ret <2 x i64> [[BO]]
453;
454  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
455  %bo = sdiv <2 x i64> <i64 5, i64 2>, %ins
456  ret <2 x i64> %bo
457}
458
459define <2 x i64> @sdiv_constant_op1(i64 %x) {
460; CHECK-LABEL: @sdiv_constant_op1(
461; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2
462; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
463; CHECK-NEXT:    ret <2 x i64> [[BO]]
464;
465  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
466  %bo = sdiv exact <2 x i64> %ins, <i64 undef, i64 2>
467  ret <2 x i64> %bo
468}
469
470define <2 x i64> @sdiv_constant_op1_not_undef_lane(i64 %x) {
471; CHECK-LABEL: @sdiv_constant_op1_not_undef_lane(
472; CHECK-NEXT:    [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2
473; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
474; CHECK-NEXT:    ret <2 x i64> [[BO]]
475;
476  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
477  %bo = sdiv exact <2 x i64> %ins, <i64 5, i64 2>
478  ret <2 x i64> %bo
479}
480
481define <2 x i64> @and_constant(i64 %x) {
482; CHECK-LABEL: @and_constant(
483; CHECK-NEXT:    [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42
484; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 undef>, i64 [[BO_SCALAR]], i64 0
485; CHECK-NEXT:    ret <2 x i64> [[BO]]
486;
487  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
488  %bo = and <2 x i64> %ins, <i64 42, i64 undef>
489  ret <2 x i64> %bo
490}
491
492define <2 x i64> @and_constant_not_undef_lane(i64 %x) {
493; CHECK-LABEL: @and_constant_not_undef_lane(
494; CHECK-NEXT:    [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42
495; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
496; CHECK-NEXT:    ret <2 x i64> [[BO]]
497;
498  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
499  %bo = and <2 x i64> %ins, <i64 42, i64 -42>
500  ret <2 x i64> %bo
501}
502
503define <2 x i64> @or_constant(i64 %x) {
504; CHECK-LABEL: @or_constant(
505; CHECK-NEXT:    [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42
506; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 undef, i64 -1>, i64 [[BO_SCALAR]], i64 1
507; CHECK-NEXT:    ret <2 x i64> [[BO]]
508;
509  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
510  %bo = or <2 x i64> %ins, <i64 undef, i64 -42>
511  ret <2 x i64> %bo
512}
513
514define <2 x i64> @or_constant_not_undef_lane(i64 %x) {
515; CHECK-LABEL: @or_constant_not_undef_lane(
516; CHECK-NEXT:    [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42
517; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> splat (i64 -1), i64 [[BO_SCALAR]], i64 1
518; CHECK-NEXT:    ret <2 x i64> [[BO]]
519;
520  %ins = insertelement <2 x i64> undef, i64 %x, i32 1
521  %bo = or <2 x i64> %ins, <i64 42, i64 -42>
522  ret <2 x i64> %bo
523}
524
525define <2 x i64> @xor_constant(i64 %x) {
526; CHECK-LABEL: @xor_constant(
527; CHECK-NEXT:    [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42
528; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> <i64 undef, i64 0>, i64 [[BO_SCALAR]], i64 0
529; CHECK-NEXT:    ret <2 x i64> [[BO]]
530;
531  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
532  %bo = xor <2 x i64> %ins, <i64 42, i64 undef>
533  ret <2 x i64> %bo
534}
535
536define <2 x i64> @xor_constant_not_undef_lane(i64 %x) {
537; CHECK-LABEL: @xor_constant_not_undef_lane(
538; CHECK-NEXT:    [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42
539; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0
540; CHECK-NEXT:    ret <2 x i64> [[BO]]
541;
542  %ins = insertelement <2 x i64> undef, i64 %x, i32 0
543  %bo = xor <2 x i64> %ins, <i64 42, i64 -42>
544  ret <2 x i64> %bo
545}
546
547define <2 x double> @fadd_constant(double %x) {
548; CHECK-LABEL: @fadd_constant(
549; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], 4.200000e+01
550; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
551; CHECK-NEXT:    ret <2 x double> [[BO]]
552;
553  %ins = insertelement <2 x double> undef, double %x, i32 0
554  %bo = fadd <2 x double> %ins, <double 42.0, double undef>
555  ret <2 x double> %bo
556}
557
558define <2 x double> @fadd_constant_not_undef_lane(double %x) {
559; CHECK-LABEL: @fadd_constant_not_undef_lane(
560; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], -4.200000e+01
561; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 1
562; CHECK-NEXT:    ret <2 x double> [[BO]]
563;
564  %ins = insertelement <2 x double> undef, double %x, i32 1
565  %bo = fadd <2 x double> %ins, <double 42.0, double -42.0>
566  ret <2 x double> %bo
567}
568
569define <2 x double> @fsub_constant_op0(double %x) {
570; CHECK-LABEL: @fsub_constant_op0(
571; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fsub fast double 4.200000e+01, [[X:%.*]]
572; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
573; CHECK-NEXT:    ret <2 x double> [[BO]]
574;
575  %ins = insertelement <2 x double> undef, double %x, i32 0
576  %bo = fsub fast <2 x double> <double 42.0, double undef>, %ins
577  ret <2 x double> %bo
578}
579
580define <2 x double> @fsub_constant_op0_not_undef_lane(double %x) {
581; CHECK-LABEL: @fsub_constant_op0_not_undef_lane(
582; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fsub nsz double -4.200000e+01, [[X:%.*]]
583; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 1
584; CHECK-NEXT:    ret <2 x double> [[BO]]
585;
586  %ins = insertelement <2 x double> undef, double %x, i32 1
587  %bo = fsub nsz <2 x double> <double 42.0, double -42.0>, %ins
588  ret <2 x double> %bo
589}
590
591define <2 x double> @fsub_constant_op1(double %x) {
592; CHECK-LABEL: @fsub_constant_op1(
593; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01
594; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
595; CHECK-NEXT:    ret <2 x double> [[BO]]
596;
597  %ins = insertelement <2 x double> undef, double %x, i32 1
598  %bo = fsub <2 x double> %ins, <double undef, double 42.0>
599  ret <2 x double> %bo
600}
601
602define <2 x double> @fsub_constant_op1_not_undef_lane(double %x) {
603; CHECK-LABEL: @fsub_constant_op1_not_undef_lane(
604; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01
605; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 0
606; CHECK-NEXT:    ret <2 x double> [[BO]]
607;
608  %ins = insertelement <2 x double> undef, double %x, i32 0
609  %bo = fsub <2 x double> %ins, <double 42.0, double -42.0>
610  ret <2 x double> %bo
611}
612
613define <2 x double> @fmul_constant(double %x) {
614; CHECK-LABEL: @fmul_constant(
615; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fmul reassoc double [[X:%.*]], 4.200000e+01
616; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
617; CHECK-NEXT:    ret <2 x double> [[BO]]
618;
619  %ins = insertelement <2 x double> undef, double %x, i32 0
620  %bo = fmul reassoc <2 x double> %ins, <double 42.0, double undef>
621  ret <2 x double> %bo
622}
623
624define <2 x double> @fmul_constant_not_undef_lane(double %x) {
625; CHECK-LABEL: @fmul_constant_not_undef_lane(
626; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fmul double [[X:%.*]], -4.200000e+01
627; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 1
628; CHECK-NEXT:    ret <2 x double> [[BO]]
629;
630  %ins = insertelement <2 x double> undef, double %x, i32 1
631  %bo = fmul <2 x double> %ins, <double 42.0, double -42.0>
632  ret <2 x double> %bo
633}
634
635define <2 x double> @fdiv_constant_op0(double %x) {
636; CHECK-LABEL: @fdiv_constant_op0(
637; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fdiv nnan double 4.200000e+01, [[X:%.*]]
638; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
639; CHECK-NEXT:    ret <2 x double> [[BO]]
640;
641  %ins = insertelement <2 x double> undef, double %x, i32 1
642  %bo = fdiv nnan <2 x double> <double undef, double 42.0>, %ins
643  ret <2 x double> %bo
644}
645
646define <2 x double> @fdiv_constant_op0_not_undef_lane(double %x) {
647; CHECK-LABEL: @fdiv_constant_op0_not_undef_lane(
648; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fdiv ninf double 4.200000e+01, [[X:%.*]]
649; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 0
650; CHECK-NEXT:    ret <2 x double> [[BO]]
651;
652  %ins = insertelement <2 x double> undef, double %x, i32 0
653  %bo = fdiv ninf <2 x double> <double 42.0, double -42.0>, %ins
654  ret <2 x double> %bo
655}
656
657define <2 x double> @fdiv_constant_op1(double %x) {
658; CHECK-LABEL: @fdiv_constant_op1(
659; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01
660; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
661; CHECK-NEXT:    ret <2 x double> [[BO]]
662;
663  %ins = insertelement <2 x double> undef, double %x, i32 0
664  %bo = fdiv <2 x double> %ins, <double 42.0, double undef>
665  ret <2 x double> %bo
666}
667
668define <2 x double> @fdiv_constant_op1_not_undef_lane(double %x) {
669; CHECK-LABEL: @fdiv_constant_op1_not_undef_lane(
670; CHECK-NEXT:    [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01
671; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 0
672; CHECK-NEXT:    ret <2 x double> [[BO]]
673;
674  %ins = insertelement <2 x double> undef, double %x, i32 0
675  %bo = fdiv <2 x double> %ins, <double 42.0, double -42.0>
676  ret <2 x double> %bo
677}
678
679define <2 x double> @frem_constant_op0(double %x) {
680; CHECK-LABEL: @frem_constant_op0(
681; CHECK-NEXT:    [[BO_SCALAR:%.*]] = frem fast double 4.200000e+01, [[X:%.*]]
682; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0
683; CHECK-NEXT:    ret <2 x double> [[BO]]
684;
685  %ins = insertelement <2 x double> undef, double %x, i32 0
686  %bo = frem fast <2 x double> <double 42.0, double undef>, %ins
687  ret <2 x double> %bo
688}
689
690define <2 x double> @frem_constant_op0_not_undef_lane(double %x) {
691; CHECK-LABEL: @frem_constant_op0_not_undef_lane(
692; CHECK-NEXT:    [[BO_SCALAR:%.*]] = frem double -4.200000e+01, [[X:%.*]]
693; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 1
694; CHECK-NEXT:    ret <2 x double> [[BO]]
695;
696  %ins = insertelement <2 x double> undef, double %x, i32 1
697  %bo = frem <2 x double> <double 42.0, double -42.0>, %ins
698  ret <2 x double> %bo
699}
700
701define <2 x double> @frem_constant_op1(double %x) {
702; CHECK-LABEL: @frem_constant_op1(
703; CHECK-NEXT:    [[BO_SCALAR:%.*]] = frem ninf double [[X:%.*]], 4.200000e+01
704; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1
705; CHECK-NEXT:    ret <2 x double> [[BO]]
706;
707  %ins = insertelement <2 x double> undef, double %x, i32 1
708  %bo = frem ninf <2 x double> %ins, <double undef, double 42.0>
709  ret <2 x double> %bo
710}
711
712define <2 x double> @frem_constant_op1_not_undef_lane(double %x) {
713; CHECK-LABEL: @frem_constant_op1_not_undef_lane(
714; CHECK-NEXT:    [[BO_SCALAR:%.*]] = frem nnan double [[X:%.*]], 4.200000e+01
715; CHECK-NEXT:    [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 0
716; CHECK-NEXT:    ret <2 x double> [[BO]]
717;
718  %ins = insertelement <2 x double> undef, double %x, i32 0
719  %bo = frem nnan <2 x double> %ins, <double 42.0, double -42.0>
720  ret <2 x double> %bo
721}
722