@@ -986,3 +986,100 @@ exit1:
986
986
exit2:
987
987
ret i1 %cmp2
988
988
}
989
+
990
+ define i1 @uadd_sat_unknown (i32 %a ) {
991
+ ; CHECK-LABEL: @uadd_sat_unknown(
992
+ ; CHECK-NEXT: entry:
993
+ ; CHECK-NEXT: [[VAL:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[A:%.*]], i32 100)
994
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i32 [[VAL]], 100
995
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[VAL]], 100
996
+ ; CHECK-NEXT: br i1 undef, label [[EXIT1:%.*]], label [[EXIT2:%.*]]
997
+ ; CHECK: exit1:
998
+ ; CHECK-NEXT: ret i1 [[CMP1]]
999
+ ; CHECK: exit2:
1000
+ ; CHECK-NEXT: ret i1 [[CMP2]]
1001
+ ;
1002
+ entry:
1003
+ %val = call i32 @llvm.uadd.sat.i32 (i32 %a , i32 100 )
1004
+ %cmp1 = icmp uge i32 %val , 100
1005
+ %cmp2 = icmp ugt i32 %val , 100
1006
+ br i1 undef , label %exit1 , label %exit2
1007
+ exit1:
1008
+ ret i1 %cmp1
1009
+ exit2:
1010
+ ret i1 %cmp2
1011
+ }
1012
+
1013
+ define i1 @usub_sat_unknown (i32 %a ) {
1014
+ ; CHECK-LABEL: @usub_sat_unknown(
1015
+ ; CHECK-NEXT: entry:
1016
+ ; CHECK-NEXT: [[VAL:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[A:%.*]], i32 100)
1017
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ule i32 [[VAL]], -101
1018
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[VAL]], -101
1019
+ ; CHECK-NEXT: br i1 undef, label [[EXIT1:%.*]], label [[EXIT2:%.*]]
1020
+ ; CHECK: exit1:
1021
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1022
+ ; CHECK: exit2:
1023
+ ; CHECK-NEXT: ret i1 [[CMP2]]
1024
+ ;
1025
+ entry:
1026
+ %val = call i32 @llvm.usub.sat.i32 (i32 %a , i32 100 )
1027
+ %cmp1 = icmp ule i32 %val , 4294967195
1028
+ %cmp2 = icmp ult i32 %val , 4294967195
1029
+ br i1 undef , label %exit1 , label %exit2
1030
+ exit1:
1031
+ ret i1 %cmp1
1032
+ exit2:
1033
+ ret i1 %cmp2
1034
+ }
1035
+
1036
+ define i1 @sadd_sat_unknown (i32 %a ) {
1037
+ ; CHECK-LABEL: @sadd_sat_unknown(
1038
+ ; CHECK-NEXT: entry:
1039
+ ; CHECK-NEXT: [[VAL:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[A:%.*]], i32 100)
1040
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[VAL]], -2147483548
1041
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[VAL]], -2147483548
1042
+ ; CHECK-NEXT: br i1 undef, label [[EXIT1:%.*]], label [[EXIT2:%.*]]
1043
+ ; CHECK: exit1:
1044
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1045
+ ; CHECK: exit2:
1046
+ ; CHECK-NEXT: ret i1 [[CMP2]]
1047
+ ;
1048
+ entry:
1049
+ %val = call i32 @llvm.sadd.sat.i32 (i32 %a , i32 100 )
1050
+ %cmp1 = icmp sge i32 %val , -2147483548
1051
+ %cmp2 = icmp sgt i32 %val , -2147483548
1052
+ br i1 undef , label %exit1 , label %exit2
1053
+ exit1:
1054
+ ret i1 %cmp1
1055
+ exit2:
1056
+ ret i1 %cmp2
1057
+ }
1058
+
1059
+ define i1 @ssub_sat_unknown (i32 %a ) {
1060
+ ; CHECK-LABEL: @ssub_sat_unknown(
1061
+ ; CHECK-NEXT: entry:
1062
+ ; CHECK-NEXT: [[VAL:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[A:%.*]], i32 100)
1063
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp sle i32 [[VAL]], 2147483547
1064
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[VAL]], 2147483547
1065
+ ; CHECK-NEXT: br i1 undef, label [[EXIT1:%.*]], label [[EXIT2:%.*]]
1066
+ ; CHECK: exit1:
1067
+ ; CHECK-NEXT: ret i1 [[CMP1]]
1068
+ ; CHECK: exit2:
1069
+ ; CHECK-NEXT: ret i1 [[CMP2]]
1070
+ ;
1071
+ entry:
1072
+ %val = call i32 @llvm.ssub.sat.i32 (i32 %a , i32 100 )
1073
+ %cmp1 = icmp sle i32 %val , 2147483547
1074
+ %cmp2 = icmp slt i32 %val , 2147483547
1075
+ br i1 undef , label %exit1 , label %exit2
1076
+ exit1:
1077
+ ret i1 %cmp1
1078
+ exit2:
1079
+ ret i1 %cmp2
1080
+ }
1081
+
1082
+ declare i32 @llvm.uadd.sat.i32 (i32 , i32 )
1083
+ declare i32 @llvm.usub.sat.i32 (i32 , i32 )
1084
+ declare i32 @llvm.sadd.sat.i32 (i32 , i32 )
1085
+ declare i32 @llvm.ssub.sat.i32 (i32 , i32 )
0 commit comments