@@ -932,3 +932,119 @@ define i1 @usub_uge_fail(i8 %x, i8 %y) {
932932 %cmp = icmp uge i8 %sat , %x
933933 ret i1 %cmp
934934}
935+
936+ define i1 @icmp_ult_uaddsat_add (i32 %x , i32 %y ) {
937+ ; CHECK-LABEL: @icmp_ult_uaddsat_add(
938+ ; CHECK-NEXT: ret i1 false
939+ ;
940+ %uaddsat = call i32 @llvm.uadd.sat.i32 (i32 %x , i32 %y )
941+ %add = add i32 %x , %y
942+ %cmp = icmp ult i32 %uaddsat , %add
943+ ret i1 %cmp
944+ }
945+
946+ define i1 @icmp_uge_uaddsat_add (i32 %x , i32 %y ) {
947+ ; CHECK-LABEL: @icmp_uge_uaddsat_add(
948+ ; CHECK-NEXT: ret i1 true
949+ ;
950+ %uaddsat = call i32 @llvm.uadd.sat.i32 (i32 %x , i32 %y )
951+ %add = add i32 %x , %y
952+ %cmp = icmp uge i32 %uaddsat , %add
953+ ret i1 %cmp
954+ }
955+
956+ define i1 @icmp_ugt_uaddsat_add_commuted1 (i32 %x , i32 %y ) {
957+ ; CHECK-LABEL: @icmp_ugt_uaddsat_add_commuted1(
958+ ; CHECK-NEXT: ret i1 false
959+ ;
960+ %uaddsat = call i32 @llvm.uadd.sat.i32 (i32 %x , i32 %y )
961+ %add = add i32 %x , %y
962+ %cmp = icmp ugt i32 %add , %uaddsat
963+ ret i1 %cmp
964+ }
965+
966+ define i1 @icmp_ult_uaddsat_add_commuted2 (i32 %x , i32 %y ) {
967+ ; CHECK-LABEL: @icmp_ult_uaddsat_add_commuted2(
968+ ; CHECK-NEXT: ret i1 false
969+ ;
970+ %xx = mul i32 %x , 998244353
971+ %yy = mul i32 %y , 998244353
972+ %uaddsat = call i32 @llvm.uadd.sat.i32 (i32 %xx , i32 %yy )
973+ %add = add i32 %yy , %xx ; thwart complexity-based canonicalization
974+ %cmp = icmp ult i32 %uaddsat , %add
975+ ret i1 %cmp
976+ }
977+
978+ define i1 @icmp_ule_usubsat_sub (i32 %x , i32 %y ) {
979+ ; CHECK-LABEL: @icmp_ule_usubsat_sub(
980+ ; CHECK-NEXT: ret i1 true
981+ ;
982+ %usubsat = call i32 @llvm.usub.sat.i32 (i32 %x , i32 %y )
983+ %add = sub i32 %x , %y
984+ %cmp = icmp ule i32 %usubsat , %add
985+ ret i1 %cmp
986+ }
987+
988+ define i1 @icmp_ugt_usubsat_sub (i32 %x , i32 %y ) {
989+ ; CHECK-LABEL: @icmp_ugt_usubsat_sub(
990+ ; CHECK-NEXT: ret i1 false
991+ ;
992+ %usubsat = call i32 @llvm.usub.sat.i32 (i32 %x , i32 %y )
993+ %add = sub i32 %x , %y
994+ %cmp = icmp ugt i32 %usubsat , %add
995+ ret i1 %cmp
996+ }
997+
998+ ; Negative tests
999+
1000+ define i1 @icmp_ult_uaddsat_add_mismatch (i32 %x , i32 %y , i32 %z ) {
1001+ ; CHECK-LABEL: @icmp_ult_uaddsat_add_mismatch(
1002+ ; CHECK-NEXT: [[UADDSAT:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[X:%.*]], i32 [[Z:%.*]])
1003+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], [[Y:%.*]]
1004+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[UADDSAT]], [[ADD]]
1005+ ; CHECK-NEXT: ret i1 [[CMP]]
1006+ ;
1007+ %uaddsat = call i32 @llvm.uadd.sat.i32 (i32 %x , i32 %z )
1008+ %add = add i32 %x , %y
1009+ %cmp = icmp ult i32 %uaddsat , %add
1010+ ret i1 %cmp
1011+ }
1012+
1013+ define i1 @icmp_ult_uaddsat_add_wrong_pred (i32 %x , i32 %y ) {
1014+ ; CHECK-LABEL: @icmp_ult_uaddsat_add_wrong_pred(
1015+ ; CHECK-NEXT: [[UADDSAT:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
1016+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], [[Y]]
1017+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[UADDSAT]], [[ADD]]
1018+ ; CHECK-NEXT: ret i1 [[CMP]]
1019+ ;
1020+ %uaddsat = call i32 @llvm.uadd.sat.i32 (i32 %x , i32 %y )
1021+ %add = add i32 %x , %y
1022+ %cmp = icmp ule i32 %uaddsat , %add
1023+ ret i1 %cmp
1024+ }
1025+
1026+ define i1 @icmp_ult_uaddsat_add_wrong_op (i32 %x , i32 %y ) {
1027+ ; CHECK-LABEL: @icmp_ult_uaddsat_add_wrong_op(
1028+ ; CHECK-NEXT: [[UADDSAT:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
1029+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[X]], [[Y]]
1030+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[UADDSAT]], [[SUB]]
1031+ ; CHECK-NEXT: ret i1 [[CMP]]
1032+ ;
1033+ %uaddsat = call i32 @llvm.uadd.sat.i32 (i32 %x , i32 %y )
1034+ %sub = sub i32 %x , %y
1035+ %cmp = icmp ult i32 %uaddsat , %sub
1036+ ret i1 %cmp
1037+ }
1038+
1039+ define i1 @icmp_ule_usubsat_sub_commuted (i32 %x , i32 %y ) {
1040+ ; CHECK-LABEL: @icmp_ule_usubsat_sub_commuted(
1041+ ; CHECK-NEXT: [[USUBSAT:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
1042+ ; CHECK-NEXT: [[ADD:%.*]] = sub i32 [[Y]], [[X]]
1043+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i32 [[USUBSAT]], [[ADD]]
1044+ ; CHECK-NEXT: ret i1 [[CMP]]
1045+ ;
1046+ %usubsat = call i32 @llvm.usub.sat.i32 (i32 %x , i32 %y )
1047+ %add = sub i32 %y , %x
1048+ %cmp = icmp ule i32 %usubsat , %add
1049+ ret i1 %cmp
1050+ }
0 commit comments