@@ -8,7 +8,9 @@ define i1 @uadd_sat_uge(i64 %a, i64 %b) {
8
8
; CHECK-LABEL: define i1 @uadd_sat_uge(
9
9
; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) {
10
10
; CHECK-NEXT: [[ADD_SAT:%.*]] = call i64 @llvm.uadd.sat.i64(i64 [[A]], i64 [[B]])
11
- ; CHECK-NEXT: [[CMP:%.*]] = and i1 true, true
11
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i64 [[ADD_SAT]], [[A]]
12
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[ADD_SAT]], [[B]]
13
+ ; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]]
12
14
; CHECK-NEXT: ret i1 [[CMP]]
13
15
;
14
16
%add.sat = call i64 @llvm.uadd.sat.i64 (i64 %a , i64 %b )
@@ -22,13 +24,42 @@ define i1 @usub_sat_ule_lhs(i64 %a, i64 %b) {
22
24
; CHECK-LABEL: define i1 @usub_sat_ule_lhs(
23
25
; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) {
24
26
; CHECK-NEXT: [[SUB_SAT:%.*]] = call i64 @llvm.usub.sat.i64(i64 [[A]], i64 [[B]])
25
- ; CHECK-NEXT: ret i1 true
27
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i64 [[SUB_SAT]], [[A]]
28
+ ; CHECK-NEXT: ret i1 [[CMP]]
26
29
;
27
30
%sub.sat = call i64 @llvm.usub.sat.i64 (i64 %a , i64 %b )
28
31
%cmp = icmp ule i64 %sub.sat , %a
29
32
ret i1 %cmp
30
33
}
31
34
35
+ define i64 @usub_sat_when_lhs_ugt_rhs (i64 %a , i64 %b ) {
36
+ ; CHECK-LABEL: define i64 @usub_sat_when_lhs_ugt_rhs(
37
+ ; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) {
38
+ ; CHECK-NEXT: [[PRECOND:%.*]] = icmp ugt i64 [[A]], [[B]]
39
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]])
40
+ ; CHECK-NEXT: [[SUB_SAT:%.*]] = call i64 @llvm.usub.sat.i64(i64 [[A]], i64 [[B]])
41
+ ; CHECK-NEXT: ret i64 [[SUB_SAT]]
42
+ ;
43
+ %precond = icmp ugt i64 %a , %b
44
+ call void @llvm.assume (i1 %precond )
45
+ %sub.sat = call i64 @llvm.usub.sat.i64 (i64 %a , i64 %b )
46
+ ret i64 %sub.sat
47
+ }
48
+
49
+ define i64 @usub_sat_when_lhs_ule_rhs (i64 %a , i64 %b ) {
50
+ ; CHECK-LABEL: define i64 @usub_sat_when_lhs_ule_rhs(
51
+ ; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) {
52
+ ; CHECK-NEXT: [[PRECOND:%.*]] = icmp ule i64 [[A]], [[B]]
53
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]])
54
+ ; CHECK-NEXT: [[SUB_SAT:%.*]] = call i64 @llvm.usub.sat.i64(i64 [[A]], i64 [[B]])
55
+ ; CHECK-NEXT: ret i64 [[SUB_SAT]]
56
+ ;
57
+ %precond = icmp ule i64 %a , %b
58
+ call void @llvm.assume (i1 %precond )
59
+ %sub.sat = call i64 @llvm.usub.sat.i64 (i64 %a , i64 %b )
60
+ ret i64 %sub.sat
61
+ }
62
+
32
63
; Negative test
33
64
define i1 @usub_sat_not_ule_rhs (i64 %a , i64 %b ) {
34
65
; CHECK-LABEL: define i1 @usub_sat_not_ule_rhs(
@@ -41,3 +72,13 @@ define i1 @usub_sat_not_ule_rhs(i64 %a, i64 %b) {
41
72
%cmp = icmp ule i64 %sub.sat , %b
42
73
ret i1 %cmp
43
74
}
75
+
76
+ define i64 @usub_sat_without_precond (i64 %a , i64 %b ) {
77
+ ; CHECK-LABEL: define i64 @usub_sat_without_precond(
78
+ ; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) {
79
+ ; CHECK-NEXT: [[SUB_SAT:%.*]] = call i64 @llvm.usub.sat.i64(i64 [[A]], i64 [[B]])
80
+ ; CHECK-NEXT: ret i64 [[SUB_SAT]]
81
+ ;
82
+ %sub.sat = call i64 @llvm.usub.sat.i64 (i64 %a , i64 %b )
83
+ ret i64 %sub.sat
84
+ }
0 commit comments