Skip to content

Commit ab03116

Browse files
committed
[SCEV,LAA] Add tests to make sure scoped SCEVs don't impact other SCEVs.
1 parent 7b4f33b commit ab03116

File tree

1 file changed

+182
-0
lines changed

1 file changed

+182
-0
lines changed
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes='print<access-info>,print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck --check-prefixes=LAA,AFTER %s
3+
; RUN: opt -passes='print<scalar-evolution>,print<access-info>,print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck --check-prefixes=BEFORE,LAA,AFTER %s
4+
5+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6+
7+
declare void @use(ptr)
8+
9+
; Check that scoped expressions created by LAA do not interfere with non-scoped
10+
; SCEVs with the same operands. The tests first run print<scalar-evolution> to
11+
; populate the SCEV cache. They contain a GEP computing A+405, which is the end
12+
; of the accessed range, before and/or after the loop. No nuw flags should be
13+
; added to them in the second print<scalar-evolution> output.
14+
15+
define ptr @test_ptr_range_end_computed_before_and_after_loop(ptr %A) {
16+
; BEFORE-LABEL: 'test_ptr_range_end_computed_before_and_after_loop'
17+
; BEFORE-NEXT: Classifying expressions for: @test_ptr_range_end_computed_before_and_after_loop
18+
; BEFORE: %x = getelementptr inbounds i8, ptr %A, i64 405
19+
; BEFORE-NEXT: --> (405 + %A) U: full-set S: full-set
20+
; BEFORE: %y = getelementptr inbounds i8, ptr %A, i64 405
21+
; BEFORE-NEXT: --> (405 + %A) U: full-set S: full-set
22+
;
23+
; LAA-LABEL: 'test_ptr_range_end_computed_before_and_after_loop'
24+
; LAA-NEXT: loop:
25+
; LAA-NEXT: Memory dependences are safe with run-time checks
26+
; LAA-NEXT: Dependences:
27+
; LAA-NEXT: Run-time memory checks:
28+
; LAA-NEXT: Check 0:
29+
; LAA-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
30+
; LAA-NEXT: %gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv
31+
; LAA-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
32+
; LAA-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
33+
; LAA-NEXT: Grouped accesses:
34+
; LAA-NEXT: Group [[GRP1]]:
35+
; LAA-NEXT: (Low: (1 + %A) High: (405 + %A))
36+
; LAA-NEXT: Member: {(1 + %A),+,4}<nw><%loop>
37+
; LAA-NEXT: Group [[GRP2]]:
38+
; LAA-NEXT: (Low: %A High: (101 + %A))
39+
; LAA-NEXT: Member: {%A,+,1}<nuw><%loop>
40+
; LAA-EMPTY:
41+
; LAA-NEXT: Non vectorizable stores to invariant address were not found in loop.
42+
; LAA-NEXT: SCEV assumptions:
43+
; LAA-EMPTY:
44+
; LAA-NEXT: Expressions re-written:
45+
;
46+
; AFTER-LABEL: 'test_ptr_range_end_computed_before_and_after_loop'
47+
; AFTER-NEXT: Classifying expressions for: @test_ptr_range_end_computed_before_and_after_loop
48+
; AFTER: %x = getelementptr inbounds i8, ptr %A, i64 405
49+
; AFTER-NEXT: --> (405 + %A) U: full-set S: full-set
50+
; AFTER: %y = getelementptr inbounds i8, ptr %A, i64 405
51+
; AFTER-NEXT: --> (405 + %A) U: full-set S: full-set
52+
entry:
53+
%A.1 = getelementptr inbounds i8, ptr %A, i64 1
54+
%x = getelementptr inbounds i8, ptr %A, i64 405
55+
call void @use(ptr %x)
56+
br label %loop
57+
58+
loop:
59+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
60+
%gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv
61+
%gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
62+
%l = load i8, ptr %gep.A, align 1
63+
%ext = zext i8 %l to i32
64+
store i32 %ext, ptr %gep.A.400, align 4
65+
%iv.next = add nuw nsw i64 %iv, 1
66+
%ec = icmp eq i64 %iv, 100
67+
br i1 %ec, label %exit, label %loop
68+
69+
exit:
70+
%y = getelementptr inbounds i8, ptr %A, i64 405
71+
ret ptr %y
72+
}
73+
74+
define void @test_ptr_range_end_computed_before_loop(ptr %A) {
75+
; BEFORE-LABEL: 'test_ptr_range_end_computed_before_loop'
76+
; BEFORE-NEXT: Classifying expressions for: @test_ptr_range_end_computed_before_loop
77+
; BEFORE-NEXT: %A.1 = getelementptr inbounds i8, ptr %A, i64 1
78+
; BEFORE-NEXT: --> (1 + %A) U: full-set S: full-set
79+
; BEFORE-NEXT: %x = getelementptr inbounds i8, ptr %A, i64 405
80+
;
81+
; LAA-LABEL: 'test_ptr_range_end_computed_before_loop'
82+
; LAA-NEXT: loop:
83+
; LAA-NEXT: Memory dependences are safe with run-time checks
84+
; LAA-NEXT: Dependences:
85+
; LAA-NEXT: Run-time memory checks:
86+
; LAA-NEXT: Check 0:
87+
; LAA-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
88+
; LAA-NEXT: %gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv
89+
; LAA-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
90+
; LAA-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
91+
; LAA-NEXT: Grouped accesses:
92+
; LAA-NEXT: Group [[GRP3]]:
93+
; LAA-NEXT: (Low: (1 + %A) High: (405 + %A))
94+
; LAA-NEXT: Member: {(1 + %A),+,4}<nw><%loop>
95+
; LAA-NEXT: Group [[GRP4]]:
96+
; LAA-NEXT: (Low: %A High: (101 + %A))
97+
; LAA-NEXT: Member: {%A,+,1}<nuw><%loop>
98+
; LAA-EMPTY:
99+
; LAA-NEXT: Non vectorizable stores to invariant address were not found in loop.
100+
; LAA-NEXT: SCEV assumptions:
101+
; LAA-EMPTY:
102+
; LAA-NEXT: Expressions re-written:
103+
;
104+
; AFTER-LABEL: Classifying expressions for: @test_ptr_range_end_computed_before_loop
105+
; AFTER-NEXT: %A.1 = getelementptr inbounds i8, ptr %A, i64 1
106+
; AFTER-NEXT: --> (1 + %A) U: full-set S: full-set
107+
; AFTER-NEXT: %x = getelementptr inbounds i8, ptr %A, i64 405
108+
;
109+
entry:
110+
%A.1 = getelementptr inbounds i8, ptr %A, i64 1
111+
%x = getelementptr inbounds i8, ptr %A, i64 405
112+
call void @use(ptr %x)
113+
br label %loop
114+
115+
loop:
116+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
117+
%gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv
118+
%gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
119+
%l = load i8, ptr %gep.A, align 1
120+
%ext = zext i8 %l to i32
121+
store i32 %ext, ptr %gep.A.400, align 4
122+
%iv.next = add nuw nsw i64 %iv, 1
123+
%ec = icmp eq i64 %iv, 100
124+
br i1 %ec, label %exit, label %loop
125+
126+
exit:
127+
ret void
128+
}
129+
130+
define ptr @test_ptr_range_end_computed_after_loop(ptr %A) {
131+
; BEFORE-LABEL: 'test_ptr_range_end_computed_after_loop'
132+
; BEFORE-NEXT: Classifying expressions for: @test_ptr_range_end_computed_after_loop
133+
; BEFORE: %y = getelementptr inbounds i8, ptr %A, i64 405
134+
; BEFORE-NEXT: --> (405 + %A) U: full-set S: full-set
135+
;
136+
; LAA-LABEL: 'test_ptr_range_end_computed_after_loop'
137+
; LAA-NEXT: loop:
138+
; LAA-NEXT: Memory dependences are safe with run-time checks
139+
; LAA-NEXT: Dependences:
140+
; LAA-NEXT: Run-time memory checks:
141+
; LAA-NEXT: Check 0:
142+
; LAA-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
143+
; LAA-NEXT: %gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv
144+
; LAA-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
145+
; LAA-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
146+
; LAA-NEXT: Grouped accesses:
147+
; LAA-NEXT: Group [[GRP5]]:
148+
; LAA-NEXT: (Low: (1 + %A)<nuw> High: (405 + %A))
149+
; LAA-NEXT: Member: {(1 + %A)<nuw>,+,4}<nuw><%loop>
150+
; LAA-NEXT: Group [[GRP6]]:
151+
; LAA-NEXT: (Low: %A High: (101 + %A))
152+
; LAA-NEXT: Member: {%A,+,1}<nuw><%loop>
153+
; LAA-EMPTY:
154+
; LAA-NEXT: Non vectorizable stores to invariant address were not found in loop.
155+
; LAA-NEXT: SCEV assumptions:
156+
; LAA-EMPTY:
157+
; LAA-NEXT: Expressions re-written:
158+
;
159+
; AFTER-LABEL: 'test_ptr_range_end_computed_after_loop'
160+
; AFTER-NEXT: Classifying expressions for: @test_ptr_range_end_computed_after_loop
161+
; AFTER: %y = getelementptr inbounds i8, ptr %A, i64 405
162+
; AFTER-NEXT: --> (405 + %A) U: full-set S: full-set
163+
;
164+
entry:
165+
%A.1 = getelementptr inbounds i8, ptr %A, i64 1
166+
br label %loop
167+
168+
loop:
169+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
170+
%gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv
171+
%gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
172+
%l = load i8, ptr %gep.A, align 1
173+
%ext = zext i8 %l to i32
174+
store i32 %ext, ptr %gep.A.400, align 4
175+
%iv.next = add nuw nsw i64 %iv, 1
176+
%ec = icmp eq i64 %iv, 100
177+
br i1 %ec, label %exit, label %loop
178+
179+
exit:
180+
%y = getelementptr inbounds i8, ptr %A, i64 405
181+
ret ptr %y
182+
}

0 commit comments

Comments
 (0)