Update Polly tests to handle explicitly typed gep changes in LLVM
[polly-mirror.git] / test / TempScop / scalar_to_array.ll
blobe292536ed415daa4bfdfb078673c399a92b70c38
1 ; RUN: opt %loadPolly -polly-detect-unprofitable -basicaa -polly-analyze-ir -disable-polly-intra-scop-scalar-to-array -analyze < %s | FileCheck %s
2 ; RUN: opt %loadPolly -polly-detect-unprofitable -basicaa -polly-analyze-ir -disable-polly-intra-scop-scalar-to-array -analyze < %s | FileCheck %s
4 ; ModuleID = 'scalar_to_array.ll'
5 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"
6 target triple = "x86_64-unknown-linux-gnu"
8 @A = common global [1024 x float] zeroinitializer, align 8
10 ; CHECK: empty
11 ; Function Attrs: nounwind
12 define i32 @empty() #0 {
13 entry:
14   fence seq_cst
15   br label %for.cond
17 for.cond:                                         ; preds = %for.inc, %entry
18   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
19   %exitcond = icmp ne i64 %indvar, 1024
20   br i1 %exitcond, label %for.body, label %return
22 for.body:                                         ; preds = %for.cond
23   br label %for.inc
25 for.inc:                                          ; preds = %for.body
26   %indvar.next = add i64 %indvar, 1
27   br label %for.cond
29 return:                                           ; preds = %for.cond
30   fence seq_cst
31   ret i32 0
34 ; CHECK: array_access
35 ; Function Attrs: nounwind
36 define i32 @array_access() #0 {
37 entry:
38   fence seq_cst
39   br label %for.cond
41 for.cond:                                         ; preds = %for.inc, %entry
42   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
43   %exitcond = icmp ne i64 %indvar, 1024
44   br i1 %exitcond, label %for.body, label %return
46 for.body:                                         ; preds = %for.cond
47   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
48   %float = uitofp i64 %indvar to float
49   store float %float, float* %arrayidx
50   br label %for.inc
51 ; CHECK: BB: for.body
52 ; CHECK-NOT: Read
53 ; CHECK: Write A[{0,+,4}<%for.cond>]
55 for.inc:                                          ; preds = %for.body
56   %indvar.next = add i64 %indvar, 1
57   br label %for.cond
59 return:                                           ; preds = %for.cond
60   fence seq_cst
61   ret i32 0
64 ; Function Attrs: nounwind
65 ; CHECK: intra_scop_dep
66 define i32 @intra_scop_dep() #0 {
67 entry:
68   fence seq_cst
69   br label %for.cond
71 for.cond:                                         ; preds = %for.inc, %entry
72   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
73   %exitcond = icmp ne i64 %indvar, 1024
74   br i1 %exitcond, label %for.body.a, label %return
76 for.body.a:                                       ; preds = %for.cond
77   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
78   %scalar = load float* %arrayidx
79   br label %for.body.b
80 ; CHECK: BB: for.body.a
81 ; CHECK: Read A[{0,+,4}<%for.cond>]
82 ; CHECK: Write scalar[0]
84 for.body.b:                                       ; preds = %for.body.a
85   %arrayidx2 = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
86   %float = uitofp i64 %indvar to float
87   %sum = fadd float %scalar, %float
88   store float %sum, float* %arrayidx2
89   br label %for.inc
90 ; CHECK: BB: for.body.b
91 ; CHECK: Read scalar[0]
92 ; CHECK: Write A[{0,+,4}<%for.cond>]
94 for.inc:                                          ; preds = %for.body.b
95   %indvar.next = add i64 %indvar, 1
96   br label %for.cond
98 return:                                           ; preds = %for.cond
99   fence seq_cst
100   ret i32 0
103 ; It is not possible to have a scop which accesses a scalar element that is
104 ; a global variable. All global variables are pointers containing possibly
105 ; a single element. Hence they do not need to be handled anyways.
106 ; Please note that this is still required when scalar to array rewritting is
107 ; disabled.
109 ; CHECK: use_after_scop
110 ; Function Attrs: nounwind
111 define i32 @use_after_scop() #0 {
112 entry:
113   %scalar.s2a = alloca float
114   fence seq_cst
115   br label %for.head
117 for.head:                                         ; preds = %for.inc, %entry
118   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %entry ]
119   br label %for.body
121 for.body:                                         ; preds = %for.head
122   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
123   %scalar = load float* %arrayidx
124   store float %scalar, float* %scalar.s2a
125 ; Escaped uses are still required to be rewritten to stack variable.
126 ; CHECK: BB: for.body
127 ; CHECK: Read A[{0,+,4}<%for.head>]
128 ; CHECK: Write scalar.s2a[0]
129   br label %for.inc
131 for.inc:                                          ; preds = %for.body
132   %indvar.next = add i64 %indvar, 1
133   %exitcond = icmp ne i64 %indvar, 1024
134   br i1 %exitcond, label %for.head, label %for.after
136 for.after:                                        ; preds = %for.inc
137   %scalar.loadoutside = load float* %scalar.s2a
138   fence seq_cst
139   %return_value = fptosi float %scalar.loadoutside to i32
140   br label %return
142 return:                                           ; preds = %for.after
143   ret i32 %return_value
146 ; We currently do not transform scalar references, that have only read accesses
147 ; in the scop. There are two reasons for this:
149 ;  o We don't introduce additional memory references which may yield to compile
150 ;    time overhead.
151 ;  o For integer values, such a translation may block the use of scalar
152 ;    evolution on those values.
154 ; CHECK: before_scop
155 ; Function Attrs: nounwind
156 define i32 @before_scop() #0 {
157 entry:
158   br label %preheader
160 preheader:                                        ; preds = %entry
161   %scalar = fadd float 4.000000e+00, 5.000000e+00
162   fence seq_cst
163   br label %for.cond
165 for.cond:                                         ; preds = %for.inc, %preheader
166   %indvar = phi i64 [ %indvar.next, %for.inc ], [ 0, %preheader ]
167   %exitcond = icmp ne i64 %indvar, 1024
168   br i1 %exitcond, label %for.body, label %return
170 for.body:                                         ; preds = %for.cond
171   %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
172   store float %scalar, float* %arrayidx
173   br label %for.inc
174 ; CHECK: BB: for.body
175 ; CHECK: Write A[{0,+,4}<%for.cond>]
177 for.inc:                                          ; preds = %for.body
178   %indvar.next = add i64 %indvar, 1
179   br label %for.cond
181 return:                                           ; preds = %for.cond
182   fence seq_cst
183   ret i32 0
186 attributes #0 = { nounwind }