@@ -377,3 +377,120 @@ define <2 x i1> @insert_nonzero_any_idx_fail(<2 x i8> %xx, i8 %yy, i32 %idx) {
377
377
%r = icmp eq <2 x i8 > %ins , zeroinitializer
378
378
ret <2 x i1 > %r
379
379
}
380
+
381
+ define i1 @nonzero_reduce_add (<2 x i8 > %xx ) {
382
+ ; CHECK-LABEL: @nonzero_reduce_add(
383
+ ; CHECK-NEXT: [[X0:%.*]] = and <2 x i8> [[XX:%.*]], <i8 3, i8 3>
384
+ ; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[X0]], <i8 1, i8 1>
385
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> [[X]])
386
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
387
+ ; CHECK-NEXT: ret i1 [[R]]
388
+ ;
389
+ %x0 = and <2 x i8 > %xx , <i8 3 , i8 3 >
390
+ %x = add <2 x i8 > %x0 , <i8 1 , i8 1 >
391
+ %v = call i8 @llvm.vector.reduce.add (<2 x i8 > %x )
392
+ %r = icmp eq i8 %v , 0
393
+ ret i1 %r
394
+ }
395
+
396
+ define i1 @nonzero_reduce_add_fail (<2 x i8 > %xx ) {
397
+ ; CHECK-LABEL: @nonzero_reduce_add_fail(
398
+ ; CHECK-NEXT: [[X0:%.*]] = and <2 x i8> [[XX:%.*]], <i8 3, i8 3>
399
+ ; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[X0]], <i8 1, i8 0>
400
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> [[X]])
401
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
402
+ ; CHECK-NEXT: ret i1 [[R]]
403
+ ;
404
+ %x0 = and <2 x i8 > %xx , <i8 3 , i8 3 >
405
+ %x = add <2 x i8 > %x0 , <i8 1 , i8 0 >
406
+ %v = call i8 @llvm.vector.reduce.add (<2 x i8 > %x )
407
+ %r = icmp eq i8 %v , 0
408
+ ret i1 %r
409
+ }
410
+
411
+ define i1 @nonzero_reduce_add_fail2 (<2 x i8 > %xx ) {
412
+ ; CHECK-LABEL: @nonzero_reduce_add_fail2(
413
+ ; CHECK-NEXT: [[X:%.*]] = add nuw <2 x i8> [[XX:%.*]], <i8 1, i8 1>
414
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> [[X]])
415
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
416
+ ; CHECK-NEXT: ret i1 [[R]]
417
+ ;
418
+ %x = add nuw <2 x i8 > %xx , <i8 1 , i8 1 >
419
+ %v = call i8 @llvm.vector.reduce.add (<2 x i8 > %x )
420
+ %r = icmp eq i8 %v , 0
421
+ ret i1 %r
422
+ }
423
+
424
+ define i1 @nonzero_reduce_add_fail3 (<18 x i4 > %xx ) {
425
+ ; CHECK-LABEL: @nonzero_reduce_add_fail3(
426
+ ; CHECK-NEXT: [[X0:%.*]] = and <18 x i4> [[XX:%.*]], <i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3, i4 3>
427
+ ; CHECK-NEXT: [[X:%.*]] = add <18 x i4> [[X0]], <i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1, i4 1>
428
+ ; CHECK-NEXT: [[V:%.*]] = call i4 @llvm.vector.reduce.add.v18i4(<18 x i4> [[X]])
429
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i4 [[V]], 0
430
+ ; CHECK-NEXT: ret i1 [[R]]
431
+ ;
432
+ %x0 = and <18 x i4 > %xx , <i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 , i4 3 >
433
+ %x = add <18 x i4 > %x0 , <i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 , i4 1 >
434
+ %v = call i4 @llvm.vector.reduce.add.v18i4 (<18 x i4 > %x )
435
+ %r = icmp eq i4 %v , 0
436
+ ret i1 %r
437
+ }
438
+
439
+ define i1 @nonzero_reduce_mul (<2 x i8 > %xx ) {
440
+ ; CHECK-LABEL: @nonzero_reduce_mul(
441
+ ; CHECK-NEXT: [[X0:%.*]] = and <2 x i8> [[XX:%.*]], <i8 3, i8 3>
442
+ ; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[X0]], <i8 1, i8 1>
443
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.vector.reduce.mul.v2i8(<2 x i8> [[X]])
444
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
445
+ ; CHECK-NEXT: ret i1 [[R]]
446
+ ;
447
+ %x0 = and <2 x i8 > %xx , <i8 3 , i8 3 >
448
+ %x = add <2 x i8 > %x0 , <i8 1 , i8 1 >
449
+ %v = call i8 @llvm.vector.reduce.mul (<2 x i8 > %x )
450
+ %r = icmp eq i8 %v , 0
451
+ ret i1 %r
452
+ }
453
+
454
+ define i1 @nonzero_reduce_mul2 (<3 x i16 > %xx ) {
455
+ ; CHECK-LABEL: @nonzero_reduce_mul2(
456
+ ; CHECK-NEXT: [[X0:%.*]] = and <3 x i16> [[XX:%.*]], <i16 3, i16 3, i16 3>
457
+ ; CHECK-NEXT: [[X:%.*]] = add <3 x i16> [[X0]], <i16 1, i16 1, i16 1>
458
+ ; CHECK-NEXT: [[V:%.*]] = call i16 @llvm.vector.reduce.mul.v3i16(<3 x i16> [[X]])
459
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i16 [[V]], 0
460
+ ; CHECK-NEXT: ret i1 [[R]]
461
+ ;
462
+ %x0 = and <3 x i16 > %xx , <i16 3 , i16 3 , i16 3 >
463
+ %x = add <3 x i16 > %x0 , <i16 1 , i16 1 , i16 1 >
464
+ %v = call i16 @llvm.vector.reduce.mul.v3i16 (<3 x i16 > %x )
465
+ %r = icmp eq i16 %v , 0
466
+ ret i1 %r
467
+ }
468
+
469
+ define i1 @nonzero_reduce_mul_fail (<2 x i8 > %xx ) {
470
+ ; CHECK-LABEL: @nonzero_reduce_mul_fail(
471
+ ; CHECK-NEXT: [[X0:%.*]] = and <2 x i8> [[XX:%.*]], <i8 15, i8 15>
472
+ ; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[X0]], <i8 1, i8 1>
473
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.vector.reduce.mul.v2i8(<2 x i8> [[X]])
474
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
475
+ ; CHECK-NEXT: ret i1 [[R]]
476
+ ;
477
+ %x0 = and <2 x i8 > %xx , <i8 15 , i8 15 >
478
+ %x = add <2 x i8 > %x0 , <i8 1 , i8 1 >
479
+ %v = call i8 @llvm.vector.reduce.mul (<2 x i8 > %x )
480
+ %r = icmp eq i8 %v , 0
481
+ ret i1 %r
482
+ }
483
+
484
+ define i1 @nonzero_reduce_mul_fail2 (<2 x i8 > %xx ) {
485
+ ; CHECK-LABEL: @nonzero_reduce_mul_fail2(
486
+ ; CHECK-NEXT: [[X:%.*]] = add nuw <2 x i8> [[XX:%.*]], <i8 1, i8 1>
487
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.vector.reduce.mul.v2i8(<2 x i8> [[X]])
488
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
489
+ ; CHECK-NEXT: ret i1 [[R]]
490
+ ;
491
+ %x = add nuw <2 x i8 > %xx , <i8 1 , i8 1 >
492
+ %v = call i8 @llvm.vector.reduce.mul (<2 x i8 > %x )
493
+ %r = icmp eq i8 %v , 0
494
+ ret i1 %r
495
+ }
496
+
0 commit comments