Skip to content

Commit 4120907

Browse files
committed
[LAA] Add tests accesses to same pointer with different types.
Add tests with accesses to the same pointer with different types. At the moment, runtime checks for those accesses are incorrectly based on the smaller type.
1 parent fe7fc54 commit 4120907

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
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+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
5+
6+
; FIXME: The runtime checks for A are based on i8 accesses, but should be based
7+
; on i32.
8+
define void @loads_of_same_pointer_with_different_sizes1(ptr %A, ptr %B, i64 %N) {
9+
; CHECK-LABEL: 'loads_of_same_pointer_with_different_sizes1'
10+
; CHECK-NEXT: loop:
11+
; CHECK-NEXT: Memory dependences are safe with run-time checks
12+
; CHECK-NEXT: Dependences:
13+
; CHECK-NEXT: Run-time memory checks:
14+
; CHECK-NEXT: Check 0:
15+
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
16+
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
17+
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
18+
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
19+
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
20+
; CHECK-NEXT: Grouped accesses:
21+
; CHECK-NEXT: Group [[GRP1]]:
22+
; CHECK-NEXT: (Low: %B High: ((4 * %N) + %B))
23+
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop>
24+
; CHECK-NEXT: Group [[GRP2]]:
25+
; CHECK-NEXT: (Low: %A High: (%N + %A))
26+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
27+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
28+
; CHECK-EMPTY:
29+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
30+
; CHECK-NEXT: SCEV assumptions:
31+
; CHECK-EMPTY:
32+
; CHECK-NEXT: Expressions re-written:
33+
;
34+
entry:
35+
br label %loop
36+
37+
loop:
38+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
39+
%gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
40+
%l0 = load i8, ptr %gep.A, align 1
41+
%l1 = load i32, ptr %gep.A, align 1
42+
%l0.ext = sext i8 %l0 to i32
43+
%iv.trunc = trunc nuw i64 %iv to i32
44+
%sub.0 = sub i32 %l0.ext, %iv.trunc
45+
%sub.1 = sub i32 %l1, %sub.0
46+
%gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
47+
store i32 %sub.1, ptr %gep.B, align 4
48+
%iv.next = add nuw nsw i64 %iv, 1
49+
%exitcond.not = icmp eq i64 %iv.next, %N
50+
br i1 %exitcond.not, label %exit, label %loop
51+
52+
exit:
53+
ret void
54+
}
55+
56+
define void @loads_of_same_pointer_with_different_sizes2(ptr %A, ptr %B, i64 %N) {
57+
; CHECK-LABEL: 'loads_of_same_pointer_with_different_sizes2'
58+
; CHECK-NEXT: loop:
59+
; CHECK-NEXT: Memory dependences are safe with run-time checks
60+
; CHECK-NEXT: Dependences:
61+
; CHECK-NEXT: Run-time memory checks:
62+
; CHECK-NEXT: Check 0:
63+
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
64+
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
65+
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
66+
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
67+
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
68+
; CHECK-NEXT: Grouped accesses:
69+
; CHECK-NEXT: Group [[GRP3]]:
70+
; CHECK-NEXT: (Low: %B High: ((4 * %N) + %B))
71+
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop>
72+
; CHECK-NEXT: Group [[GRP4]]:
73+
; CHECK-NEXT: (Low: %A High: (3 + %N + %A))
74+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
75+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%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-EMPTY:
80+
; CHECK-NEXT: Expressions re-written:
81+
;
82+
entry:
83+
br label %loop
84+
85+
loop:
86+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
87+
%gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
88+
%l1 = load i32, ptr %gep.A, align 1
89+
%l0 = load i8, ptr %gep.A, align 1
90+
%l0.ext = sext i8 %l0 to i32
91+
%iv.trunc = trunc nuw i64 %iv to i32
92+
%sub.0 = sub i32 %l0.ext, %iv.trunc
93+
%sub.1 = sub i32 %l1, %sub.0
94+
%gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
95+
store i32 %sub.1, ptr %gep.B, align 4
96+
%iv.next = add nuw nsw i64 %iv, 1
97+
%exitcond.not = icmp eq i64 %iv.next, %N
98+
br i1 %exitcond.not, label %exit, label %loop
99+
100+
exit:
101+
ret void
102+
}
103+
104+
; FIXME: The both runtime checks for A are based on i8 accesses, but one should
105+
; be based on i32.
106+
define void @loads_of_same_pointer_with_different_sizes_retry_with_runtime_checks(ptr %A, ptr %B, i64 %N, i64 %off) {
107+
; CHECK-LABEL: 'loads_of_same_pointer_with_different_sizes_retry_with_runtime_checks'
108+
; CHECK-NEXT: loop:
109+
; CHECK-NEXT: Memory dependences are safe with run-time checks
110+
; CHECK-NEXT: Dependences:
111+
; CHECK-NEXT: Run-time memory checks:
112+
; CHECK-NEXT: Check 0:
113+
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
114+
; CHECK-NEXT: %gep.B.iv = getelementptr inbounds i32, ptr %B, i64 %iv
115+
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
116+
; CHECK-NEXT: %gep.B.inc = getelementptr inbounds i32, ptr %B, i64 %inc
117+
; CHECK-NEXT: Check 1:
118+
; CHECK-NEXT: Comparing group ([[GRP5]]):
119+
; CHECK-NEXT: %gep.B.iv = getelementptr inbounds i32, ptr %B, i64 %iv
120+
; CHECK-NEXT: Against group ([[GRP7:0x[0-9a-f]+]]):
121+
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
122+
; CHECK-NEXT: Check 2:
123+
; CHECK-NEXT: Comparing group ([[GRP5]]):
124+
; CHECK-NEXT: %gep.B.iv = getelementptr inbounds i32, ptr %B, i64 %iv
125+
; CHECK-NEXT: Against group ([[GRP8:0x[0-9a-f]+]]):
126+
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
127+
; CHECK-NEXT: Check 3:
128+
; CHECK-NEXT: Comparing group ([[GRP6]]):
129+
; CHECK-NEXT: %gep.B.inc = getelementptr inbounds i32, ptr %B, i64 %inc
130+
; CHECK-NEXT: Against group ([[GRP7]]):
131+
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
132+
; CHECK-NEXT: Check 4:
133+
; CHECK-NEXT: Comparing group ([[GRP6]]):
134+
; CHECK-NEXT: %gep.B.inc = getelementptr inbounds i32, ptr %B, i64 %inc
135+
; CHECK-NEXT: Against group ([[GRP8]]):
136+
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
137+
; CHECK-NEXT: Grouped accesses:
138+
; CHECK-NEXT: Group [[GRP5]]:
139+
; CHECK-NEXT: (Low: %B High: ((4 * %N) + %B))
140+
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop>
141+
; CHECK-NEXT: Group [[GRP6]]:
142+
; CHECK-NEXT: (Low: ((4 * %off) + %B) High: ((4 * %N) + (4 * %off) + %B))
143+
; CHECK-NEXT: Member: {((4 * %off) + %B),+,4}<%loop>
144+
; CHECK-NEXT: Group [[GRP7]]:
145+
; CHECK-NEXT: (Low: %A High: (%N + %A))
146+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
147+
; CHECK-NEXT: Group [[GRP8]]:
148+
; CHECK-NEXT: (Low: %A High: (%N + %A))
149+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
150+
; CHECK-EMPTY:
151+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
152+
; CHECK-NEXT: SCEV assumptions:
153+
; CHECK-EMPTY:
154+
; CHECK-NEXT: Expressions re-written:
155+
;
156+
entry:
157+
br label %loop
158+
159+
loop:
160+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
161+
%gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
162+
%l0 = load i8, ptr %gep.A, align 1
163+
%l1 = load i32, ptr %gep.A, align 1
164+
%l0.ext = sext i8 %l0 to i32
165+
%iv.trunc = trunc nuw i64 %iv to i32
166+
%sub.0 = sub i32 %l0.ext, %iv.trunc
167+
%sub.1 = sub i32 %l1, %iv.trunc
168+
%gep.B.iv = getelementptr inbounds i32, ptr %B, i64 %iv
169+
store i32 %sub.0, ptr %gep.B.iv, align 4
170+
%inc = add nuw nsw i64 %iv, %off
171+
%gep.B.inc = getelementptr inbounds i32, ptr %B, i64 %inc
172+
store i32 %sub.1, ptr %gep.B.inc , align 4
173+
%iv.next = add nuw nsw i64 %iv, 1
174+
%exitcond.not = icmp eq i64 %iv.next, %N
175+
br i1 %exitcond.not, label %exit, label %loop
176+
177+
exit:
178+
ret void
179+
}

0 commit comments

Comments
 (0)