@@ -729,8 +729,8 @@ define { <2 x i32>, <2 x i1> } @uaddo_vec(<2 x i32> %a) {
729
729
}
730
730
731
731
732
- define i8 @uadd_sat_no_overflow (i8 %x ) {
733
- ; CHECK-LABEL: @uadd_sat_no_overflow (
732
+ define i8 @uadd_sat_no_unsigned_overflow (i8 %x ) {
733
+ ; CHECK-LABEL: @uadd_sat_no_unsigned_overflow (
734
734
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 100
735
735
; CHECK-NEXT: br i1 [[CMP]], label [[TRAP:%.*]], label [[CONT:%.*]]
736
736
; CHECK: trap:
@@ -752,8 +752,31 @@ cont:
752
752
ret i8 %res
753
753
}
754
754
755
- define i8 @sadd_sat_no_overflow (i8 %x ) {
756
- ; CHECK-LABEL: @sadd_sat_no_overflow(
755
+ define i8 @uadd_sat_no_overflow (i8 %x ) {
756
+ ; CHECK-LABEL: @uadd_sat_no_overflow(
757
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 27
758
+ ; CHECK-NEXT: br i1 [[CMP]], label [[TRAP:%.*]], label [[CONT:%.*]]
759
+ ; CHECK: trap:
760
+ ; CHECK-NEXT: call void @llvm.trap()
761
+ ; CHECK-NEXT: unreachable
762
+ ; CHECK: cont:
763
+ ; CHECK-NEXT: [[RES1:%.*]] = add nuw i8 [[X]], 100
764
+ ; CHECK-NEXT: ret i8 [[RES1]]
765
+ ;
766
+ %cmp = icmp ugt i8 %x , 27
767
+ br i1 %cmp , label %trap , label %cont
768
+
769
+ trap:
770
+ call void @llvm.trap ()
771
+ unreachable
772
+
773
+ cont:
774
+ %res = call i8 @llvm.uadd.sat.i8 (i8 %x , i8 100 )
775
+ ret i8 %res
776
+ }
777
+
778
+ define i8 @sadd_sat_no_signed_overflow (i8 %x ) {
779
+ ; CHECK-LABEL: @sadd_sat_no_signed_overflow(
757
780
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 100
758
781
; CHECK-NEXT: br i1 [[CMP]], label [[TRAP:%.*]], label [[CONT:%.*]]
759
782
; CHECK: trap:
@@ -775,8 +798,31 @@ cont:
775
798
ret i8 %res
776
799
}
777
800
778
- define i8 @usub_sat_no_overflow (i8 %x ) {
779
- ; CHECK-LABEL: @usub_sat_no_overflow(
801
+ define i8 @sadd_sat_no_overflow (i8 %x ) {
802
+ ; CHECK-LABEL: @sadd_sat_no_overflow(
803
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 107
804
+ ; CHECK-NEXT: br i1 [[CMP]], label [[TRAP:%.*]], label [[CONT:%.*]]
805
+ ; CHECK: trap:
806
+ ; CHECK-NEXT: call void @llvm.trap()
807
+ ; CHECK-NEXT: unreachable
808
+ ; CHECK: cont:
809
+ ; CHECK-NEXT: [[RES1:%.*]] = add nsw i8 [[X]], 20
810
+ ; CHECK-NEXT: ret i8 [[RES1]]
811
+ ;
812
+ %cmp = icmp ugt i8 %x , 107
813
+ br i1 %cmp , label %trap , label %cont
814
+
815
+ trap:
816
+ call void @llvm.trap ()
817
+ unreachable
818
+
819
+ cont:
820
+ %res = call i8 @llvm.sadd.sat.i8 (i8 %x , i8 20 )
821
+ ret i8 %res
822
+ }
823
+
824
+ define i8 @usub_sat_no_unsigned_overflow (i8 %x ) {
825
+ ; CHECK-LABEL: @usub_sat_no_unsigned_overflow(
780
826
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], 100
781
827
; CHECK-NEXT: br i1 [[CMP]], label [[TRAP:%.*]], label [[CONT:%.*]]
782
828
; CHECK: trap:
@@ -798,8 +844,31 @@ cont:
798
844
ret i8 %res
799
845
}
800
846
801
- define i8 @ssub_sat_no_overflow (i8 %x ) {
802
- ; CHECK-LABEL: @ssub_sat_no_overflow(
847
+ define i8 @usub_sat_no_overflow (i8 %x ) {
848
+ ; CHECK-LABEL: @usub_sat_no_overflow(
849
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], -28
850
+ ; CHECK-NEXT: br i1 [[CMP]], label [[TRAP:%.*]], label [[CONT:%.*]]
851
+ ; CHECK: trap:
852
+ ; CHECK-NEXT: call void @llvm.trap()
853
+ ; CHECK-NEXT: unreachable
854
+ ; CHECK: cont:
855
+ ; CHECK-NEXT: [[RES1:%.*]] = sub nuw i8 [[X]], 100
856
+ ; CHECK-NEXT: ret i8 [[RES1]]
857
+ ;
858
+ %cmp = icmp ult i8 %x , 228
859
+ br i1 %cmp , label %trap , label %cont
860
+
861
+ trap:
862
+ call void @llvm.trap ()
863
+ unreachable
864
+
865
+ cont:
866
+ %res = call i8 @llvm.usub.sat.i8 (i8 %x , i8 100 )
867
+ ret i8 %res
868
+ }
869
+
870
+ define i8 @ssub_sat_no_signed_overflow (i8 %x ) {
871
+ ; CHECK-LABEL: @ssub_sat_no_signed_overflow(
803
872
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -100
804
873
; CHECK-NEXT: br i1 [[CMP]], label [[TRAP:%.*]], label [[CONT:%.*]]
805
874
; CHECK: trap:
@@ -821,6 +890,29 @@ cont:
821
890
ret i8 %res
822
891
}
823
892
893
+ define i8 @ssub_sat_no_overflow (i8 %x ) {
894
+ ; CHECK-LABEL: @ssub_sat_no_overflow(
895
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], -108
896
+ ; CHECK-NEXT: br i1 [[CMP]], label [[TRAP:%.*]], label [[CONT:%.*]]
897
+ ; CHECK: trap:
898
+ ; CHECK-NEXT: call void @llvm.trap()
899
+ ; CHECK-NEXT: unreachable
900
+ ; CHECK: cont:
901
+ ; CHECK-NEXT: [[RES1:%.*]] = sub nsw i8 [[X]], 20
902
+ ; CHECK-NEXT: ret i8 [[RES1]]
903
+ ;
904
+ %cmp = icmp ult i8 %x , 148
905
+ br i1 %cmp , label %trap , label %cont
906
+
907
+ trap:
908
+ call void @llvm.trap ()
909
+ unreachable
910
+
911
+ cont:
912
+ %res = call i8 @llvm.ssub.sat.i8 (i8 %x , i8 20 )
913
+ ret i8 %res
914
+ }
915
+
824
916
define <2 x i8 > @uadd_sat_vec (<2 x i8 > %a ) {
825
917
; CHECK-LABEL: @uadd_sat_vec(
826
918
; CHECK-NEXT: [[ADD:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> [[A:%.*]], <2 x i8> <i8 1, i8 1>)
0 commit comments