Update Polly tests to handle explicitly typed gep changes in LLVM
[polly-mirror.git] / test / IndependentBlocks / scalar_to_array.ll
blob39672c120780c18208b128b43b5433772576bf06
1 ; RUN: opt %loadPolly -polly-detect-unprofitable -basicaa -polly-independent < %s -S | FileCheck %s
2 ; RUN: opt %loadPolly -polly-detect-unprofitable -basicaa -polly-independent < %s -S | FileCheck %s
3 ; RUN: opt %loadPolly -polly-detect-unprofitable -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array -S < %s | FileCheck %s -check-prefix=SCALARACCESS
4 ; RUN: opt %loadPolly -polly-detect-unprofitable -basicaa -polly-independent -disable-polly-intra-scop-scalar-to-array < %s -S | FileCheck %s -check-prefix=SCALARACCESS
6 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"
7 target triple = "x86_64-unknown-linux-gnu"
9 @A = common global [1024 x float] zeroinitializer, align 8
11 define i32 @empty() nounwind {
12 entry:
13   fence seq_cst
14   br label %for.cond
16 for.cond:
17   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
18   %exitcond = icmp ne i64 %indvar, 1024
19   br i1 %exitcond, label %for.body, label %return
21 for.body:
22   br label %for.inc
24 for.inc:
25   %indvar.next = add i64 %indvar, 1
26   br label %for.cond
28 return:
29   fence seq_cst
30   ret i32 0
34 ; CHECK: @array_access()
35 define i32 @array_access() nounwind {
36 entry:
37   fence seq_cst
38   br label %for.cond
39 ; CHECK: entry:
40 ; CHECK-NOT: alloca
41 ; SCALARACCESS: entry:
42 ; SCALARACCESS-NOT: alloca
44 for.cond:
45   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
46   %exitcond = icmp ne i64 %indvar, 1024
47   br i1 %exitcond, label %for.body, label %return
49 for.body:
50   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
51   %float = uitofp i64 %indvar to float
52   store float %float, float* %arrayidx
53   br label %for.inc
55 ; CHECK: for.body:
56 ; CHECK: %float = uitofp i64 %indvar to float
57 ; CHECK: store float %float, float* %arrayidx
58 ; SCALARACCESS: for.body:
59 ; SCALARACCESS: %float = uitofp i64 %indvar to float
60 ; SCALARACCESS: store float %float, float* %arrayidx
62 for.inc:
63   %indvar.next = add i64 %indvar, 1
64   br label %for.cond
66 return:
67   fence seq_cst
68   ret i32 0
71 ; CHECK: @intra_scop_dep()
72 define i32 @intra_scop_dep() nounwind {
73 entry:
74   fence seq_cst
75   br label %for.cond
77 ; CHECK: entry:
78 ; CHECK: %scalar.s2a = alloca float
79 ; CHECK: fence
80 ; SCALARACCESS: entry:
81 ; SCALARACCESS-NOT: alloca
82 ; SCALARACCESS: fence
84 for.cond:
85   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
86   %exitcond = icmp ne i64 %indvar, 1024
87   br i1 %exitcond, label %for.body.a, label %return
89 for.body.a:
90   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
91   %scalar = load float* %arrayidx
92   br label %for.body.b
94 ; CHECK: for.body.a:
95 ; CHECK: %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
96 ; CHECK: %scalar = load float* %arrayidx
97 ; CHECK: store float %scalar, float* %scalar.s2a
98 ; CHECK: br label %for.body.b
100 ; SCALARACCESS: for.body.a:
101 ; SCALARACCESS: %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
102 ; SCALARACCESS: %scalar = load float* %arrayidx
103 ; SCALARACCESS-NOT: store
104 ; SCALARACCESS: br label %for.body.b
106 for.body.b:
107   %arrayidx2 = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
108   %float = uitofp i64 %indvar to float
109   %sum = fadd float %scalar, %float
110   store float %sum, float* %arrayidx2
111   br label %for.inc
113 ; CHECK: for.body.b:
114 ; CHECK: %arrayidx2 = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
115 ; CHECK: %float = uitofp i64 %indvar to float
116 ; CHECK: %scalar.loadarray = load float* %scalar.s2a
117 ; CHECK: %sum = fadd float %scalar.loadarray, %float
118 ; CHECK: store float %sum, float* %arrayidx2
119 ; CHECK: br label %for.inc
121 ; SCALARACCESS: for.body.b:
122 ; SCALARACCESS: %arrayidx2 = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
123 ; SCALARACCESS: %float = uitofp i64 %indvar to float
124 ; SCALARACCESS-NOT: load
125 ; SCALARACCESS: %sum = fadd float %scalar, %float
126 ; SCALARACCESS: store float %sum, float* %arrayidx2
127 ; SCALARACCESS: br label %for.inc
129 for.inc:
130   %indvar.next = add i64 %indvar, 1
131   br label %for.cond
133 return:
134   fence seq_cst
135   ret i32 0
138 ; It is not possible to have a scop which accesses a scalar element that is
139 ; a global variable. All global variables are pointers containing possibly
140 ; a single element. Hence they do not need to be handled anyways.
141 ; Please note that this is still required when scalar to array rewritting is
142 ; disabled.
144 ; CHECK: @use_after_scop()
145 define i32 @use_after_scop() nounwind {
146 entry:
147   fence seq_cst
148   br label %for.head
149 ; CHECK: entry:
150 ; CHECK: %scalar.s2a = alloca float
151 ; CHECK: fence
153 ; SCALARACCESS: entry:
154 ; SCALARACCESS: %scalar.s2a = alloca float
155 ; SCALARACCESS: fence
157 for.head:
158   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
159   br label %for.body
161 for.body:
162   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
163   %scalar = load float* %arrayidx
164   br label %for.inc
166 ; CHECK: for.body:
167 ; CHECK: %scalar = load float* %arrayidx
168 ; CHECK: store float %scalar, float* %scalar.s2a
170 ; SCALARACCESS: for.body:
171 ; SCALARACCESS: %scalar = load float* %arrayidx
172 ; SCALARACCESS: store float %scalar, float* %scalar.s2a
174 for.inc:
175   %indvar.next = add i64 %indvar, 1
176   %exitcond = icmp ne i64 %indvar, 1024
177   br i1 %exitcond, label %for.head, label %for.after
179 for.after:
180   fence seq_cst
181   %return_value = fptosi float %scalar to i32
182   br label %return
184 ; CHECK: for.after:
185 ; CHECK: %scalar.loadoutside = load float* %scalar.s2a
186 ; CHECK: fence seq_cst
187 ; CHECK: %return_value = fptosi float %scalar.loadoutside to i32
189 ; SCALARACCESS: for.after:
190 ; SCALARACCESS: %scalar.loadoutside = load float* %scalar.s2a
191 ; SCALARACCESS: fence seq_cst
192 ; SCALARACCESS: %return_value = fptosi float %scalar.loadoutside to i32
194 return:
195   ret i32 %return_value
198 ; We currently do not transform scalar references, that have only read accesses
199 ; in the scop. There are two reasons for this:
201 ;  o We don't introduce additional memory references which may yield to compile
202 ;    time overhead.
203 ;  o For integer values, such a translation may block the use of scalar
204 ;    evolution on those values.
206 ; CHECK: @before_scop()
207 define i32 @before_scop() nounwind {
208 entry:
209   br label %preheader
211 preheader:
212   %scalar = fadd float 4.0, 5.0
213   fence seq_cst
214   br label %for.cond
216 for.cond:
217   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %preheader ]
218   %exitcond = icmp ne i64 %indvar, 1024
219   br i1 %exitcond, label %for.body, label %return
221 for.body:
222   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
223   store float %scalar, float* %arrayidx
224   br label %for.inc
226 ; CHECK: for.body:
227 ; CHECK: store float %scalar, float* %arrayidx
229 ; SCALARACCESS: for.body:
230 ; SCALARACCESS: store float %scalar, float* %arrayidx
232 for.inc:
233   %indvar.next = add i64 %indvar, 1
234   br label %for.cond
236 return:
237   fence seq_cst
238   ret i32 0
241 ; Currently not working
242 ; CHECK: @param_before_scop(
243 define i32 @param_before_scop(float %scalar) nounwind {
244 entry:
245   fence seq_cst
246   br label %for.cond
247 ; CHECK: entry:
248 ; CHECK: fence
250 for.cond:
251   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
252   %exitcond = icmp ne i64 %indvar, 1024
253   br i1 %exitcond, label %for.body, label %return
255 for.body:
256   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
257   store float %scalar, float* %arrayidx
258   br label %for.inc
260 ; CHECK: for.body:
261 ; CHECK: store float %scalar, float* %arrayidx
263 for.inc:
264   %indvar.next = add i64 %indvar, 1
265   br label %for.cond
267 return:
268   fence seq_cst
269   ret i32 0