@@ -472,3 +472,255 @@ trap:
472
472
call void @llvm.trap ()
473
473
unreachable
474
474
}
475
+
476
+ define i1 @uadd_val (i8 %x , i1* %pc ) {
477
+ ; CHECK-LABEL: @uadd_val(
478
+ ; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 [[X:%.*]], i8 100)
479
+ ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
480
+ ; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
481
+ ; CHECK: no_overflow:
482
+ ; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
483
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
484
+ ; CHECK: split:
485
+ ; CHECK-NEXT: [[C1:%.*]] = icmp ugt i8 [[VAL]], 100
486
+ ; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
487
+ ; CHECK-NEXT: [[C2:%.*]] = icmp uge i8 [[VAL]], 100
488
+ ; CHECK-NEXT: ret i1 [[C2]]
489
+ ; CHECK: trap:
490
+ ; CHECK-NEXT: call void @llvm.trap()
491
+ ; CHECK-NEXT: unreachable
492
+ ;
493
+ %val_ov = call {i8 , i1 } @llvm.uadd.with.overflow (i8 %x , i8 100 )
494
+ %ov = extractvalue {i8 , i1 } %val_ov , 1
495
+ br i1 %ov , label %trap , label %no_overflow
496
+
497
+ no_overflow:
498
+ %val = extractvalue {i8 , i1 } %val_ov , 0
499
+ br label %split
500
+
501
+ split:
502
+ %c1 = icmp ugt i8 %val , 100
503
+ store i1 %c1 , i1* %pc
504
+ %c2 = icmp uge i8 %val , 100
505
+ ret i1 %c2
506
+
507
+ trap:
508
+ call void @llvm.trap ()
509
+ unreachable
510
+ }
511
+
512
+ define i1 @sadd_val (i8 %x , i1* %pc ) {
513
+ ; CHECK-LABEL: @sadd_val(
514
+ ; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 [[X:%.*]], i8 100)
515
+ ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
516
+ ; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
517
+ ; CHECK: no_overflow:
518
+ ; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
519
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
520
+ ; CHECK: split:
521
+ ; CHECK-NEXT: [[C1:%.*]] = icmp sgt i8 [[VAL]], -28
522
+ ; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
523
+ ; CHECK-NEXT: [[C2:%.*]] = icmp sge i8 [[VAL]], -28
524
+ ; CHECK-NEXT: ret i1 [[C2]]
525
+ ; CHECK: trap:
526
+ ; CHECK-NEXT: call void @llvm.trap()
527
+ ; CHECK-NEXT: unreachable
528
+ ;
529
+ %val_ov = call {i8 , i1 } @llvm.sadd.with.overflow (i8 %x , i8 100 )
530
+ %ov = extractvalue {i8 , i1 } %val_ov , 1
531
+ br i1 %ov , label %trap , label %no_overflow
532
+
533
+ no_overflow:
534
+ %val = extractvalue {i8 , i1 } %val_ov , 0
535
+ br label %split
536
+
537
+ split:
538
+ %c1 = icmp sgt i8 %val , -28
539
+ store i1 %c1 , i1* %pc
540
+ %c2 = icmp sge i8 %val , -28
541
+ ret i1 %c2
542
+
543
+ trap:
544
+ call void @llvm.trap ()
545
+ unreachable
546
+ }
547
+
548
+ define i1 @usub_val (i8 %x , i1* %pc ) {
549
+ ; CHECK-LABEL: @usub_val(
550
+ ; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[X:%.*]], i8 100)
551
+ ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
552
+ ; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
553
+ ; CHECK: no_overflow:
554
+ ; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
555
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
556
+ ; CHECK: split:
557
+ ; CHECK-NEXT: [[C1:%.*]] = icmp ult i8 [[VAL]], -101
558
+ ; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
559
+ ; CHECK-NEXT: [[C2:%.*]] = icmp ule i8 [[VAL]], -101
560
+ ; CHECK-NEXT: ret i1 [[C2]]
561
+ ; CHECK: trap:
562
+ ; CHECK-NEXT: call void @llvm.trap()
563
+ ; CHECK-NEXT: unreachable
564
+ ;
565
+ %val_ov = call {i8 , i1 } @llvm.usub.with.overflow (i8 %x , i8 100 )
566
+ %ov = extractvalue {i8 , i1 } %val_ov , 1
567
+ br i1 %ov , label %trap , label %no_overflow
568
+
569
+ no_overflow:
570
+ %val = extractvalue {i8 , i1 } %val_ov , 0
571
+ br label %split
572
+
573
+ split:
574
+ %c1 = icmp ult i8 %val , 155
575
+ store i1 %c1 , i1* %pc
576
+ %c2 = icmp ule i8 %val , 155
577
+ ret i1 %c2
578
+
579
+ trap:
580
+ call void @llvm.trap ()
581
+ unreachable
582
+ }
583
+
584
+ define i1 @ssub_val (i8 %x , i1* %pc ) {
585
+ ; CHECK-LABEL: @ssub_val(
586
+ ; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[X:%.*]], i8 100)
587
+ ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
588
+ ; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
589
+ ; CHECK: no_overflow:
590
+ ; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
591
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
592
+ ; CHECK: split:
593
+ ; CHECK-NEXT: [[C1:%.*]] = icmp slt i8 [[VAL]], 27
594
+ ; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
595
+ ; CHECK-NEXT: [[C2:%.*]] = icmp sle i8 [[VAL]], 27
596
+ ; CHECK-NEXT: ret i1 [[C2]]
597
+ ; CHECK: trap:
598
+ ; CHECK-NEXT: call void @llvm.trap()
599
+ ; CHECK-NEXT: unreachable
600
+ ;
601
+ %val_ov = call {i8 , i1 } @llvm.ssub.with.overflow (i8 %x , i8 100 )
602
+ %ov = extractvalue {i8 , i1 } %val_ov , 1
603
+ br i1 %ov , label %trap , label %no_overflow
604
+
605
+ no_overflow:
606
+ %val = extractvalue {i8 , i1 } %val_ov , 0
607
+ br label %split
608
+
609
+ split:
610
+ %c1 = icmp slt i8 %val , 27
611
+ store i1 %c1 , i1* %pc
612
+ %c2 = icmp sle i8 %val , 27
613
+ ret i1 %c2
614
+
615
+ trap:
616
+ call void @llvm.trap ()
617
+ unreachable
618
+ }
619
+
620
+ define i1 @umul_val (i8 %x , i1* %pc ) {
621
+ ; CHECK-LABEL: @umul_val(
622
+ ; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.umul.with.overflow.i8(i8 [[X:%.*]], i8 10)
623
+ ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
624
+ ; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
625
+ ; CHECK: no_overflow:
626
+ ; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
627
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
628
+ ; CHECK: split:
629
+ ; CHECK-NEXT: [[C1:%.*]] = icmp ult i8 [[VAL]], -6
630
+ ; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
631
+ ; CHECK-NEXT: [[C2:%.*]] = icmp ule i8 [[VAL]], -6
632
+ ; CHECK-NEXT: ret i1 [[C2]]
633
+ ; CHECK: trap:
634
+ ; CHECK-NEXT: call void @llvm.trap()
635
+ ; CHECK-NEXT: unreachable
636
+ ;
637
+ %val_ov = call {i8 , i1 } @llvm.umul.with.overflow (i8 %x , i8 10 )
638
+ %ov = extractvalue {i8 , i1 } %val_ov , 1
639
+ br i1 %ov , label %trap , label %no_overflow
640
+
641
+ no_overflow:
642
+ %val = extractvalue {i8 , i1 } %val_ov , 0
643
+ br label %split
644
+
645
+ split:
646
+ %c1 = icmp ult i8 %val , 250
647
+ store i1 %c1 , i1* %pc
648
+ %c2 = icmp ule i8 %val , 250
649
+ ret i1 %c2
650
+
651
+ trap:
652
+ call void @llvm.trap ()
653
+ unreachable
654
+ }
655
+
656
+ define i1 @smul_val_bound1 (i8 %x , i1* %pc ) {
657
+ ; CHECK-LABEL: @smul_val_bound1(
658
+ ; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 [[X:%.*]], i8 10)
659
+ ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
660
+ ; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
661
+ ; CHECK: no_overflow:
662
+ ; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
663
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
664
+ ; CHECK: split:
665
+ ; CHECK-NEXT: [[C1:%.*]] = icmp slt i8 [[VAL]], 120
666
+ ; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
667
+ ; CHECK-NEXT: [[C2:%.*]] = icmp sle i8 [[VAL]], 120
668
+ ; CHECK-NEXT: ret i1 [[C2]]
669
+ ; CHECK: trap:
670
+ ; CHECK-NEXT: call void @llvm.trap()
671
+ ; CHECK-NEXT: unreachable
672
+ ;
673
+ %val_ov = call {i8 , i1 } @llvm.smul.with.overflow (i8 %x , i8 10 )
674
+ %ov = extractvalue {i8 , i1 } %val_ov , 1
675
+ br i1 %ov , label %trap , label %no_overflow
676
+
677
+ no_overflow:
678
+ %val = extractvalue {i8 , i1 } %val_ov , 0
679
+ br label %split
680
+
681
+ split:
682
+ %c1 = icmp slt i8 %val , 120
683
+ store i1 %c1 , i1* %pc
684
+ %c2 = icmp sle i8 %val , 120
685
+ ret i1 %c2
686
+
687
+ trap:
688
+ call void @llvm.trap ()
689
+ unreachable
690
+ }
691
+
692
+ define i1 @smul_val_bound2 (i8 %x , i1* %pc ) {
693
+ ; CHECK-LABEL: @smul_val_bound2(
694
+ ; CHECK-NEXT: [[VAL_OV:%.*]] = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 [[X:%.*]], i8 10)
695
+ ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
696
+ ; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
697
+ ; CHECK: no_overflow:
698
+ ; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 0
699
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
700
+ ; CHECK: split:
701
+ ; CHECK-NEXT: [[C1:%.*]] = icmp sgt i8 [[VAL]], -120
702
+ ; CHECK-NEXT: store i1 [[C1]], i1* [[PC:%.*]]
703
+ ; CHECK-NEXT: [[C2:%.*]] = icmp sge i8 [[VAL]], -120
704
+ ; CHECK-NEXT: ret i1 [[C2]]
705
+ ; CHECK: trap:
706
+ ; CHECK-NEXT: call void @llvm.trap()
707
+ ; CHECK-NEXT: unreachable
708
+ ;
709
+ %val_ov = call {i8 , i1 } @llvm.smul.with.overflow (i8 %x , i8 10 )
710
+ %ov = extractvalue {i8 , i1 } %val_ov , 1
711
+ br i1 %ov , label %trap , label %no_overflow
712
+
713
+ no_overflow:
714
+ %val = extractvalue {i8 , i1 } %val_ov , 0
715
+ br label %split
716
+
717
+ split:
718
+ %c1 = icmp sgt i8 %val , -120
719
+ store i1 %c1 , i1* %pc
720
+ %c2 = icmp sge i8 %val , -120
721
+ ret i1 %c2
722
+
723
+ trap:
724
+ call void @llvm.trap ()
725
+ unreachable
726
+ }
0 commit comments