22
33; GitHub issue #161036
44
5+ ; Positive test : umin(sub(a,b),a) with scalar types should be folded
56define i64 @underflow_compare_fold (i64 %a , i64 %b ) {
67; CHECK-LABEL: underflow_compare_fold
78; CHECK: // %bb.0:
@@ -12,3 +13,41 @@ define i64 @underflow_compare_fold(i64 %a, i64 %b) {
1213 %cond = tail call i64 @llvm.umin.i64 (i64 %sub , i64 %a )
1314 ret i64 %cond
1415}
16+
17+ ; Negative test, vector types : umin(sub(a,b),a) but with vectors
18+ define <16 x i8 > @underflow_compare_dontfold_vectors (<16 x i8 > %a , <16 x i8 > %b ) {
19+ ; CHECK-LABEL: underflow_compare_dontfold_vectors
20+ ; CHECK-LABEL: %bb.0
21+ ; CHECK-NEXT: sub v1.16b, v0.16b, v1.16b
22+ ; CHECK-NEXT: umin v0.16b, v1.16b, v0.16b
23+ ; CHECK-NEXT: ret
24+ %sub = sub <16 x i8 > %a , %b
25+ %cond = tail call <16 x i8 > @llvm.umin.v16i8 (<16 x i8 > %sub , <16 x i8 > %a )
26+ ret <16 x i8 > %cond
27+ }
28+
29+ ; Negative test, pattern mismatch : umin(a,sub(a,b))
30+ define i64 @umin_sub_inverse_args (i64 %a , i64 %b ) {
31+ ; CHECK-LABEL: umin_sub_inverse_args
32+ ; CHECK-LABEL: %bb.0
33+ ; CHECK-NEXT: sub x8, x0, x1
34+ ; CHECK-NEXT: cmp x0, x8
35+ ; CHECK-NEXT: csel x0, x0, x8, lo
36+ ; CHECK-NEXT: ret
37+ %sub = sub i64 %a , %b
38+ %cond = tail call i64 @llvm.umin.i64 (i64 %a , i64 %sub )
39+ ret i64 %cond
40+ }
41+
42+ ; Negative test, pattern mismatch : umin(add(a,b),a)
43+ define i64 @umin_add (i64 %a , i64 %b ) {
44+ ; CHECK-LABEL: umin_add
45+ ; CHECK-LABEL: %bb.0
46+ ; CHECK-NEXT: add x8, x0, x1
47+ ; CHECK-NEXT: cmp x8, x0
48+ ; CHECK-NEXT: csel x0, x8, x0, lo
49+ ; CHECK-NEXT: ret
50+ %add = add i64 %a , %b
51+ %cond = tail call i64 @llvm.umin.i64 (i64 %add , i64 %a )
52+ ret i64 %cond
53+ }
0 commit comments