[Polly][NewPM] Reenable ScopPassManager unittest
[polly-mirror.git] / test / ScopDetect / base_pointer.ll
blob09fdf020cc763758d013cd98d0e335cbf893ce21
1 ; RUN: opt %loadPolly -disable-basicaa -polly-detect -polly-invariant-load-hoisting=true -analyze < %s | FileCheck %s
4 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"
6 define void @base_pointer_in_condition(i64** noalias %A_ptr, i64 %N) nounwind {
7 entry:
8   fence seq_cst
9   br label %pre
11 pre:
12   %A = load i64*, i64** %A_ptr
13   br i1 true, label %for.i, label %then
15 for.i:
16   %indvar = phi i64 [ 0, %pre ], [ %indvar.next, %for.i ]
17   %scevgep = getelementptr i64, i64* %A, i64 %indvar
18   store i64 %indvar, i64* %scevgep
19   %indvar.next = add nsw i64 %indvar, 1
20   %exitcond = icmp eq i64 %indvar.next, %N
21   br i1 %exitcond, label %then, label %for.i
23 then:
24   br label %return
26 return:
27   fence seq_cst
28   ret void
31 ; CHECK-LABEL: base_pointer_in_condition
32 ; CHECK: Valid Region for Scop: pre => return
34 define void @base_pointer_is_argument(float* %A, i64 %n) {
35 entry:
36   br label %for.i
38 for.i:
39   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
40   br label %S1
42 S1:
43   %conv = sitofp i64 %indvar.i to float
44   %arrayidx5 = getelementptr float, float* %A, i64 %indvar.i
45   store float %conv, float* %arrayidx5, align 4
46   br label %for.i.inc
48 for.i.inc:
49   %indvar.i.next = add i64 %indvar.i, 1
50   %exitcond.i = icmp ne i64 %indvar.i.next, %n
51   br i1 %exitcond.i, label %for.i, label %exit
53 exit:
54   ret void
57 ; CHECK-LABEL: base_pointer_is_argument
58 ; CHECK: Valid Region for Scop: for.i => exit
60 define void @base_pointer_is_const_expr(i64 %n) {
61 entry:
62   br label %for.i
64 for.i:
65   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
66   br label %S1
68 S1:
69   %conv = sitofp i64 %indvar.i to float
70   %arrayidx5 = getelementptr float, float* inttoptr (i64 100 to float*), i64 %indvar.i
71   store float %conv, float* %arrayidx5, align 4
72   br label %for.i.inc
74 for.i.inc:
75   %indvar.i.next = add i64 %indvar.i, 1
76   %exitcond.i = icmp ne i64 %indvar.i.next, %n
77   br i1 %exitcond.i, label %for.i, label %exit
79 exit:
80   ret void
83 ; CHECK-LABEL: base_pointer_is_const_expr
84 ; CHECK-LABEL: Valid Region for Scop: for.i => exit
86 @A = external global float
88 define void @base_pointer_is_global(i64 %n) {
89 entry:
90   br label %for.i
92 for.i:
93   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
94   br label %S1
96 S1:
97   %conv = sitofp i64 %indvar.i to float
98   %arrayidx5 = getelementptr float, float* @A, i64 %indvar.i
99   store float %conv, float* %arrayidx5, align 4
100   br label %for.i.inc
102 for.i.inc:
103   %indvar.i.next = add i64 %indvar.i, 1
104   %exitcond.i = icmp ne i64 %indvar.i.next, %n
105   br i1 %exitcond.i, label %for.i, label %exit
107 exit:
108   ret void
111 ; CHECK-LABEL: base_pointer_is_global
112 ; CHECK: Valid Region for Scop: for.i => exit
114 declare float *@foo()
116 define void @base_pointer_is_inst_outside(i64 %n) {
117 entry:
118   %A = call float *@foo()
119   br label %for.i
121 for.i:
122   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
123   br label %S1
126   %conv = sitofp i64 %indvar.i to float
127   %arrayidx5 = getelementptr float, float* %A, i64 %indvar.i
128   store float %conv, float* %arrayidx5, align 4
129   br label %for.i.inc
131 for.i.inc:
132   %indvar.i.next = add i64 %indvar.i, 1
133   %exitcond.i = icmp ne i64 %indvar.i.next, %n
134   br i1 %exitcond.i, label %for.i, label %exit
136 exit:
137   ret void
140 ; CHECK-LABEL: base_pointer_is_inst_outside
141 ; CHECK: Valid Region for Scop: for.i => exit
143 declare float* @getNextBasePtr(float*) readnone nounwind
145 define void @base_pointer_is_phi_node(i64 %n, float* %A) {
146 entry:
147   br label %for.i
149 for.i:
150   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
151   %ptr = phi float* [ %ptr.next, %for.i.inc ], [ %A, %entry ]
152 ; To get a PHI node inside a SCoP that can not be analyzed but
153 ; for which the surrounding SCoP is normally still valid we use a function
154 ; without any side effects.
155   %ptr.next = call float* @getNextBasePtr(float* %ptr)
156   br label %S1
159   %conv = sitofp i64 %indvar.i to float
160   %arrayidx5 = getelementptr float, float* %ptr, i64 %indvar.i
161   store float %conv, float* %arrayidx5, align 4
162   br label %for.i.inc
164 for.i.inc:
165   %indvar.i.next = add i64 %indvar.i, 1
166   %exitcond.i = icmp ne i64 %indvar.i.next, %n
167   br i1 %exitcond.i, label %for.i, label %exit
169 exit:
170   ret void
173 ; CHECK-LABEL: base_pointer_is_phi_node
174 ; CHECK-NOT: Valid Region for Scop
176 define void @base_pointer_is_inst_inside_invariant_1(i64 %n, float* %A) {
177 entry:
178   br label %for.i
180 for.i:
181   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
182 ; A function return value, even with readnone nounwind attributes, is not
183 ; considered a valid base pointer because it can return a pointer that aliases
184 ; with something else (e.g. %A or a global) or return a different pointer at
185 ; every call (e.g. malloc)
186   %ptr = call float* @getNextBasePtr(float* %A)
187   br label %S1
190   %conv = sitofp i64 %indvar.i to float
191   %arrayidx5 = getelementptr float, float* %ptr, i64 %indvar.i
192   store float %conv, float* %arrayidx5, align 4
193   br label %for.i.inc
195 for.i.inc:
196   %indvar.i.next = add i64 %indvar.i, 1
197   %exitcond.i = icmp ne i64 %indvar.i.next, %n
198   br i1 %exitcond.i, label %for.i, label %exit
200 exit:
201   ret void
204 ; CHECK-LABEL: base_pointer_is_inst_inside_invariant_1
205 ; CHECK-NOT: Valid Region for Scop
207 declare float* @getNextBasePtr2(float*) readnone nounwind
209 define void @base_pointer_is_inst_inside_invariant_2(i64 %n, float* %A) {
210 entry:
211   br label %for.i
213 for.i:
214   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
215   %ptr = call float* @getNextBasePtr2(float* %A)
216   %ptr2 = call float* @getNextBasePtr(float* %ptr)
217   br label %S1
220   %conv = sitofp i64 %indvar.i to float
221   %arrayidx5 = getelementptr float, float* %ptr2, i64 %indvar.i
222   store float %conv, float* %arrayidx5, align 4
223   br label %for.i.inc
225 for.i.inc:
226   %indvar.i.next = add i64 %indvar.i, 1
227   %exitcond.i = icmp ne i64 %indvar.i.next, %n
228   br i1 %exitcond.i, label %for.i, label %exit
230 exit:
231   ret void
234 ; CHECK-LABEL: base_pointer_is_inst_inside_invariant_2
235 ; CHECK-NOT: Valid Region for Scop
237 declare float* @getNextBasePtr3(float*, i64) readnone nounwind
239 define void @base_pointer_is_inst_inside_variant(i64 %n, float* %A) {
240 entry:
241   br label %for.i
243 for.i:
244   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
245   %ptr = call float* @getNextBasePtr3(float* %A, i64 %indvar.i)
246   %ptr2 = call float* @getNextBasePtr(float* %ptr)
247   br label %S1
250   %conv = sitofp i64 %indvar.i to float
251   %arrayidx5 = getelementptr float, float* %ptr2, i64 %indvar.i
252   store float %conv, float* %arrayidx5, align 4
253   br label %for.i.inc
255 for.i.inc:
256   %indvar.i.next = add i64 %indvar.i, 1
257   %exitcond.i = icmp ne i64 %indvar.i.next, %n
258   br i1 %exitcond.i, label %for.i, label %exit
260 exit:
261   ret void
264 ; CHECK: base_pointer_is_inst_inside_variant
265 ; CHECK-NOT: Valid Region for Scop
267 define void @base_pointer_is_ptr2ptr(float** noalias %A, i64 %n) {
268 entry:
269   br label %for.i
271 for.i:
272   %indvar.i = phi i64 [ %indvar.i.next, %for.i.inc ], [ 0, %entry ]
273   %arrayidx = getelementptr float*, float** %A, i64 %indvar.i
274   br label %for.j
276 for.j:
277   %indvar.j = phi i64 [ 0, %for.i ], [ %indvar.j.next, %for.j ]
278   %conv = sitofp i64 %indvar.i to float
279   %basepointer = load float*, float** %arrayidx, align 8
280   %arrayidx5 = getelementptr float, float* %basepointer, i64 %indvar.j
281   store float %conv, float* %arrayidx5, align 4
282   %indvar.j.next = add i64 %indvar.j, 1
283   %exitcond.j = icmp ne i64 %indvar.j.next, %n
284   br i1 %exitcond.j, label %for.j, label %for.i.inc
286 for.i.inc:
287   %indvar.i.next = add i64 %indvar.i, 1
288   %exitcond.i = icmp ne i64 %indvar.i.next, %n
289   br i1 %exitcond.i, label %for.i, label %exit
291 exit:
292   ret void
295 ; CHECK: base_pointer_is_ptr2ptr
296 ; CHECK: Valid Region for Scop: for.j => for.i.inc