@@ -377,3 +377,214 @@ 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 @src_x_add_x_eq_0 (i8 %x ) {
382
+ ; CHECK-LABEL: @src_x_add_x_eq_0(
383
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
384
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
385
+ ; CHECK-NEXT: [[V:%.*]] = add i8 [[X]], [[Y]]
386
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
387
+ ; CHECK-NEXT: ret i1 [[R]]
388
+ ;
389
+ %x_eq_0 = icmp eq i8 %x , 0
390
+ %y = zext i1 %x_eq_0 to i8
391
+ %v = add i8 %x , %y
392
+ %r = icmp eq i8 %v , 0
393
+ ret i1 %r
394
+ }
395
+
396
+ define i1 @src_x_add_x_eq_1_fail (i8 %x ) {
397
+ ; CHECK-LABEL: @src_x_add_x_eq_1_fail(
398
+ ; CHECK-NEXT: [[X_EQ_1:%.*]] = icmp eq i8 [[X:%.*]], 1
399
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_1]] to i8
400
+ ; CHECK-NEXT: [[V:%.*]] = add i8 [[X]], [[Y]]
401
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
402
+ ; CHECK-NEXT: ret i1 [[R]]
403
+ ;
404
+ %x_eq_1 = icmp eq i8 %x , 1
405
+ %y = zext i1 %x_eq_1 to i8
406
+ %v = add i8 %x , %y
407
+ %r = icmp eq i8 %v , 0
408
+ ret i1 %r
409
+ }
410
+
411
+ define i1 @src_x_or_x_eq_0 (i8 %x ) {
412
+ ; CHECK-LABEL: @src_x_or_x_eq_0(
413
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
414
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
415
+ ; CHECK-NEXT: [[V:%.*]] = or i8 [[X]], [[Y]]
416
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
417
+ ; CHECK-NEXT: ret i1 [[R]]
418
+ ;
419
+ %x_eq_0 = icmp eq i8 %x , 0
420
+ %y = sext i1 %x_eq_0 to i8
421
+ %v = or i8 %x , %y
422
+ %r = icmp eq i8 %v , 0
423
+ ret i1 %r
424
+ }
425
+
426
+ define i1 @src_x_or_x_sle_0_fail (i8 %x ) {
427
+ ; CHECK-LABEL: @src_x_or_x_sle_0_fail(
428
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp sle i8 [[X:%.*]], 0
429
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
430
+ ; CHECK-NEXT: [[V:%.*]] = or i8 [[X]], [[Y]]
431
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
432
+ ; CHECK-NEXT: ret i1 [[R]]
433
+ ;
434
+ %x_eq_0 = icmp sle i8 %x , 0
435
+ %y = sext i1 %x_eq_0 to i8
436
+ %v = or i8 %x , %y
437
+ %r = icmp eq i8 %v , 0
438
+ ret i1 %r
439
+ }
440
+
441
+ define i1 @src_x_xor_x_eq_0 (i8 %x ) {
442
+ ; CHECK-LABEL: @src_x_xor_x_eq_0(
443
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
444
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
445
+ ; CHECK-NEXT: [[V:%.*]] = xor i8 [[X]], [[Y]]
446
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
447
+ ; CHECK-NEXT: ret i1 [[R]]
448
+ ;
449
+ %x_eq_0 = icmp eq i8 %x , 0
450
+ %y = zext i1 %x_eq_0 to i8
451
+ %v = xor i8 %x , %y
452
+ %r = icmp eq i8 %v , 0
453
+ ret i1 %r
454
+ }
455
+
456
+ define i1 @src_x_xor_x_ne_0_fail (i8 %x ) {
457
+ ; CHECK-LABEL: @src_x_xor_x_ne_0_fail(
458
+ ; CHECK-NEXT: [[X_NE_0:%.*]] = icmp ne i8 [[X:%.*]], 0
459
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_NE_0]] to i8
460
+ ; CHECK-NEXT: [[V:%.*]] = xor i8 [[X]], [[Y]]
461
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
462
+ ; CHECK-NEXT: ret i1 [[R]]
463
+ ;
464
+ %x_ne_0 = icmp ne i8 %x , 0
465
+ %y = zext i1 %x_ne_0 to i8
466
+ %v = xor i8 %x , %y
467
+ %r = icmp eq i8 %v , 0
468
+ ret i1 %r
469
+ }
470
+
471
+ define i1 @src_x_sub0_x_eq_0 (i8 %x ) {
472
+ ; CHECK-LABEL: @src_x_sub0_x_eq_0(
473
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
474
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
475
+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[X]], [[Y]]
476
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
477
+ ; CHECK-NEXT: ret i1 [[R]]
478
+ ;
479
+ %x_eq_0 = icmp eq i8 %x , 0
480
+ %y = sext i1 %x_eq_0 to i8
481
+ %v = sub i8 %x , %y
482
+ %r = icmp eq i8 %v , 0
483
+ ret i1 %r
484
+ }
485
+
486
+ define i1 @src_x_sub0_z_eq_0_fail (i8 %x , i8 %z ) {
487
+ ; CHECK-LABEL: @src_x_sub0_z_eq_0_fail(
488
+ ; CHECK-NEXT: [[Z_EQ_0:%.*]] = icmp eq i8 [[Z:%.*]], 0
489
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[Z_EQ_0]] to i8
490
+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[X:%.*]], [[Y]]
491
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
492
+ ; CHECK-NEXT: ret i1 [[R]]
493
+ ;
494
+ %z_eq_0 = icmp eq i8 %z , 0
495
+ %y = sext i1 %z_eq_0 to i8
496
+ %v = sub i8 %x , %y
497
+ %r = icmp eq i8 %v , 0
498
+ ret i1 %r
499
+ }
500
+
501
+ define i1 @src_x_sub1_x_eq_0 (i8 %x ) {
502
+ ; CHECK-LABEL: @src_x_sub1_x_eq_0(
503
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
504
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
505
+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[Y]], [[X]]
506
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
507
+ ; CHECK-NEXT: ret i1 [[R]]
508
+ ;
509
+ %x_eq_0 = icmp eq i8 %x , 0
510
+ %y = zext i1 %x_eq_0 to i8
511
+ %v = sub i8 %y , %x
512
+ %r = icmp eq i8 %v , 0
513
+ ret i1 %r
514
+ }
515
+
516
+ define i1 @src_x_sub1_x_eq_0_or_fail (i8 %x , i1 %c1 ) {
517
+ ; CHECK-LABEL: @src_x_sub1_x_eq_0_or_fail(
518
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
519
+ ; CHECK-NEXT: [[X_EQ_0_OR:%.*]] = or i1 [[X_EQ_0]], [[C1:%.*]]
520
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0_OR]] to i8
521
+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[Y]], [[X]]
522
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
523
+ ; CHECK-NEXT: ret i1 [[R]]
524
+ ;
525
+ %x_eq_0 = icmp eq i8 %x , 0
526
+ %x_eq_0_or = or i1 %x_eq_0 , %c1
527
+ %y = zext i1 %x_eq_0_or to i8
528
+ %v = sub i8 %y , %x
529
+ %r = icmp eq i8 %v , 0
530
+ ret i1 %r
531
+ }
532
+
533
+ define i1 @src_x_umax_x_eq_0 (i8 %x ) {
534
+ ; CHECK-LABEL: @src_x_umax_x_eq_0(
535
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
536
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
537
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
538
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
539
+ ; CHECK-NEXT: ret i1 [[R]]
540
+ ;
541
+ %x_eq_0 = icmp eq i8 %x , 0
542
+ %y = sext i1 %x_eq_0 to i8
543
+ %v = call i8 @llvm.umax.i8 (i8 %y , i8 %x )
544
+ %r = icmp eq i8 %v , 0
545
+ ret i1 %r
546
+ }
547
+
548
+ define i1 @src_x_umax_x_ugt_10_fail (i8 %x ) {
549
+ ; CHECK-LABEL: @src_x_umax_x_ugt_10_fail(
550
+ ; CHECK-NEXT: [[X_UGT_10:%.*]] = icmp ugt i8 [[X:%.*]], 10
551
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_UGT_10]] to i8
552
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
553
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
554
+ ; CHECK-NEXT: ret i1 [[R]]
555
+ ;
556
+ %x_ugt_10 = icmp ugt i8 %x , 10
557
+ %y = sext i1 %x_ugt_10 to i8
558
+ %v = call i8 @llvm.umax.i8 (i8 %y , i8 %x )
559
+ %r = icmp eq i8 %v , 0
560
+ ret i1 %r
561
+ }
562
+
563
+ define i1 @src_x_uadd.sat_x_eq_0 (i8 %x ) {
564
+ ; CHECK-LABEL: @src_x_uadd.sat_x_eq_0(
565
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
566
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
567
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[Y]], i8 [[X]])
568
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
569
+ ; CHECK-NEXT: ret i1 [[R]]
570
+ ;
571
+ %x_eq_0 = icmp eq i8 %x , 0
572
+ %y = zext i1 %x_eq_0 to i8
573
+ %v = call i8 @llvm.uadd.sat.i8 (i8 %y , i8 %x )
574
+ %r = icmp eq i8 %v , 0
575
+ ret i1 %r
576
+ }
577
+
578
+ define i1 @src_x_uadd.sat_c1_fail (i8 %x , i1 %c1 ) {
579
+ ; CHECK-LABEL: @src_x_uadd.sat_c1_fail(
580
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[C1:%.*]] to i8
581
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[Y]], i8 [[X:%.*]])
582
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
583
+ ; CHECK-NEXT: ret i1 [[R]]
584
+ ;
585
+ %y = zext i1 %c1 to i8
586
+ %v = call i8 @llvm.uadd.sat.i8 (i8 %y , i8 %x )
587
+ %r = icmp eq i8 %v , 0
588
+ ret i1 %r
589
+ }
590
+
0 commit comments