@@ -1006,16 +1006,20 @@ exit:
1006
1006
1007
1007
define i1 @usubo_uge_i64_overflow_used (i64 %x , i64 %y , ptr %p ) {
1008
1008
; CHECK-LABEL: @usubo_uge_i64_overflow_used(
1009
- ; CHECK-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]
1010
- ; CHECK-NEXT: [[OV:%.*]] = icmp uge i64 [[X]], [[Y]]
1009
+ ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[X:%.*]], i64 [[Y:%.*]])
1010
+ ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
1011
+ ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
1012
+ ; CHECK-NEXT: [[OV:%.*]] = xor i1 [[OV1]], true
1011
1013
; CHECK-NEXT: ret i1 [[OV]]
1012
1014
;
1013
1015
; DEBUG-LABEL: @usubo_uge_i64_overflow_used(
1014
- ; DEBUG-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]], !dbg [[DBG340:![0-9]+]]
1015
- ; DEBUG-NEXT: #dbg_value(i64 [[S]], [[META338:![0-9]+]], !DIExpression(), [[DBG340]])
1016
- ; DEBUG-NEXT: [[OV:%.*]] = icmp uge i64 [[X]], [[Y]], !dbg [[DBG341:![0-9]+]]
1017
- ; DEBUG-NEXT: #dbg_value(i1 [[OV]], [[META339:![0-9]+]], !DIExpression(), [[DBG341]])
1018
- ; DEBUG-NEXT: ret i1 [[OV]], !dbg [[DBG342:![0-9]+]]
1016
+ ; DEBUG-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[X:%.*]], i64 [[Y:%.*]]), !dbg [[DBG340:![0-9]+]]
1017
+ ; DEBUG-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0, !dbg [[DBG340]]
1018
+ ; DEBUG-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !dbg [[DBG340]]
1019
+ ; DEBUG-NEXT: [[TMP2:%.*]] = xor i1 [[OV1]], true, !dbg [[DBG340]]
1020
+ ; DEBUG-NEXT: #dbg_value(i64 [[MATH]], [[META338:![0-9]+]], !DIExpression(), [[DBG340]])
1021
+ ; DEBUG-NEXT: #dbg_value(i1 [[TMP2]], [[META339:![0-9]+]], !DIExpression(), [[META341:![0-9]+]])
1022
+ ; DEBUG-NEXT: ret i1 [[TMP2]], !dbg [[DBG342:![0-9]+]]
1019
1023
;
1020
1024
%s = sub i64 %x , %y
1021
1025
%ov = icmp uge i64 %x , %y
@@ -1024,18 +1028,22 @@ define i1 @usubo_uge_i64_overflow_used(i64 %x, i64 %y, ptr %p) {
1024
1028
1025
1029
define i1 @usubo_uge_i64_math_overflow_used (i64 %x , i64 %y , ptr %p ) {
1026
1030
; CHECK-LABEL: @usubo_uge_i64_math_overflow_used(
1027
- ; CHECK-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]
1031
+ ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[X:%.*]], i64 [[Y:%.*]])
1032
+ ; CHECK-NEXT: [[S:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
1033
+ ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
1034
+ ; CHECK-NEXT: [[OV:%.*]] = xor i1 [[OV1]], true
1028
1035
; CHECK-NEXT: store i64 [[S]], ptr [[P:%.*]], align 8
1029
- ; CHECK-NEXT: [[OV:%.*]] = icmp uge i64 [[X]], [[Y]]
1030
1036
; CHECK-NEXT: ret i1 [[OV]]
1031
1037
;
1032
1038
; DEBUG-LABEL: @usubo_uge_i64_math_overflow_used(
1033
- ; DEBUG-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]], !dbg [[DBG347:![0-9]+]]
1034
- ; DEBUG-NEXT: #dbg_value(i64 [[S]], [[META345:![0-9]+]], !DIExpression(), [[DBG347]])
1035
- ; DEBUG-NEXT: store i64 [[S]], ptr [[P:%.*]], align 8, !dbg [[DBG348:![0-9]+]]
1036
- ; DEBUG-NEXT: [[OV:%.*]] = icmp uge i64 [[X]], [[Y]], !dbg [[DBG349:![0-9]+]]
1037
- ; DEBUG-NEXT: #dbg_value(i1 [[OV]], [[META346:![0-9]+]], !DIExpression(), [[DBG349]])
1038
- ; DEBUG-NEXT: ret i1 [[OV]], !dbg [[DBG350:![0-9]+]]
1039
+ ; DEBUG-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[X:%.*]], i64 [[Y:%.*]]), !dbg [[DBG347:![0-9]+]]
1040
+ ; DEBUG-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0, !dbg [[DBG347]]
1041
+ ; DEBUG-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !dbg [[DBG347]]
1042
+ ; DEBUG-NEXT: [[TMP2:%.*]] = xor i1 [[OV1]], true, !dbg [[DBG347]]
1043
+ ; DEBUG-NEXT: #dbg_value(i64 [[MATH]], [[META345:![0-9]+]], !DIExpression(), [[DBG347]])
1044
+ ; DEBUG-NEXT: store i64 [[MATH]], ptr [[P:%.*]], align 8, !dbg [[DBG348:![0-9]+]]
1045
+ ; DEBUG-NEXT: #dbg_value(i1 [[TMP2]], [[META346:![0-9]+]], !DIExpression(), [[META349:![0-9]+]])
1046
+ ; DEBUG-NEXT: ret i1 [[TMP2]], !dbg [[DBG350:![0-9]+]]
1039
1047
;
1040
1048
%s = sub i64 %x , %y
1041
1049
store i64 %s , ptr %p
@@ -1045,16 +1053,20 @@ define i1 @usubo_uge_i64_math_overflow_used(i64 %x, i64 %y, ptr %p) {
1045
1053
1046
1054
define i1 @usubo_ule_i32_overflow_used (i32 %x , i32 %y , ptr %p ) {
1047
1055
; CHECK-LABEL: @usubo_ule_i32_overflow_used(
1048
- ; CHECK-NEXT: [[S:%.*]] = sub i32 [[Y:%.*]], [[X:%.*]]
1049
- ; CHECK-NEXT: [[OV:%.*]] = icmp uge i32 [[Y]], [[X]]
1056
+ ; CHECK-NEXT: [[TMP1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[Y:%.*]], i32 [[X:%.*]])
1057
+ ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i32, i1 } [[TMP1]], 0
1058
+ ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1
1059
+ ; CHECK-NEXT: [[OV:%.*]] = xor i1 [[OV1]], true
1050
1060
; CHECK-NEXT: ret i1 [[OV]]
1051
1061
;
1052
1062
; DEBUG-LABEL: @usubo_ule_i32_overflow_used(
1053
- ; DEBUG-NEXT: [[S:%.*]] = sub i32 [[Y:%.*]], [[X:%.*]], !dbg [[DBG355:![0-9]+]]
1054
- ; DEBUG-NEXT: #dbg_value(i32 [[S]], [[META353:![0-9]+]], !DIExpression(), [[DBG355]])
1055
- ; DEBUG-NEXT: [[OV:%.*]] = icmp uge i32 [[Y]], [[X]], !dbg [[DBG356:![0-9]+]]
1056
- ; DEBUG-NEXT: #dbg_value(i1 [[OV]], [[META354:![0-9]+]], !DIExpression(), [[DBG356]])
1057
- ; DEBUG-NEXT: ret i1 [[OV]], !dbg [[DBG357:![0-9]+]]
1063
+ ; DEBUG-NEXT: [[TMP1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[Y:%.*]], i32 [[X:%.*]]), !dbg [[DBG355:![0-9]+]]
1064
+ ; DEBUG-NEXT: [[MATH:%.*]] = extractvalue { i32, i1 } [[TMP1]], 0, !dbg [[DBG355]]
1065
+ ; DEBUG-NEXT: [[OV1:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !dbg [[DBG355]]
1066
+ ; DEBUG-NEXT: [[TMP2:%.*]] = xor i1 [[OV1]], true, !dbg [[DBG355]]
1067
+ ; DEBUG-NEXT: #dbg_value(i32 [[MATH]], [[META353:![0-9]+]], !DIExpression(), [[DBG355]])
1068
+ ; DEBUG-NEXT: #dbg_value(i1 [[TMP2]], [[META354:![0-9]+]], !DIExpression(), [[META356:![0-9]+]])
1069
+ ; DEBUG-NEXT: ret i1 [[TMP2]], !dbg [[DBG357:![0-9]+]]
1058
1070
;
1059
1071
%s = sub i32 %y , %x
1060
1072
%ov = icmp ule i32 %x , %y
@@ -1063,18 +1075,22 @@ define i1 @usubo_ule_i32_overflow_used(i32 %x, i32 %y, ptr %p) {
1063
1075
1064
1076
define i1 @usubo_ne_zero_i16_overflow_used (i16 %x , ptr %p ) {
1065
1077
; CHECK-LABEL: @usubo_ne_zero_i16_overflow_used(
1066
- ; CHECK-NEXT: [[S:%.*]] = sub i16 [[X:%.*]], 1
1078
+ ; CHECK-NEXT: [[TMP1:%.*]] = call { i16, i1 } @llvm.usub.with.overflow.i16(i16 [[X:%.*]], i16 1)
1079
+ ; CHECK-NEXT: [[S:%.*]] = extractvalue { i16, i1 } [[TMP1]], 0
1080
+ ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1
1081
+ ; CHECK-NEXT: [[OV:%.*]] = xor i1 [[OV1]], true
1067
1082
; CHECK-NEXT: store i16 [[S]], ptr [[P:%.*]], align 2
1068
- ; CHECK-NEXT: [[OV:%.*]] = icmp ne i16 [[X]], 0
1069
1083
; CHECK-NEXT: ret i1 [[OV]]
1070
1084
;
1071
1085
; DEBUG-LABEL: @usubo_ne_zero_i16_overflow_used(
1072
- ; DEBUG-NEXT: [[S:%.*]] = sub i16 [[X:%.*]], 1, !dbg [[DBG362:![0-9]+]]
1073
- ; DEBUG-NEXT: #dbg_value(i16 [[S]], [[META360:![0-9]+]], !DIExpression(), [[DBG362]])
1074
- ; DEBUG-NEXT: store i16 [[S]], ptr [[P:%.*]], align 2, !dbg [[DBG363:![0-9]+]]
1075
- ; DEBUG-NEXT: [[OV:%.*]] = icmp ne i16 [[X]], 0, !dbg [[DBG364:![0-9]+]]
1076
- ; DEBUG-NEXT: #dbg_value(i1 [[OV]], [[META361:![0-9]+]], !DIExpression(), [[DBG364]])
1077
- ; DEBUG-NEXT: ret i1 [[OV]], !dbg [[DBG365:![0-9]+]]
1086
+ ; DEBUG-NEXT: [[TMP1:%.*]] = call { i16, i1 } @llvm.usub.with.overflow.i16(i16 [[X:%.*]], i16 1), !dbg [[DBG362:![0-9]+]]
1087
+ ; DEBUG-NEXT: [[MATH:%.*]] = extractvalue { i16, i1 } [[TMP1]], 0, !dbg [[DBG362]]
1088
+ ; DEBUG-NEXT: [[OV1:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !dbg [[DBG362]]
1089
+ ; DEBUG-NEXT: [[TMP2:%.*]] = xor i1 [[OV1]], true, !dbg [[DBG362]]
1090
+ ; DEBUG-NEXT: #dbg_value(i16 [[MATH]], [[META360:![0-9]+]], !DIExpression(), [[DBG362]])
1091
+ ; DEBUG-NEXT: store i16 [[MATH]], ptr [[P:%.*]], align 2, !dbg [[DBG363:![0-9]+]]
1092
+ ; DEBUG-NEXT: #dbg_value(i1 [[TMP2]], [[META361:![0-9]+]], !DIExpression(), [[META364:![0-9]+]])
1093
+ ; DEBUG-NEXT: ret i1 [[TMP2]], !dbg [[DBG365:![0-9]+]]
1078
1094
;
1079
1095
%s = sub i16 %x , 1
1080
1096
store i16 %s , ptr %p
@@ -1084,18 +1100,22 @@ define i1 @usubo_ne_zero_i16_overflow_used(i16 %x, ptr %p) {
1084
1100
1085
1101
define i1 @usubo_eq_zero_i8_overflow_used (i8 %x , ptr %p ) {
1086
1102
; CHECK-LABEL: @usubo_eq_zero_i8_overflow_used(
1087
- ; CHECK-NEXT: [[S:%.*]] = sub i8 0, [[X:%.*]]
1103
+ ; CHECK-NEXT: [[TMP1:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 0, i8 [[X:%.*]])
1104
+ ; CHECK-NEXT: [[S:%.*]] = extractvalue { i8, i1 } [[TMP1]], 0
1105
+ ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1
1106
+ ; CHECK-NEXT: [[OV:%.*]] = xor i1 [[OV1]], true
1088
1107
; CHECK-NEXT: store i8 [[S]], ptr [[P:%.*]], align 1
1089
- ; CHECK-NEXT: [[OV:%.*]] = icmp eq i8 [[X]], 0
1090
1108
; CHECK-NEXT: ret i1 [[OV]]
1091
1109
;
1092
1110
; DEBUG-LABEL: @usubo_eq_zero_i8_overflow_used(
1093
- ; DEBUG-NEXT: [[S:%.*]] = sub i8 0, [[X:%.*]], !dbg [[DBG370:![0-9]+]]
1094
- ; DEBUG-NEXT: #dbg_value(i8 [[S]], [[META368:![0-9]+]], !DIExpression(), [[DBG370]])
1095
- ; DEBUG-NEXT: store i8 [[S]], ptr [[P:%.*]], align 1, !dbg [[DBG371:![0-9]+]]
1096
- ; DEBUG-NEXT: [[OV:%.*]] = icmp eq i8 [[X]], 0, !dbg [[DBG372:![0-9]+]]
1097
- ; DEBUG-NEXT: #dbg_value(i1 [[OV]], [[META369:![0-9]+]], !DIExpression(), [[DBG372]])
1098
- ; DEBUG-NEXT: ret i1 [[OV]], !dbg [[DBG373:![0-9]+]]
1111
+ ; DEBUG-NEXT: [[TMP1:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 0, i8 [[X:%.*]]), !dbg [[DBG370:![0-9]+]]
1112
+ ; DEBUG-NEXT: [[MATH:%.*]] = extractvalue { i8, i1 } [[TMP1]], 0, !dbg [[DBG370]]
1113
+ ; DEBUG-NEXT: [[OV1:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !dbg [[DBG370]]
1114
+ ; DEBUG-NEXT: [[TMP2:%.*]] = xor i1 [[OV1]], true, !dbg [[DBG370]]
1115
+ ; DEBUG-NEXT: #dbg_value(i8 [[MATH]], [[META368:![0-9]+]], !DIExpression(), [[DBG370]])
1116
+ ; DEBUG-NEXT: store i8 [[MATH]], ptr [[P:%.*]], align 1, !dbg [[DBG371:![0-9]+]]
1117
+ ; DEBUG-NEXT: #dbg_value(i1 [[TMP2]], [[META369:![0-9]+]], !DIExpression(), [[META372:![0-9]+]])
1118
+ ; DEBUG-NEXT: ret i1 [[TMP2]], !dbg [[DBG373:![0-9]+]]
1099
1119
;
1100
1120
%s = sub i8 0 , %x
1101
1121
store i8 %s , ptr %p
0 commit comments