Skip to content

Commit 4ed5704

Browse files
committed
[InstCombine] Add test coverage for folding usub_sat((sub nuw C1, A), C2) to usub_sat(C1 - C2, A) or 0(NFC)
1 parent 658e476 commit 4ed5704

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

llvm/test/Transforms/InstCombine/unsigned_saturated_sub.ll

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,82 @@
77
declare void @use(i64)
88
declare void @usei32(i32)
99
declare void @usei1(i1)
10+
declare i32 @llvm.usub.sat.i32(i32, i32)
11+
declare i16 @llvm.usub.sat.i16(i16, i16)
12+
13+
; usub_sat((sub nuw C1, A), C2) to usub_sat(C1 - C2, A) or 0
14+
15+
define i32 @usub_sat_C1_C2(i32 %a){
16+
; CHECK-LABEL: @usub_sat_C1_C2(
17+
; CHECK-NEXT: [[ADD:%.*]] = sub nuw i32 64, [[A:%.*]]
18+
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ADD]], i32 14)
19+
; CHECK-NEXT: ret i32 [[COND]]
20+
;
21+
%add = sub nuw i32 64, %a
22+
%cond = call i32 @llvm.usub.sat.i32(i32 %add, i32 14)
23+
ret i32 %cond
24+
}
25+
26+
define i32 @usub_sat_C1_C2_produce_0(i32 %a){
27+
; CHECK-LABEL: @usub_sat_C1_C2_produce_0(
28+
; CHECK-NEXT: [[ADD:%.*]] = sub nuw i32 14, [[A:%.*]]
29+
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ADD]], i32 14)
30+
; CHECK-NEXT: ret i32 [[COND]]
31+
;
32+
%add = sub nuw i32 14, %a
33+
%cond = call i32 @llvm.usub.sat.i32(i32 %add, i32 14)
34+
ret i32 %cond
35+
}
36+
37+
define i32 @usub_sat_C1_C2_produce_0_too(i32 %a){
38+
; CHECK-LABEL: @usub_sat_C1_C2_produce_0_too(
39+
; CHECK-NEXT: [[ADD:%.*]] = sub nuw i32 12, [[A:%.*]]
40+
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ADD]], i32 14)
41+
; CHECK-NEXT: ret i32 [[COND]]
42+
;
43+
%add = sub nuw i32 12, %a
44+
%cond = call i32 @llvm.usub.sat.i32(i32 %add, i32 14)
45+
ret i32 %cond
46+
}
47+
48+
; negative tests this souldn't work
49+
50+
define i32 @usub_sat_C1_C2_without_nuw(i32 %a){
51+
; CHECK-LABEL: @usub_sat_C1_C2_without_nuw(
52+
; CHECK-NEXT: [[ADD:%.*]] = sub i32 12, [[A:%.*]]
53+
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ADD]], i32 14)
54+
; CHECK-NEXT: ret i32 [[COND]]
55+
;
56+
%add = sub i32 12, %a
57+
%cond = call i32 @llvm.usub.sat.i32(i32 %add, i32 14)
58+
ret i32 %cond
59+
}
60+
61+
define i32 @usub_sat_C1_C2_more_than_one_use_with_add(i32 %a){
62+
; CHECK-LABEL: @usub_sat_C1_C2_more_than_one_use_with_add(
63+
; CHECK-NEXT: [[ADD:%.*]] = sub nuw i32 12, [[A:%.*]]
64+
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ADD]], i32 14)
65+
; CHECK-NEXT: call void @usei32(i32 [[ADD]])
66+
; CHECK-NEXT: ret i32 [[COND]]
67+
;
68+
%add = sub nuw i32 12, %a
69+
%cond = call i32 @llvm.usub.sat.i32(i32 %add, i32 14)
70+
call void @usei32(i32 %add)
71+
ret i32 %cond
72+
}
73+
74+
define i32 @usub_sat_C1_C2_more_than_one_use_with_cond(i32 %a){
75+
; CHECK-LABEL: @usub_sat_C1_C2_more_than_one_use_with_cond(
76+
; CHECK-NEXT: [[ADD:%.*]] = sub nuw i32 12, [[A:%.*]]
77+
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[ADD]], i32 14)
78+
; CHECK-NEXT: call void @usei32(i32 [[COND]])
79+
; CHECK-NEXT: ret i32 [[COND]]
80+
;
81+
%add = sub nuw i32 12, %a
82+
%cond = call i32 @llvm.usub.sat.i32(i32 %add, i32 14)
83+
call void @usei32(i32 %cond)
84+
ret i32 %cond
85+
}
1086

1187
; (a > b) ? a - b : 0 -> usub.sat(a, b)
1288

0 commit comments

Comments
 (0)