Skip to content

Commit c1f8dbb

Browse files
artagnonfhahn
andauthored
[LV] Add coverage for fixing-up scalar resume values (#160492)
Increase coverage of the routine fixScalarResumeValuesFromBypass in the case where the original scalar resume value is zero. Co-authored-by: Florian Hahn <[email protected]>
1 parent 2d6d56b commit c1f8dbb

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6
2+
; RUN: opt -passes=loop-vectorize -S %s | FileCheck %s
3+
4+
; This tests exercises the out-of-band fixing-up of scalar resume values.
5+
6+
target triple = "aarch64"
7+
8+
define void @epilogue_vectorization_fix_scalar_resume_values(ptr %dst, i64 %n) {
9+
; CHECK-LABEL: define void @epilogue_vectorization_fix_scalar_resume_values(
10+
; CHECK-SAME: ptr [[DST:%.*]], i64 [[N:%.*]]) {
11+
; CHECK-NEXT: [[ITER_CHECK:.*]]:
12+
; CHECK-NEXT: [[REM:%.*]] = urem i64 [[N]], 3
13+
; CHECK-NEXT: br i1 true, label %[[VEC_EPILOG_SCALAR_PH:.*]], label %[[VECTOR_MAIN_LOOP_ITER_CHECK:.*]]
14+
; CHECK: [[VECTOR_MAIN_LOOP_ITER_CHECK]]:
15+
; CHECK-NEXT: br i1 true, label %[[VEC_EPILOG_PH:.*]], label %[[VECTOR_PH:.*]]
16+
; CHECK: [[VECTOR_PH]]:
17+
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[REM]], 32
18+
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[REM]], [[N_MOD_VF]]
19+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
20+
; CHECK: [[VECTOR_BODY]]:
21+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
22+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[DST]], i64 [[INDEX]]
23+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 16
24+
; CHECK-NEXT: store <16 x i8> zeroinitializer, ptr [[TMP0]], align 1
25+
; CHECK-NEXT: store <16 x i8> zeroinitializer, ptr [[TMP1]], align 1
26+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 32
27+
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
28+
; CHECK-NEXT: br i1 [[TMP2]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
29+
; CHECK: [[MIDDLE_BLOCK]]:
30+
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[REM]], [[N_VEC]]
31+
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[VEC_EPILOG_ITER_CHECK:.*]]
32+
; CHECK: [[VEC_EPILOG_ITER_CHECK]]:
33+
; CHECK-NEXT: [[N_VEC_REMAINING:%.*]] = sub i64 [[REM]], [[N_VEC]]
34+
; CHECK-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_VEC_REMAINING]], 8
35+
; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label %[[VEC_EPILOG_SCALAR_PH]], label %[[VEC_EPILOG_PH]], !prof [[PROF3:![0-9]+]]
36+
; CHECK: [[VEC_EPILOG_PH]]:
37+
; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
38+
; CHECK-NEXT: br label %[[VEC_EPILOG_VECTOR_BODY:.*]]
39+
; CHECK: [[VEC_EPILOG_VECTOR_BODY]]:
40+
; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ [[VEC_EPILOG_RESUME_VAL]], %[[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT2:%.*]], %[[VEC_EPILOG_VECTOR_BODY]] ]
41+
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[DST]], i64 [[INDEX1]]
42+
; CHECK-NEXT: store <8 x i8> zeroinitializer, ptr [[TMP3]], align 1
43+
; CHECK-NEXT: [[INDEX_NEXT2]] = add nuw i64 [[INDEX1]], 8
44+
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 0
45+
; CHECK-NEXT: br i1 [[TMP4]], label %[[VEC_EPILOG_MIDDLE_BLOCK:.*]], label %[[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
46+
; CHECK: [[VEC_EPILOG_MIDDLE_BLOCK]]:
47+
; CHECK-NEXT: [[CMP_N3:%.*]] = icmp eq i64 [[REM]], 0
48+
; CHECK-NEXT: br i1 [[CMP_N3]], label %[[EXIT]], label %[[VEC_EPILOG_SCALAR_PH]]
49+
; CHECK: [[VEC_EPILOG_SCALAR_PH]]:
50+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0, %[[ITER_CHECK]] ]
51+
; CHECK-NEXT: br label %[[LOOP:.*]]
52+
; CHECK: [[LOOP]]:
53+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
54+
; CHECK-NEXT: [[GEP_DST_IV:%.*]] = getelementptr i8, ptr [[DST]], i64 [[IV]]
55+
; CHECK-NEXT: store i8 0, ptr [[GEP_DST_IV]], align 1
56+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
57+
; CHECK-NEXT: [[EXIT_COND:%.*]] = icmp eq i64 [[IV_NEXT]], [[REM]]
58+
; CHECK-NEXT: br i1 [[EXIT_COND]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP5:![0-9]+]]
59+
; CHECK: [[EXIT]]:
60+
; CHECK-NEXT: ret void
61+
;
62+
entry:
63+
%rem = urem i64 %n, 3
64+
br label %loop
65+
66+
loop:
67+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
68+
%gep.dst.iv = getelementptr i8, ptr %dst, i64 %iv
69+
store i8 0, ptr %gep.dst.iv, align 1
70+
%iv.next = add i64 %iv, 1
71+
%exit.cond = icmp eq i64 %iv.next, %rem
72+
br i1 %exit.cond, label %exit, label %loop
73+
74+
exit:
75+
ret void
76+
}

0 commit comments

Comments
 (0)