Skip to content

Commit 50b45b2

Browse files
committed
[LAA] Add tests with forward dependences known via assumes.
1 parent 3a83162 commit 50b45b2

File tree

1 file changed

+244
-0
lines changed

1 file changed

+244
-0
lines changed
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
3+
4+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
5+
6+
declare void @llvm.assume(i1)
7+
8+
declare void @use(ptr noundef)
9+
10+
; TODO: %offset is known positive via assume, so we should be able to detect the
11+
; forward dependence.
12+
define void @offset_i8_known_positive_via_assume_forward_dep_1(ptr %A, i64 %offset, i64 %N) {
13+
; CHECK-LABEL: 'offset_i8_known_positive_via_assume_forward_dep_1'
14+
; CHECK-NEXT: loop:
15+
; CHECK-NEXT: Memory dependences are safe with run-time checks
16+
; CHECK-NEXT: Dependences:
17+
; CHECK-NEXT: Run-time memory checks:
18+
; CHECK-NEXT: Check 0:
19+
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
20+
; CHECK-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
21+
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
22+
; CHECK-NEXT: %gep.off = getelementptr inbounds i8, ptr %off, i64 %iv
23+
; CHECK-NEXT: Grouped accesses:
24+
; CHECK-NEXT: Group [[GRP1]]:
25+
; CHECK-NEXT: (Low: %A High: (%N + %A))
26+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
27+
; CHECK-NEXT: Group [[GRP2]]:
28+
; CHECK-NEXT: (Low: (%offset + %A) High: (%offset + %N + %A))
29+
; CHECK-NEXT: Member: {(%offset + %A),+,1}<nw><%loop>
30+
; CHECK-EMPTY:
31+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
32+
; CHECK-NEXT: SCEV assumptions:
33+
; CHECK-EMPTY:
34+
; CHECK-NEXT: Expressions re-written:
35+
;
36+
entry:
37+
%c = icmp sgt i64 %offset, 0
38+
call void @llvm.assume(i1 %c)
39+
%off = getelementptr inbounds i8, ptr %A, i64 %offset
40+
call void @use(ptr noundef %off)
41+
br label %loop
42+
43+
loop:
44+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
45+
%gep.off = getelementptr inbounds i8, ptr %off, i64 %iv
46+
%l = load i8 , ptr %gep.off, align 4
47+
%add = add nsw i8 %l, 5
48+
%gep = getelementptr inbounds i8, ptr %A, i64 %iv
49+
store i8 %add, ptr %gep, align 4
50+
%iv.next = add nuw nsw i64 %iv, 1
51+
%exitcond.not = icmp eq i64 %iv.next, %N
52+
br i1 %exitcond.not, label %exit, label %loop
53+
54+
exit:
55+
ret void
56+
}
57+
58+
define void @offset_i32_known_positive_via_assume_forward_dep_1(ptr %A, i64 %offset, i64 %N) {
59+
; CHECK-LABEL: 'offset_i32_known_positive_via_assume_forward_dep_1'
60+
; CHECK-NEXT: loop:
61+
; CHECK-NEXT: Memory dependences are safe with run-time checks
62+
; CHECK-NEXT: Dependences:
63+
; CHECK-NEXT: Run-time memory checks:
64+
; CHECK-NEXT: Check 0:
65+
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
66+
; CHECK-NEXT: %gep = getelementptr inbounds i32, ptr %A, i64 %iv
67+
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
68+
; CHECK-NEXT: %gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
69+
; CHECK-NEXT: Grouped accesses:
70+
; CHECK-NEXT: Group [[GRP3]]:
71+
; CHECK-NEXT: (Low: %A High: (-3 + (4 * %N) + %A))
72+
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop>
73+
; CHECK-NEXT: Group [[GRP4]]:
74+
; CHECK-NEXT: (Low: ((4 * %offset)<nsw> + %A) High: (-3 + (4 * %offset)<nsw> + (4 * %N) + %A))
75+
; CHECK-NEXT: Member: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop>
76+
; CHECK-EMPTY:
77+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
78+
; CHECK-NEXT: SCEV assumptions:
79+
; CHECK-NEXT: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop> Added Flags: <nusw>
80+
; CHECK-EMPTY:
81+
; CHECK-NEXT: Expressions re-written:
82+
;
83+
entry:
84+
%c = icmp sgt i64 %offset, 0
85+
call void @llvm.assume(i1 %c)
86+
%off = getelementptr inbounds i32, ptr %A, i64 %offset
87+
call void @use(ptr noundef %off)
88+
89+
br label %loop
90+
91+
loop:
92+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
93+
%gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
94+
%l = load i8 , ptr %gep.off, align 4
95+
%add = add nsw i8 %l, 5
96+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv
97+
store i8 %add, ptr %gep, align 4
98+
%iv.next = add nuw nsw i64 %iv, 1
99+
%exitcond.not = icmp eq i64 %iv.next, %N
100+
br i1 %exitcond.not, label %exit, label %loop
101+
102+
exit:
103+
ret void
104+
}
105+
106+
; TODO: %offset is known positive via assume, so we should be able to detect the
107+
; forward dependence.
108+
define void @offset_known_positive_via_assume_forward_dep_2(ptr %A, i64 %offset, i64 %N) {
109+
; CHECK-LABEL: 'offset_known_positive_via_assume_forward_dep_2'
110+
; CHECK-NEXT: loop:
111+
; CHECK-NEXT: Memory dependences are safe with run-time checks
112+
; CHECK-NEXT: Dependences:
113+
; CHECK-NEXT: Run-time memory checks:
114+
; CHECK-NEXT: Check 0:
115+
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
116+
; CHECK-NEXT: %gep = getelementptr inbounds i32, ptr %A, i64 %iv
117+
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
118+
; CHECK-NEXT: %gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
119+
; CHECK-NEXT: Grouped accesses:
120+
; CHECK-NEXT: Group [[GRP5]]:
121+
; CHECK-NEXT: (Low: %A High: ((4 * %N) + %A))
122+
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop>
123+
; CHECK-NEXT: Group [[GRP6]]:
124+
; CHECK-NEXT: (Low: ((4 * %offset)<nsw> + %A) High: ((4 * %offset)<nsw> + (4 * %N) + %A))
125+
; CHECK-NEXT: Member: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop>
126+
; CHECK-EMPTY:
127+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
128+
; CHECK-NEXT: SCEV assumptions:
129+
; CHECK-EMPTY:
130+
; CHECK-NEXT: Expressions re-written:
131+
;
132+
entry:
133+
%c = icmp sgt i64 %offset, 0
134+
call void @llvm.assume(i1 %c)
135+
%c.2 = icmp slt i64 %offset, 20
136+
call void @llvm.assume(i1 %c.2)
137+
%off = getelementptr inbounds i32, ptr %A, i64 %offset
138+
br label %loop
139+
140+
loop:
141+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
142+
%gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
143+
%l = load i32, ptr %gep.off, align 4
144+
%add = add nsw i32 %l, 5
145+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv
146+
store i32 %add, ptr %gep, align 4
147+
%iv.next = add nuw nsw i64 %iv, 1
148+
%exitcond.not = icmp eq i64 %iv.next, %N
149+
br i1 %exitcond.not, label %exit, label %loop
150+
151+
exit:
152+
ret void
153+
}
154+
155+
; The range of %offset is known via assumes, but it may be positive or negative.
156+
define void @offset_may_be_negative_via_assume_unknown_dep(ptr %A, i64 %offset, i64 %N) {
157+
; CHECK-LABEL: 'offset_may_be_negative_via_assume_unknown_dep'
158+
; CHECK-NEXT: loop:
159+
; CHECK-NEXT: Memory dependences are safe with run-time checks
160+
; CHECK-NEXT: Dependences:
161+
; CHECK-NEXT: Run-time memory checks:
162+
; CHECK-NEXT: Check 0:
163+
; CHECK-NEXT: Comparing group ([[GRP7:0x[0-9a-f]+]]):
164+
; CHECK-NEXT: %gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv
165+
; CHECK-NEXT: Against group ([[GRP8:0x[0-9a-f]+]]):
166+
; CHECK-NEXT: %gep = getelementptr inbounds i32, ptr %off, i64 %iv
167+
; CHECK-NEXT: Grouped accesses:
168+
; CHECK-NEXT: Group [[GRP7]]:
169+
; CHECK-NEXT: (Low: %A High: ((4 * %N) + %A))
170+
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop>
171+
; CHECK-NEXT: Group [[GRP8]]:
172+
; CHECK-NEXT: (Low: ((4 * %offset)<nsw> + %A) High: ((4 * %offset)<nsw> + (4 * %N) + %A))
173+
; CHECK-NEXT: Member: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop>
174+
; CHECK-EMPTY:
175+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
176+
; CHECK-NEXT: SCEV assumptions:
177+
; CHECK-EMPTY:
178+
; CHECK-NEXT: Expressions re-written:
179+
;
180+
entry:
181+
%c = icmp sgt i64 %offset, -4
182+
call void @llvm.assume(i1 %c)
183+
%c.2 = icmp slt i64 %offset, 20
184+
call void @llvm.assume(i1 %c.2)
185+
%off = getelementptr inbounds i32, ptr %A, i64 %offset
186+
br label %loop
187+
188+
loop:
189+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
190+
%gep = getelementptr inbounds i32, ptr %off, i64 %iv
191+
%l = load i32, ptr %gep, align 4
192+
%add = add nsw i32 %l, 5
193+
%gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv
194+
store i32 %add, ptr %gep.mul.2, align 4
195+
%iv.next = add nuw nsw i64 %iv, 1
196+
%exitcond.not = icmp eq i64 %iv.next, %N
197+
br i1 %exitcond.not, label %exit, label %loop
198+
199+
exit:
200+
ret void
201+
}
202+
203+
define void @offset_no_assumes(ptr %A, i64 %offset, i64 %N) {
204+
; CHECK-LABEL: 'offset_no_assumes'
205+
; CHECK-NEXT: loop:
206+
; CHECK-NEXT: Memory dependences are safe with run-time checks
207+
; CHECK-NEXT: Dependences:
208+
; CHECK-NEXT: Run-time memory checks:
209+
; CHECK-NEXT: Check 0:
210+
; CHECK-NEXT: Comparing group ([[GRP9:0x[0-9a-f]+]]):
211+
; CHECK-NEXT: %gep = getelementptr inbounds i32, ptr %A, i64 %iv
212+
; CHECK-NEXT: Against group ([[GRP10:0x[0-9a-f]+]]):
213+
; CHECK-NEXT: %gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
214+
; CHECK-NEXT: Grouped accesses:
215+
; CHECK-NEXT: Group [[GRP9]]:
216+
; CHECK-NEXT: (Low: %A High: ((4 * %N) + %A))
217+
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop>
218+
; CHECK-NEXT: Group [[GRP10]]:
219+
; CHECK-NEXT: (Low: ((4 * %offset)<nsw> + %A) High: ((4 * %offset)<nsw> + (4 * %N) + %A))
220+
; CHECK-NEXT: Member: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop>
221+
; CHECK-EMPTY:
222+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
223+
; CHECK-NEXT: SCEV assumptions:
224+
; CHECK-EMPTY:
225+
; CHECK-NEXT: Expressions re-written:
226+
;
227+
entry:
228+
%off = getelementptr inbounds i32, ptr %A, i64 %offset
229+
br label %loop
230+
231+
loop:
232+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
233+
%gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
234+
%l = load i32, ptr %gep.off, align 4
235+
%add = add nsw i32 %l, 5
236+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv
237+
store i32 %add, ptr %gep, align 4
238+
%iv.next = add nuw nsw i64 %iv, 1
239+
%exitcond.not = icmp eq i64 %iv.next, %N
240+
br i1 %exitcond.not, label %exit, label %loop
241+
242+
exit:
243+
ret void
244+
}

0 commit comments

Comments
 (0)