1 ; RUN: opt -S %loadPolly -polly-detect-unprofitable -basicaa -polly-dependences -analyze -polly-dependences-analysis-type=value-based < %s | FileCheck %s -check-prefix=VALUE
2 ; RUN: opt -S %loadPolly -polly-detect-unprofitable -basicaa -polly-dependences -analyze -polly-dependences-analysis-type=memory-based < %s | FileCheck %s -check-prefix=MEMORY
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
4 target triple = "x86_64-pc-linux-gnu"
6 ; for(i = 0; i < 100; i++ )
9 ; for (i = 0; i < 10; i++ )
12 ; for (i = 0; i < 200; i++ )
15 define void @sequential_writes() {
17 %A = alloca [200 x i32]
21 %indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %S1 ]
22 %arrayidx.1 = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.1
23 store i32 2, i32* %arrayidx.1
24 %indvar.next.1 = add i64 %indvar.1, 1
25 %exitcond.1 = icmp ne i64 %indvar.next.1, 100
26 br i1 %exitcond.1, label %S1, label %exit.1
32 %indvar.2 = phi i64 [ 0, %exit.1 ], [ %indvar.next.2, %S2 ]
33 %arrayidx.2 = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.2
34 store i32 5, i32* %arrayidx.2
35 %indvar.next.2 = add i64 %indvar.2, 1
36 %exitcond.2 = icmp ne i64 %indvar.next.2, 10
37 br i1 %exitcond.2, label %S2, label %exit.2
43 %indvar.3 = phi i64 [ 0, %exit.2 ], [ %indvar.next.3, %S3 ]
44 %arrayidx.3 = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.3
45 store i32 7, i32* %arrayidx.3
46 %indvar.next.3 = add i64 %indvar.3, 1
47 %exitcond.3 = icmp ne i64 %indvar.next.3, 200
48 br i1 %exitcond.3, label %S3 , label %exit.3
54 ; VALUE: region: 'S1 => exit.3' in function 'sequential_writes':
55 ; VALUE: RAW dependences:
57 ; VALUE: WAR dependences:
59 ; VALUE: WAW dependences:
61 ; VALUE: Stmt_S1[i0] -> Stmt_S2[i0] : i0 >= 0 and i0 <= 9;
62 ; VALUE: Stmt_S2[i0] -> Stmt_S3[i0] : i0 >= 0 and i0 <= 9;
63 ; VALUE: Stmt_S1[i0] -> Stmt_S3[i0] : i0 >= 10 and i0 <= 99
66 ; MEMORY: region: 'S1 => exit.3' in function 'sequential_writes':
67 ; MEMORY: RAW dependences:
69 ; MEMORY: WAR dependences:
71 ; MEMORY: WAW dependences:
73 ; MEMORY: Stmt_S1[i0] -> Stmt_S2[i0] : i0 <= 9 and i0 >= 0;
74 ; MEMORY: Stmt_S2[i0] -> Stmt_S3[i0] : i0 <= 9 and i0 >= 0;
75 ; MEMORY: Stmt_S1[i0] -> Stmt_S3[i0] : i0 <= 99 and i0 >= 0
78 ; for(i = 0; i < 100; i++ )
81 ; for (i = 0; i < 10; i++ )
84 ; for (i = 0; i < 200; i++ )
87 define void @read_after_writes() {
89 %A = alloca [200 x i32]
90 %B = alloca [200 x i32]
94 %indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %S1 ]
95 %arrayidx.1 = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.1
96 store i32 2, i32* %arrayidx.1
97 %indvar.next.1 = add i64 %indvar.1, 1
98 %exitcond.1 = icmp ne i64 %indvar.next.1, 100
99 br i1 %exitcond.1, label %S1, label %exit.1
105 %indvar.2 = phi i64 [ 0, %exit.1 ], [ %indvar.next.2, %S2 ]
106 %arrayidx.2 = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.2
107 store i32 5, i32* %arrayidx.2
108 %indvar.next.2 = add i64 %indvar.2, 1
109 %exitcond.2 = icmp ne i64 %indvar.next.2, 10
110 br i1 %exitcond.2, label %S2, label %exit.2
116 %indvar.3 = phi i64 [ 0, %exit.2 ], [ %indvar.next.3, %S3 ]
117 %arrayidx.3.a = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.3
118 %arrayidx.3.b = getelementptr [200 x i32], [200 x i32]* %B, i64 0, i64 %indvar.3
119 %val = load i32* %arrayidx.3.a
120 store i32 %val, i32* %arrayidx.3.b
121 %indvar.next.3 = add i64 %indvar.3, 1
122 %exitcond.3 = icmp ne i64 %indvar.next.3, 200
123 br i1 %exitcond.3, label %S3 , label %exit.3
129 ; VALUE: region: 'S1 => exit.3' in function 'read_after_writes':
130 ; VALUE: RAW dependences:
132 ; VALUE: Stmt_S2[i0] -> Stmt_S3[i0] : i0 >= 0 and i0 <= 9;
133 ; VALUE: Stmt_S1[i0] -> Stmt_S3[i0] : i0 >= 10 and i0 <= 99
135 ; VALUE: WAR dependences:
137 ; VALUE: WAW dependences:
139 ; VALUE: Stmt_S1[i0] -> Stmt_S2[i0] : i0 >= 0 and i0 <= 9
142 ; MEMORY: region: 'S1 => exit.3' in function 'read_after_writes':
143 ; MEMORY: RAW dependences:
145 ; MEMORY: Stmt_S2[i0] -> Stmt_S3[i0] : i0 <= 9 and i0 >= 0;
146 ; MEMORY: Stmt_S1[i0] -> Stmt_S3[i0] : i0 <= 99 and i0 >= 0
148 ; MEMORY: WAR dependences:
150 ; MEMORY: WAW dependences:
152 ; MEMORY: Stmt_S1[i0] -> Stmt_S2[i0] : i0 <= 9 and i0 >= 0
155 ; for(i = 0; i < 100; i++ )
158 ; for (i = 0; i < 10; i++ )
161 ; for (i = 0; i < 200; i++ )
164 define void @write_after_read() {
166 %A = alloca [200 x i32]
167 %B = alloca [200 x i32]
171 %indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %S1 ]
172 %arrayidx.1.a = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.1
173 %arrayidx.1.b = getelementptr [200 x i32], [200 x i32]* %B, i64 0, i64 %indvar.1
174 %val = load i32* %arrayidx.1.a
175 store i32 %val, i32* %arrayidx.1.b
176 %indvar.next.1 = add i64 %indvar.1, 1
177 %exitcond.1 = icmp ne i64 %indvar.next.1, 100
178 br i1 %exitcond.1, label %S1, label %exit.1
184 %indvar.2 = phi i64 [ 0, %exit.1 ], [ %indvar.next.2, %S2 ]
185 %arrayidx.2 = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.2
186 store i32 5, i32* %arrayidx.2
187 %indvar.next.2 = add i64 %indvar.2, 1
188 %exitcond.2 = icmp ne i64 %indvar.next.2, 10
189 br i1 %exitcond.2, label %S2, label %exit.2
195 %indvar.3 = phi i64 [ 0, %exit.2 ], [ %indvar.next.3, %S3 ]
196 %arrayidx.3 = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.3
197 store i32 10, i32* %arrayidx.3
198 %indvar.next.3 = add i64 %indvar.3, 1
199 %exitcond.3 = icmp ne i64 %indvar.next.3, 200
200 br i1 %exitcond.3, label %S3 , label %exit.3
206 ; VALUE: region: 'S1 => exit.3' in function 'write_after_read':
207 ; VALUE: RAW dependences:
210 ; VALUE: WAR dependences:
212 ; VALUE: Stmt_S1[i0] -> Stmt_S2[i0] : i0 <= 9 and i0 >= 0;
213 ; VALUE: Stmt_S1[i0] -> Stmt_S3[i0] : i0 <= 99 and i0 >= 10
215 ; VALUE: WAW dependences:
217 ; VALUE: Stmt_S2[i0] -> Stmt_S3[i0] : i0 >= 0 and i0 <= 9
220 ; MEMORY: region: 'S1 => exit.3' in function 'write_after_read':
221 ; MEMORY: RAW dependences:
224 ; MEMORY: WAR dependences:
226 ; MEMORY: Stmt_S1[i0] -> Stmt_S2[i0] : i0 <= 9 and i0 >= 0;
227 ; MEMORY: Stmt_S1[i0] -> Stmt_S3[i0] : i0 <= 99 and i0 >= 0
229 ; MEMORY: WAW dependences:
231 ; MEMORY: Stmt_S2[i0] -> Stmt_S3[i0] : i0 <= 9 and i0 >= 0
234 ; for(i = 0; i < 100; i++ )
237 ; for(i = 0; i < 100; i++ )
238 ; S2: B[i] = A[i + p];
240 define void @parametric_offset(i64 %p) {
242 %A = alloca [200 x i32]
243 %B = alloca [200 x i32]
247 %indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %S1 ]
248 %arrayidx.1 = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %indvar.1
249 store i32 10, i32* %arrayidx.1
250 %indvar.next.1 = add i64 %indvar.1, 1
251 %exitcond.1 = icmp ne i64 %indvar.next.1, 100
252 br i1 %exitcond.1, label %S1, label %exit.1
258 %indvar.2 = phi i64 [ 0, %exit.1 ], [ %indvar.next.2, %S2 ]
259 %sum = add i64 %indvar.2, %p
260 %arrayidx.2.a = getelementptr [200 x i32], [200 x i32]* %A, i64 0, i64 %sum
261 %arrayidx.2.b = getelementptr [200 x i32], [200 x i32]* %B, i64 0, i64 %indvar.2
262 %val = load i32* %arrayidx.2.a
263 store i32 %val, i32* %arrayidx.2.b
264 %indvar.next.2 = add i64 %indvar.2, 1
265 %exitcond.2 = icmp ne i64 %indvar.next.2, 10
266 br i1 %exitcond.2, label %S2, label %exit.2
272 ; VALUE: region: 'S1 => exit.2' in function 'parametric_offset':
273 ; VALUE: RAW dependences:
275 ; VALUE: Stmt_S1[i0] -> Stmt_S2[-p + i0] :
276 ; VALUE: p <= 190 and i0 >= p and i0 <= 9 + p and i0 >= 0 and i0 <= 99
278 ; VALUE: WAR dependences:
281 ; VALUE: WAW dependences:
285 ; MEMORY: region: 'S1 => exit.2' in function 'parametric_offset':
286 ; MEMORY: RAW dependences:
288 ; MEMORY: Stmt_S1[i0] -> Stmt_S2[-p + i0] :
289 ; MEMORY: i0 >= p and i0 <= 99 and i0 >= 0 and i0 <= 9 + p
291 ; MEMORY: WAR dependences:
294 ; MEMORY: WAW dependences: