Skip to content

Commit 1199bbb

Browse files
committed
[LAA] Add forked pointers tests with dep checks and runtime checks (NFC)
Add missing test coverage where generating runtime checks is tried again after dependence analysis.
1 parent 5742dc4 commit 1199bbb

File tree

1 file changed

+158
-0
lines changed

1 file changed

+158
-0
lines changed
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
3+
4+
5+
define void @dependency_check_and_runtime_checks_needed_select_of_invariant_ptrs(ptr %a, ptr %b, ptr %c, i64 %offset, i64 %n) {
6+
; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_select_of_invariant_ptrs'
7+
; CHECK-NEXT: loop:
8+
; CHECK-NEXT: Report: cannot check memory dependencies at runtime
9+
; CHECK-NEXT: Dependences:
10+
; CHECK-NEXT: Run-time memory checks:
11+
; CHECK-NEXT: Grouped accesses:
12+
; CHECK-EMPTY:
13+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
14+
; CHECK-NEXT: SCEV assumptions:
15+
; CHECK-EMPTY:
16+
; CHECK-NEXT: Expressions re-written:
17+
;
18+
entry:
19+
br label %loop
20+
21+
loop:
22+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
23+
%gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv
24+
%l1 = load float, ptr %gep.a.iv, align 4
25+
%iv.offset = add i64 %iv, %offset
26+
%gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset
27+
%l2 = load float, ptr %gep.a.iv.off, align 4
28+
%ad = fadd fast float %l1, %l2
29+
store float %ad, ptr %gep.a.iv, align 4
30+
%cmp = fcmp ult float %l1, 10.0
31+
%select = select i1 %cmp, ptr %b, ptr %c
32+
store float 0.0, ptr %select
33+
%iv.next = add nuw nsw i64 %iv, 1
34+
%exitcond = icmp eq i64 %iv.next, %n
35+
br i1 %exitcond, label %exit, label %loop
36+
37+
exit:
38+
ret void
39+
}
40+
41+
define void @dependency_check_and_runtime_checks_needed_select_of_ptr_add_recs(ptr %a, ptr %b, ptr %c, i64 %offset, i64 %n) {
42+
; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_select_of_ptr_add_recs'
43+
; CHECK-NEXT: loop:
44+
; CHECK-NEXT: Report: cannot check memory dependencies at runtime
45+
; CHECK-NEXT: Dependences:
46+
; CHECK-NEXT: Run-time memory checks:
47+
; CHECK-NEXT: Grouped accesses:
48+
; CHECK-EMPTY:
49+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
50+
; CHECK-NEXT: SCEV assumptions:
51+
; CHECK-EMPTY:
52+
; CHECK-NEXT: Expressions re-written:
53+
;
54+
entry:
55+
br label %loop
56+
57+
loop:
58+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
59+
%gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv
60+
%l1 = load float, ptr %gep.a.iv, align 4
61+
%iv.offset = add i64 %iv, %offset
62+
%gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset
63+
%l2 = load float, ptr %gep.a.iv.off, align 4
64+
%ad = fadd fast float %l1, %l2
65+
store float %ad, ptr %gep.a.iv, align 4
66+
%gep.b = getelementptr inbounds float, ptr %b, i64 %iv
67+
%gep.c = getelementptr inbounds float, ptr %c, i64 %iv
68+
%cmp = fcmp ult float %l1, 10.0
69+
%select = select i1 %cmp, ptr %gep.b, ptr %gep.c
70+
store float 0.0, ptr %select
71+
%iv.next = add nuw nsw i64 %iv, 1
72+
%exitcond = icmp eq i64 %iv.next, %n
73+
br i1 %exitcond, label %exit, label %loop
74+
75+
exit:
76+
ret void
77+
}
78+
79+
define void @dependency_check_and_runtime_checks_needed_select_of_ptr_add_recs_may_wrap_1(ptr %a, ptr %b, ptr %c, i64 %offset, i64 %n) {
80+
; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_select_of_ptr_add_recs_may_wrap_1'
81+
; CHECK-NEXT: loop:
82+
; CHECK-NEXT: Report: cannot check memory dependencies at runtime
83+
; CHECK-NEXT: Dependences:
84+
; CHECK-NEXT: Run-time memory checks:
85+
; CHECK-NEXT: Grouped accesses:
86+
; CHECK-EMPTY:
87+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
88+
; CHECK-NEXT: SCEV assumptions:
89+
; CHECK-EMPTY:
90+
; CHECK-NEXT: Expressions re-written:
91+
;
92+
entry:
93+
br label %loop
94+
95+
loop:
96+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
97+
%iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]
98+
%gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv
99+
%l1 = load float, ptr %gep.a.iv, align 4
100+
%iv.offset = add i64 %iv, %offset
101+
%gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset
102+
%l2 = load float, ptr %gep.a.iv.off, align 4
103+
%ad = fadd fast float %l1, %l2
104+
store float %ad, ptr %gep.a.iv, align 4
105+
%gep.b = getelementptr float, ptr %b, i64 %iv2
106+
%gep.c = getelementptr inbounds float, ptr %c, i64 %iv
107+
%cmp = fcmp ult float %l1, 10.0
108+
%select = select i1 %cmp, ptr %gep.b, ptr %gep.c
109+
store float 0.0, ptr %select
110+
%iv.next = add nuw nsw i64 %iv, 1
111+
%iv2.next = add i64 %iv2, 2
112+
%exitcond = icmp eq i64 %iv.next, %n
113+
br i1 %exitcond, label %exit, label %loop
114+
115+
exit:
116+
ret void
117+
}
118+
119+
120+
define void @dependency_check_and_runtime_checks_needed_select_of_ptr_add_recs_may_wrap_2(ptr %a, ptr %b, ptr %c, i64 %offset, i64 %n) {
121+
; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_select_of_ptr_add_recs_may_wrap_2'
122+
; CHECK-NEXT: loop:
123+
; CHECK-NEXT: Report: cannot check memory dependencies at runtime
124+
; CHECK-NEXT: Dependences:
125+
; CHECK-NEXT: Run-time memory checks:
126+
; CHECK-NEXT: Grouped accesses:
127+
; CHECK-EMPTY:
128+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
129+
; CHECK-NEXT: SCEV assumptions:
130+
; CHECK-EMPTY:
131+
; CHECK-NEXT: Expressions re-written:
132+
;
133+
entry:
134+
br label %loop
135+
136+
loop:
137+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
138+
%iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]
139+
%gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv
140+
%l1 = load float, ptr %gep.a.iv, align 4
141+
%iv.offset = add i64 %iv, %offset
142+
%gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset
143+
%l2 = load float, ptr %gep.a.iv.off, align 4
144+
%ad = fadd fast float %l1, %l2
145+
store float %ad, ptr %gep.a.iv, align 4
146+
%gep.b = getelementptr inbounds float, ptr %b, i64 %iv
147+
%gep.c = getelementptr inbounds float, ptr %c, i64 %iv2
148+
%cmp = fcmp ult float %l1, 10.0
149+
%select = select i1 %cmp, ptr %gep.b, ptr %gep.c
150+
store float 0.0, ptr %select
151+
%iv.next = add nuw nsw i64 %iv, 1
152+
%iv2.next = add i64 %iv2, 2
153+
%exitcond = icmp eq i64 %iv.next, %n
154+
br i1 %exitcond, label %exit, label %loop
155+
156+
exit:
157+
ret void
158+
}

0 commit comments

Comments
 (0)