@@ -308,3 +308,174 @@ define i32 @diff_of_sums_type_mismatch2(<8 x i32> %v0, <4 x i32> %v1) {
308
308
%r = sub i32 %r0 , %r1
309
309
ret i32 %r
310
310
}
311
+
312
+ define i32 @constant_multiplied_4xi32 (i32 %0 ) {
313
+ ; CHECK-LABEL: @constant_multiplied_4xi32(
314
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0:%.*]], 2
315
+ ; CHECK-NEXT: ret i32 [[TMP2]]
316
+ ;
317
+ %2 = insertelement <4 x i32 > poison, i32 %0 , i64 0
318
+ %3 = shufflevector <4 x i32 > %2 , <4 x i32 > poison, <4 x i32 > zeroinitializer
319
+ %4 = tail call i32 @llvm.vector.reduce.add.v4i32 (<4 x i32 > %3 )
320
+ ret i32 %4
321
+ }
322
+
323
+ define i32 @constant_multiplied_3xi32 (i32 %0 ) {
324
+ ; CHECK-LABEL: @constant_multiplied_3xi32(
325
+ ; CHECK-NEXT: [[TMP2:%.*]] = mul i32 [[TMP0:%.*]], 3
326
+ ; CHECK-NEXT: ret i32 [[TMP2]]
327
+ ;
328
+ %2 = insertelement <3 x i32 > poison, i32 %0 , i64 0
329
+ %3 = shufflevector <3 x i32 > %2 , <3 x i32 > poison, <3 x i32 > zeroinitializer
330
+ %4 = tail call i32 @llvm.vector.reduce.add.v3i32 (<3 x i32 > %3 )
331
+ ret i32 %4
332
+ }
333
+
334
+ define i64 @constant_multiplied_4xi64 (i64 %0 ) {
335
+ ; CHECK-LABEL: @constant_multiplied_4xi64(
336
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[TMP0:%.*]], 2
337
+ ; CHECK-NEXT: ret i64 [[TMP2]]
338
+ ;
339
+ %2 = insertelement <4 x i64 > poison, i64 %0 , i64 0
340
+ %3 = shufflevector <4 x i64 > %2 , <4 x i64 > poison, <4 x i32 > zeroinitializer
341
+ %4 = tail call i64 @llvm.vector.reduce.add.v4i64 (<4 x i64 > %3 )
342
+ ret i64 %4
343
+ }
344
+
345
+ define i32 @constant_multiplied_8xi32 (i32 %0 ) {
346
+ ; CHECK-LABEL: @constant_multiplied_8xi32(
347
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0:%.*]], 3
348
+ ; CHECK-NEXT: ret i32 [[TMP2]]
349
+ ;
350
+ %2 = insertelement <4 x i32 > poison, i32 %0 , i64 0
351
+ %3 = shufflevector <4 x i32 > %2 , <4 x i32 > poison, <8 x i32 > zeroinitializer
352
+ %4 = tail call i32 @llvm.vector.reduce.add.v8i32 (<8 x i32 > %3 )
353
+ ret i32 %4
354
+ }
355
+
356
+
357
+ define i32 @constant_multiplied_16xi32 (i32 %0 ) {
358
+ ; CHECK-LABEL: @constant_multiplied_16xi32(
359
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0:%.*]], 4
360
+ ; CHECK-NEXT: ret i32 [[TMP2]]
361
+ ;
362
+ %2 = insertelement <4 x i32 > poison, i32 %0 , i64 0
363
+ %3 = shufflevector <4 x i32 > %2 , <4 x i32 > poison, <16 x i32 > zeroinitializer
364
+ %4 = tail call i32 @llvm.vector.reduce.add.v16i32 (<16 x i32 > %3 )
365
+ ret i32 %4
366
+ }
367
+
368
+
369
+ define i32 @constant_multiplied_4xi32_at_idx1 (i32 %0 ) {
370
+ ; CHECK-LABEL: @constant_multiplied_4xi32_at_idx1(
371
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0:%.*]], 2
372
+ ; CHECK-NEXT: ret i32 [[TMP2]]
373
+ ;
374
+ %2 = insertelement <4 x i32 > poison, i32 %0 , i64 1
375
+ %3 = shufflevector <4 x i32 > %2 , <4 x i32 > poison,
376
+ <4 x i32 > <i32 1 , i32 1 , i32 1 , i32 1 >
377
+ %4 = tail call i32 @llvm.vector.reduce.add.v4i32 (<4 x i32 > %3 )
378
+ ret i32 %4
379
+ }
380
+
381
+ define i32 @negative_constant_multiplied_4xi32 (i32 %0 ) {
382
+ ; CHECK-LABEL: @negative_constant_multiplied_4xi32(
383
+ ; CHECK-NEXT: ret i32 poison
384
+ ;
385
+ %2 = insertelement <4 x i32 > poison, i32 %0 , i64 1
386
+ %3 = shufflevector <4 x i32 > %2 , <4 x i32 > poison, <4 x i32 > zeroinitializer
387
+ %4 = tail call i32 @llvm.vector.reduce.add.v4i32 (<4 x i32 > %3 )
388
+ ret i32 %4
389
+ }
390
+
391
+ define i32 @constant_multiplied_6xi32 (i32 %0 ) {
392
+ ; CHECK-LABEL: @constant_multiplied_6xi32(
393
+ ; CHECK-NEXT: [[TMP2:%.*]] = mul i32 [[TMP0:%.*]], 6
394
+ ; CHECK-NEXT: ret i32 [[TMP2]]
395
+ ;
396
+ %2 = insertelement <4 x i32 > poison, i32 %0 , i64 0
397
+ %3 = shufflevector <4 x i32 > %2 , <4 x i32 > poison, <6 x i32 > zeroinitializer
398
+ %4 = tail call i32 @llvm.vector.reduce.add.v6i32 (<6 x i32 > %3 )
399
+ ret i32 %4
400
+ }
401
+
402
+ define i64 @constant_multiplied_6xi64 (i64 %0 ) {
403
+ ; CHECK-LABEL: @constant_multiplied_6xi64(
404
+ ; CHECK-NEXT: [[TMP2:%.*]] = mul i64 [[TMP0:%.*]], 6
405
+ ; CHECK-NEXT: ret i64 [[TMP2]]
406
+ ;
407
+ %2 = insertelement <4 x i64 > poison, i64 %0 , i64 0
408
+ %3 = shufflevector <4 x i64 > %2 , <4 x i64 > poison, <6 x i32 > zeroinitializer
409
+ %4 = tail call i64 @llvm.vector.reduce.add.v6i64 (<6 x i64 > %3 )
410
+ ret i64 %4
411
+ }
412
+
413
+ define i1 @constant_multiplied_8xi1 (i1 %0 ) {
414
+ ; CHECK-LABEL: @constant_multiplied_8xi1(
415
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <8 x i1> poison, i1 [[TMP0:%.*]], i64 0
416
+ ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i1> [[TMP2]], <8 x i1> poison, <8 x i32> zeroinitializer
417
+ ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <8 x i1> [[TMP3]] to i8
418
+ ; CHECK-NEXT: [[TMP5:%.*]] = call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[TMP4]])
419
+ ; CHECK-NEXT: [[TMP6:%.*]] = trunc i8 [[TMP5]] to i1
420
+ ; CHECK-NEXT: ret i1 [[TMP6]]
421
+ ;
422
+ %2 = insertelement <8 x i1 > poison, i1 %0 , i32 0
423
+ %3 = shufflevector <8 x i1 > %2 , <8 x i1 > poison, <8 x i32 > zeroinitializer
424
+ %4 = tail call i1 @llvm.vector.reduce.add.v8i1 (<8 x i1 > %3 )
425
+ ret i1 %4
426
+ }
427
+
428
+ define i2 @constant_multiplied_4xi2 (i2 %0 ) {
429
+ ; CHECK-LABEL: @constant_multiplied_4xi2(
430
+ ; CHECK-NEXT: ret i2 0
431
+ ;
432
+ %2 = insertelement <4 x i2 > poison, i2 %0 , i32 0
433
+ %3 = shufflevector <4 x i2 > %2 , <4 x i2 > poison, <4 x i32 > zeroinitializer
434
+ %4 = tail call i2 @llvm.vector.reduce.add.v4i2 (<4 x i2 > %3 )
435
+ ret i2 %4
436
+ }
437
+
438
+ define i2 @constant_multiplied_5xi2 (i2 %0 ) {
439
+ ; CHECK-LABEL: @constant_multiplied_5xi2(
440
+ ; CHECK-NEXT: ret i2 [[TMP0:%.*]]
441
+ ;
442
+ %2 = insertelement <5 x i2 > poison, i2 %0 , i64 0
443
+ %3 = shufflevector <5 x i2 > %2 , <5 x i2 > poison, <5 x i32 > zeroinitializer
444
+ %4 = tail call i2 @llvm.vector.reduce.add.v5i2 (<5 x i2 > %3 )
445
+ ret i2 %4
446
+ }
447
+
448
+ define i2 @constant_multiplied_6xi2 (i2 %0 ) {
449
+ ; CHECK-LABEL: @constant_multiplied_6xi2(
450
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i2 [[TMP0:%.*]], 1
451
+ ; CHECK-NEXT: ret i2 [[TMP2]]
452
+ ;
453
+ %2 = insertelement <6 x i2 > poison, i2 %0 , i64 0
454
+ %3 = shufflevector <6 x i2 > %2 , <6 x i2 > poison, <6 x i32 > zeroinitializer
455
+ %4 = tail call i2 @llvm.vector.reduce.add.v6i2 (<6 x i2 > %3 )
456
+ ret i2 %4
457
+ }
458
+
459
+ define i2 @constant_multiplied_7xi2 (i2 %0 ) {
460
+ ; CHECK-LABEL: @constant_multiplied_7xi2(
461
+ ; CHECK-NEXT: [[TMP2:%.*]] = sub i2 0, [[TMP0:%.*]]
462
+ ; CHECK-NEXT: ret i2 [[TMP2]]
463
+ ;
464
+ %2 = insertelement <7 x i2 > poison, i2 %0 , i64 0
465
+ %3 = shufflevector <7 x i2 > %2 , <7 x i2 > poison, <7 x i32 > zeroinitializer
466
+ %4 = tail call i2 @llvm.vector.reduce.add.v7i2 (<7 x i2 > %3 )
467
+ ret i2 %4
468
+ }
469
+
470
+ define i32 @negative_scalable_vector (i32 %0 ) {
471
+ ; CHECK-LABEL: @negative_scalable_vector(
472
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[TMP0:%.*]], i64 0
473
+ ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <vscale x 4 x i32> [[TMP2]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
474
+ ; CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @llvm.vector.reduce.add.nxv4i32(<vscale x 4 x i32> [[TMP3]])
475
+ ; CHECK-NEXT: ret i32 [[TMP4]]
476
+ ;
477
+ %2 = insertelement <vscale x 4 x i32 > poison, i32 %0 , i64 0
478
+ %3 = shufflevector <vscale x 4 x i32 > %2 , <vscale x 4 x i32 > poison, <vscale x 4 x i32 > zeroinitializer
479
+ %4 = tail call i32 @llvm.vector.reduce.add.nxv4i32 (<vscale x 4 x i32 > %3 )
480
+ ret i32 %4
481
+ }
0 commit comments