Skip to content

Commit 5bc46b1

Browse files
authored
[LV] Modernize as_cast.ll test. (NFC) (#195481)
Update as_cast.ll to cover both loop-invariant and varying address space casts, as well as auto-generating the checks.
1 parent 1f34e4b commit 5bc46b1

1 file changed

Lines changed: 91 additions & 25 deletions

File tree

llvm/test/Transforms/LoopVectorize/as_cast.ll

Lines changed: 91 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,106 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6
12
; RUN: opt -passes=loop-vectorize %s -force-vector-width=1 -force-vector-interleave=2 -S -o - | FileCheck %s
23

3-
define void @foo(ptr addrspace(1) %in) {
4+
define void @loop_invariant_as_cast(ptr addrspace(1) %in) {
5+
; CHECK-LABEL: define void @loop_invariant_as_cast(
6+
; CHECK-SAME: ptr addrspace(1) [[IN:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*:]]
8+
; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
9+
; CHECK: [[VECTOR_PH]]:
10+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
11+
; CHECK: [[VECTOR_BODY]]:
12+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]
13+
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 1
14+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ule i64 [[INDEX]], 6
15+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ule i64 [[TMP0]], 6
16+
; CHECK-NEXT: br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
17+
; CHECK: [[PRED_STORE_IF]]:
18+
; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 1
19+
; CHECK-NEXT: [[TMP4:%.*]] = addrspacecast ptr addrspace(1) [[IN]] to ptr
20+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i64, ptr [[TMP4]], i64 [[TMP3]]
21+
; CHECK-NEXT: store i64 [[TMP3]], ptr [[TMP5]], align 4
22+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
23+
; CHECK: [[PRED_STORE_CONTINUE]]:
24+
; CHECK-NEXT: br i1 [[TMP2]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]
25+
; CHECK: [[PRED_STORE_IF1]]:
26+
; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[TMP0]], 1
27+
; CHECK-NEXT: [[TMP7:%.*]] = addrspacecast ptr addrspace(1) [[IN]] to ptr
28+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[TMP7]], i64 [[TMP6]]
29+
; CHECK-NEXT: store i64 [[TMP6]], ptr [[TMP8]], align 4
30+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE2]]
31+
; CHECK: [[PRED_STORE_CONTINUE2]]:
32+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
33+
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 8
34+
; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
35+
; CHECK: [[MIDDLE_BLOCK]]:
36+
; CHECK-NEXT: br label %[[EXIT:.*]]
37+
; CHECK: [[EXIT]]:
38+
; CHECK-NEXT: ret void
39+
;
440
entry:
541
br label %loop
642

743
loop:
8-
%iter = phi i64 [ %next, %loop ], [ 0, %entry ]
44+
%iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
945
%ascast = addrspacecast ptr addrspace(1) %in to ptr
10-
%next = add i64 %iter, 1
11-
%arrayidx = getelementptr inbounds i64, ptr %ascast, i64 %next
12-
store i64 %next, ptr %arrayidx, align 4
46+
%iv.next = add i64 %iv, 1
47+
%gep = getelementptr inbounds i64, ptr %ascast, i64 %iv.next
48+
store i64 %iv.next, ptr %gep, align 4
49+
%cmp = icmp eq i64 %iv.next, 7
50+
br i1 %cmp, label %exit, label %loop
1351

14-
; check that we find the two interleaved blocks with ascast, gep and store:
15-
; CHECK: pred.store.if:
16-
; CHECK: [[ID1:%.*]] = add i64 %{{.*}}, 1
17-
; CHECK: [[AS1:%.*]] = addrspacecast ptr addrspace(1) %{{.*}} to ptr
18-
; CHECK: [[GEP1:%.*]] = getelementptr inbounds i64, ptr [[AS1]], i64 [[ID1]]
19-
; CHECK: store i64 [[ID1]], ptr [[GEP1]]
52+
exit:
53+
ret void
54+
}
2055

21-
; CHECK: pred.store.if1:
22-
; CHECK: [[ID2:%.*]] = add i64 %{{.*}}, 1
23-
; CHECK: [[AS2:%.*]] = addrspacecast ptr addrspace(1) %in to ptr
24-
; CHECK: [[GEP2:%.*]] = getelementptr inbounds i64, ptr [[AS2]], i64 [[ID2]]
25-
; CHECK: store i64 [[ID2]], ptr [[GEP2]], align 4
56+
define void @loop_varying_as_cast(ptr addrspace(1) %in) {
57+
; CHECK-LABEL: define void @loop_varying_as_cast(
58+
; CHECK-SAME: ptr addrspace(1) [[IN:%.*]]) {
59+
; CHECK-NEXT: [[ENTRY:.*:]]
60+
; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
61+
; CHECK: [[VECTOR_PH]]:
62+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
63+
; CHECK: [[VECTOR_BODY]]:
64+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]
65+
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 1
66+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ule i64 [[INDEX]], 6
67+
; CHECK-NEXT: [[TMP2:%.*]] = icmp ule i64 [[TMP0]], 6
68+
; CHECK-NEXT: br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
69+
; CHECK: [[PRED_STORE_IF]]:
70+
; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 1
71+
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i64, ptr addrspace(1) [[IN]], i64 [[TMP3]]
72+
; CHECK-NEXT: [[TMP5:%.*]] = addrspacecast ptr addrspace(1) [[TMP4]] to ptr
73+
; CHECK-NEXT: store i64 [[TMP3]], ptr [[TMP5]], align 4
74+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
75+
; CHECK: [[PRED_STORE_CONTINUE]]:
76+
; CHECK-NEXT: br i1 [[TMP2]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]
77+
; CHECK: [[PRED_STORE_IF1]]:
78+
; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[TMP0]], 1
79+
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i64, ptr addrspace(1) [[IN]], i64 [[TMP6]]
80+
; CHECK-NEXT: [[TMP8:%.*]] = addrspacecast ptr addrspace(1) [[TMP7]] to ptr
81+
; CHECK-NEXT: store i64 [[TMP6]], ptr [[TMP8]], align 4
82+
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE2]]
83+
; CHECK: [[PRED_STORE_CONTINUE2]]:
84+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
85+
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 8
86+
; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
87+
; CHECK: [[MIDDLE_BLOCK]]:
88+
; CHECK-NEXT: br label %[[EXIT:.*]]
89+
; CHECK: [[EXIT]]:
90+
; CHECK-NEXT: ret void
91+
;
92+
entry:
93+
br label %loop
2694

27-
%cmp = icmp eq i64 %next, 7
95+
loop:
96+
%iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
97+
%iv.next = add i64 %iv, 1
98+
%gep = getelementptr inbounds i64, ptr addrspace(1) %in, i64 %iv.next
99+
%ascast = addrspacecast ptr addrspace(1) %gep to ptr
100+
store i64 %iv.next, ptr %ascast, align 4
101+
%cmp = icmp eq i64 %iv.next, 7
28102
br i1 %cmp, label %exit, label %loop
29103

30-
; check that we branch to the exit block
31-
; CHECK: middle.block:
32-
; CHECK: br label %exit
33-
34104
exit:
35105
ret void
36-
; CHECK: exit:
37-
; CHECK: ret void
38106
}
39-
40-
; CHECK: !{{[0-9]*}} = !{!"llvm.loop.isvectorized", i32 1}

0 commit comments

Comments
 (0)