Mercurial > hg > CbC > CbC_gcc
annotate gcc/tree-vectorizer.h @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
rev | line source |
---|---|
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1 /* Vectorizer |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
3 Free Software Foundation, Inc. |
0 | 4 Contributed by Dorit Naishlos <dorit@il.ibm.com> |
5 | |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify it under | |
9 the terms of the GNU General Public License as published by the Free | |
10 Software Foundation; either version 3, or (at your option) any later | |
11 version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 #ifndef GCC_TREE_VECTORIZER_H | |
23 #define GCC_TREE_VECTORIZER_H | |
24 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
25 #include "tree-data-ref.h" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
26 |
0 | 27 typedef source_location LOC; |
28 #define UNKNOWN_LOC UNKNOWN_LOCATION | |
29 #define EXPR_LOC(e) EXPR_LOCATION(e) | |
30 #define LOC_FILE(l) LOCATION_FILE (l) | |
31 #define LOC_LINE(l) LOCATION_LINE (l) | |
32 | |
33 /* Used for naming of new temporaries. */ | |
34 enum vect_var_kind { | |
35 vect_simple_var, | |
36 vect_pointer_var, | |
37 vect_scalar_var | |
38 }; | |
39 | |
40 /* Defines type of operation. */ | |
41 enum operation_type { | |
42 unary_op = 1, | |
43 binary_op, | |
44 ternary_op | |
45 }; | |
46 | |
47 /* Define type of available alignment support. */ | |
48 enum dr_alignment_support { | |
49 dr_unaligned_unsupported, | |
50 dr_unaligned_supported, | |
51 dr_explicit_realign, | |
52 dr_explicit_realign_optimized, | |
53 dr_aligned | |
54 }; | |
55 | |
56 /* Define type of def-use cross-iteration cycle. */ | |
57 enum vect_def_type { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
58 vect_uninitialized_def = 0, |
0 | 59 vect_constant_def = 1, |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
60 vect_external_def, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
61 vect_internal_def, |
0 | 62 vect_induction_def, |
63 vect_reduction_def, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
64 vect_double_reduction_def, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
65 vect_nested_cycle, |
0 | 66 vect_unknown_def_type |
67 }; | |
68 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
69 #define VECTORIZABLE_CYCLE_DEF(D) (((D) == vect_reduction_def) \ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
70 || ((D) == vect_double_reduction_def) \ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
71 || ((D) == vect_nested_cycle)) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
72 |
0 | 73 /* Define verbosity levels. */ |
74 enum verbosity_levels { | |
75 REPORT_NONE, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
76 REPORT_VECTORIZED_LOCATIONS, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
77 REPORT_UNVECTORIZED_LOCATIONS, |
0 | 78 REPORT_COST, |
79 REPORT_ALIGNMENT, | |
80 REPORT_DR_DETAILS, | |
81 REPORT_BAD_FORM_LOOPS, | |
82 REPORT_OUTER_LOOPS, | |
83 REPORT_SLP, | |
84 REPORT_DETAILS, | |
85 /* New verbosity levels should be added before this one. */ | |
86 MAX_VERBOSITY_LEVEL | |
87 }; | |
88 | |
89 /************************************************************************ | |
90 SLP | |
91 ************************************************************************/ | |
92 | |
93 /* A computation tree of an SLP instance. Each node corresponds to a group of | |
94 stmts to be packed in a SIMD stmt. */ | |
95 typedef struct _slp_tree { | |
96 /* Only binary and unary operations are supported. LEFT child corresponds to | |
97 the first operand and RIGHT child to the second if the operation is | |
98 binary. */ | |
99 struct _slp_tree *left; | |
100 struct _slp_tree *right; | |
101 /* A group of scalar stmts to be vectorized together. */ | |
102 VEC (gimple, heap) *stmts; | |
103 /* Vectorized stmt/s. */ | |
104 VEC (gimple, heap) *vec_stmts; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
105 /* Number of vector stmts that are created to replace the group of scalar |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
106 stmts. It is calculated during the transformation phase as the number of |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
107 scalar elements in one scalar iteration (GROUP_SIZE) multiplied by VF |
0 | 108 divided by vector size. */ |
109 unsigned int vec_stmts_size; | |
110 /* Vectorization costs associated with SLP node. */ | |
111 struct | |
112 { | |
113 int outside_of_loop; /* Statements generated outside loop. */ | |
114 int inside_of_loop; /* Statements generated inside loop. */ | |
115 } cost; | |
116 } *slp_tree; | |
117 | |
118 DEF_VEC_P(slp_tree); | |
119 DEF_VEC_ALLOC_P(slp_tree, heap); | |
120 | |
121 /* SLP instance is a sequence of stmts in a loop that can be packed into | |
122 SIMD stmts. */ | |
123 typedef struct _slp_instance { | |
124 /* The root of SLP tree. */ | |
125 slp_tree root; | |
126 | |
127 /* Size of groups of scalar stmts that will be replaced by SIMD stmt/s. */ | |
128 unsigned int group_size; | |
129 | |
130 /* The unrolling factor required to vectorized this SLP instance. */ | |
131 unsigned int unrolling_factor; | |
132 | |
133 /* Vectorization costs associated with SLP instance. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
134 struct |
0 | 135 { |
136 int outside_of_loop; /* Statements generated outside loop. */ | |
137 int inside_of_loop; /* Statements generated inside loop. */ | |
138 } cost; | |
139 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
140 /* Loads permutation relatively to the stores, NULL if there is no |
0 | 141 permutation. */ |
142 VEC (int, heap) *load_permutation; | |
143 | |
144 /* The group of nodes that contain loads of this SLP instance. */ | |
145 VEC (slp_tree, heap) *loads; | |
146 | |
147 /* The first scalar load of the instance. The created vector loads will be | |
148 inserted before this statement. */ | |
149 gimple first_load; | |
150 } *slp_instance; | |
151 | |
152 DEF_VEC_P(slp_instance); | |
153 DEF_VEC_ALLOC_P(slp_instance, heap); | |
154 | |
155 /* Access Functions. */ | |
156 #define SLP_INSTANCE_TREE(S) (S)->root | |
157 #define SLP_INSTANCE_GROUP_SIZE(S) (S)->group_size | |
158 #define SLP_INSTANCE_UNROLLING_FACTOR(S) (S)->unrolling_factor | |
159 #define SLP_INSTANCE_OUTSIDE_OF_LOOP_COST(S) (S)->cost.outside_of_loop | |
160 #define SLP_INSTANCE_INSIDE_OF_LOOP_COST(S) (S)->cost.inside_of_loop | |
161 #define SLP_INSTANCE_LOAD_PERMUTATION(S) (S)->load_permutation | |
162 #define SLP_INSTANCE_LOADS(S) (S)->loads | |
163 #define SLP_INSTANCE_FIRST_LOAD_STMT(S) (S)->first_load | |
164 | |
165 #define SLP_TREE_LEFT(S) (S)->left | |
166 #define SLP_TREE_RIGHT(S) (S)->right | |
167 #define SLP_TREE_SCALAR_STMTS(S) (S)->stmts | |
168 #define SLP_TREE_VEC_STMTS(S) (S)->vec_stmts | |
169 #define SLP_TREE_NUMBER_OF_VEC_STMTS(S) (S)->vec_stmts_size | |
170 #define SLP_TREE_OUTSIDE_OF_LOOP_COST(S) (S)->cost.outside_of_loop | |
171 #define SLP_TREE_INSIDE_OF_LOOP_COST(S) (S)->cost.inside_of_loop | |
172 | |
173 /*-----------------------------------------------------------------*/ | |
174 /* Info on vectorized loops. */ | |
175 /*-----------------------------------------------------------------*/ | |
176 typedef struct _loop_vec_info { | |
177 | |
178 /* The loop to which this info struct refers to. */ | |
179 struct loop *loop; | |
180 | |
181 /* The loop basic blocks. */ | |
182 basic_block *bbs; | |
183 | |
184 /* Number of iterations. */ | |
185 tree num_iters; | |
186 tree num_iters_unchanged; | |
187 | |
188 /* Minimum number of iterations below which vectorization is expected to | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
189 not be profitable (as estimated by the cost model). |
0 | 190 -1 indicates that vectorization will not be profitable. |
191 FORNOW: This field is an int. Will be a tree in the future, to represent | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
192 values unknown at compile time. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
193 int min_profitable_iters; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
194 |
0 | 195 /* Is the loop vectorizable? */ |
196 bool vectorizable; | |
197 | |
198 /* Unrolling factor */ | |
199 int vectorization_factor; | |
200 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
201 /* The loop location in the source. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
202 LOC loop_line_number; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
203 |
0 | 204 /* Unknown DRs according to which loop was peeled. */ |
205 struct data_reference *unaligned_dr; | |
206 | |
207 /* peeling_for_alignment indicates whether peeling for alignment will take | |
208 place, and what the peeling factor should be: | |
209 peeling_for_alignment = X means: | |
210 If X=0: Peeling for alignment will not be applied. | |
211 If X>0: Peel first X iterations. | |
212 If X=-1: Generate a runtime test to calculate the number of iterations | |
213 to be peeled, using the dataref recorded in the field | |
214 unaligned_dr. */ | |
215 int peeling_for_alignment; | |
216 | |
217 /* The mask used to check the alignment of pointers or arrays. */ | |
218 int ptr_mask; | |
219 | |
220 /* All data references in the loop. */ | |
221 VEC (data_reference_p, heap) *datarefs; | |
222 | |
223 /* All data dependences in the loop. */ | |
224 VEC (ddr_p, heap) *ddrs; | |
225 | |
226 /* Data Dependence Relations defining address ranges that are candidates | |
227 for a run-time aliasing check. */ | |
228 VEC (ddr_p, heap) *may_alias_ddrs; | |
229 | |
230 /* Statements in the loop that have data references that are candidates for a | |
231 runtime (loop versioning) misalignment check. */ | |
232 VEC(gimple,heap) *may_misalign_stmts; | |
233 | |
234 /* All interleaving chains of stores in the loop, represented by the first | |
235 stmt in the chain. */ | |
236 VEC(gimple, heap) *strided_stores; | |
237 | |
238 /* All SLP instances in the loop. This is a subset of the set of STRIDED_STORES | |
239 of the loop. */ | |
240 VEC(slp_instance, heap) *slp_instances; | |
241 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
242 /* The unrolling factor needed to SLP the loop. In case of that pure SLP is |
0 | 243 applied to the loop, i.e., no unrolling is needed, this is 1. */ |
244 unsigned slp_unrolling_factor; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
245 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
246 /* Reduction cycles detected in the loop. Used in loop-aware SLP. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
247 VEC (gimple, heap) *reductions; |
0 | 248 } *loop_vec_info; |
249 | |
250 /* Access Functions. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
251 #define LOOP_VINFO_LOOP(L) (L)->loop |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
252 #define LOOP_VINFO_BBS(L) (L)->bbs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
253 #define LOOP_VINFO_NITERS(L) (L)->num_iters |
0 | 254 /* Since LOOP_VINFO_NITERS can change after prologue peeling |
255 retain total unchanged scalar loop iterations for cost model. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
256 #define LOOP_VINFO_NITERS_UNCHANGED(L) (L)->num_iters_unchanged |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
257 #define LOOP_VINFO_COST_MODEL_MIN_ITERS(L) (L)->min_profitable_iters |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
258 #define LOOP_VINFO_VECTORIZABLE_P(L) (L)->vectorizable |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
259 #define LOOP_VINFO_VECT_FACTOR(L) (L)->vectorization_factor |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
260 #define LOOP_VINFO_PTR_MASK(L) (L)->ptr_mask |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
261 #define LOOP_VINFO_DATAREFS(L) (L)->datarefs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
262 #define LOOP_VINFO_DDRS(L) (L)->ddrs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
263 #define LOOP_VINFO_INT_NITERS(L) (TREE_INT_CST_LOW ((L)->num_iters)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
264 #define LOOP_PEELING_FOR_ALIGNMENT(L) (L)->peeling_for_alignment |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
265 #define LOOP_VINFO_UNALIGNED_DR(L) (L)->unaligned_dr |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
266 #define LOOP_VINFO_MAY_MISALIGN_STMTS(L) (L)->may_misalign_stmts |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
267 #define LOOP_VINFO_LOC(L) (L)->loop_line_number |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
268 #define LOOP_VINFO_MAY_ALIAS_DDRS(L) (L)->may_alias_ddrs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
269 #define LOOP_VINFO_STRIDED_STORES(L) (L)->strided_stores |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
270 #define LOOP_VINFO_SLP_INSTANCES(L) (L)->slp_instances |
0 | 271 #define LOOP_VINFO_SLP_UNROLLING_FACTOR(L) (L)->slp_unrolling_factor |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
272 #define LOOP_VINFO_REDUCTIONS(L) (L)->reductions |
0 | 273 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
274 #define LOOP_REQUIRES_VERSIONING_FOR_ALIGNMENT(L) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
275 VEC_length (gimple, (L)->may_misalign_stmts) > 0 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
276 #define LOOP_REQUIRES_VERSIONING_FOR_ALIAS(L) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
277 VEC_length (ddr_p, (L)->may_alias_ddrs) > 0 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
278 |
0 | 279 #define NITERS_KNOWN_P(n) \ |
280 (host_integerp ((n),0) \ | |
281 && TREE_INT_CST_LOW ((n)) > 0) | |
282 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
283 #define LOOP_VINFO_NITERS_KNOWN_P(L) \ |
0 | 284 NITERS_KNOWN_P((L)->num_iters) |
285 | |
286 static inline loop_vec_info | |
287 loop_vec_info_for_loop (struct loop *loop) | |
288 { | |
289 return (loop_vec_info) loop->aux; | |
290 } | |
291 | |
292 static inline bool | |
293 nested_in_vect_loop_p (struct loop *loop, gimple stmt) | |
294 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
295 return (loop->inner |
0 | 296 && (loop->inner == (gimple_bb (stmt))->loop_father)); |
297 } | |
298 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
299 typedef struct _bb_vec_info { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
300 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
301 basic_block bb; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
302 /* All interleaving chains of stores in the basic block, represented by the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
303 first stmt in the chain. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
304 VEC(gimple, heap) *strided_stores; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
305 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
306 /* All SLP instances in the basic block. This is a subset of the set of |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
307 STRIDED_STORES of the basic block. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
308 VEC(slp_instance, heap) *slp_instances; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
309 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
310 /* All data references in the basic block. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
311 VEC (data_reference_p, heap) *datarefs; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
312 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
313 /* All data dependences in the basic block. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
314 VEC (ddr_p, heap) *ddrs; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
315 } *bb_vec_info; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
316 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
317 #define BB_VINFO_BB(B) (B)->bb |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
318 #define BB_VINFO_STRIDED_STORES(B) (B)->strided_stores |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
319 #define BB_VINFO_SLP_INSTANCES(B) (B)->slp_instances |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
320 #define BB_VINFO_DATAREFS(B) (B)->datarefs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
321 #define BB_VINFO_DDRS(B) (B)->ddrs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
322 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
323 static inline bb_vec_info |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
324 vec_info_for_bb (basic_block bb) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
325 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
326 return (bb_vec_info) bb->aux; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
327 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
328 |
0 | 329 /*-----------------------------------------------------------------*/ |
330 /* Info on vectorized defs. */ | |
331 /*-----------------------------------------------------------------*/ | |
332 enum stmt_vec_info_type { | |
333 undef_vec_info_type = 0, | |
334 load_vec_info_type, | |
335 store_vec_info_type, | |
336 op_vec_info_type, | |
337 call_vec_info_type, | |
338 assignment_vec_info_type, | |
339 condition_vec_info_type, | |
340 reduc_vec_info_type, | |
341 induc_vec_info_type, | |
342 type_promotion_vec_info_type, | |
343 type_demotion_vec_info_type, | |
344 type_conversion_vec_info_type, | |
345 loop_exit_ctrl_vec_info_type | |
346 }; | |
347 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
348 /* Indicates whether/how a variable is used in the scope of loop/basic |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
349 block. */ |
0 | 350 enum vect_relevant { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
351 vect_unused_in_scope = 0, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
352 /* The def is in the inner loop, and the use is in the outer loop, and the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
353 use is a reduction stmt. */ |
0 | 354 vect_used_in_outer_by_reduction, |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
355 /* The def is in the inner loop, and the use is in the outer loop (and is |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
356 not part of reduction). */ |
0 | 357 vect_used_in_outer, |
358 | |
359 /* defs that feed computations that end up (only) in a reduction. These | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
360 defs may be used by non-reduction stmts, but eventually, any |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
361 computations/values that are affected by these defs are used to compute |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
362 a reduction (i.e. don't get stored to memory, for example). We use this |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
363 to identify computations that we can change the order in which they are |
0 | 364 computed. */ |
365 vect_used_by_reduction, | |
366 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
367 vect_used_in_scope |
0 | 368 }; |
369 | |
370 /* The type of vectorization that can be applied to the stmt: regular loop-based | |
371 vectorization; pure SLP - the stmt is a part of SLP instances and does not | |
372 have uses outside SLP instances; or hybrid SLP and loop-based - the stmt is | |
373 a part of SLP instance and also must be loop-based vectorized, since it has | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
374 uses outside SLP sequences. |
0 | 375 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
376 In the loop context the meanings of pure and hybrid SLP are slightly |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
377 different. By saying that pure SLP is applied to the loop, we mean that we |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
378 exploit only intra-iteration parallelism in the loop; i.e., the loop can be |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
379 vectorized without doing any conceptual unrolling, cause we don't pack |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
380 together stmts from different iterations, only within a single iteration. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
381 Loop hybrid SLP means that we exploit both intra-iteration and |
0 | 382 inter-iteration parallelism (e.g., number of elements in the vector is 4 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
383 and the slp-group-size is 2, in which case we don't have enough parallelism |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
384 within an iteration, so we obtain the rest of the parallelism from subsequent |
0 | 385 iterations by unrolling the loop by 2). */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
386 enum slp_vect_type { |
0 | 387 loop_vect = 0, |
388 pure_slp, | |
389 hybrid | |
390 }; | |
391 | |
392 | |
393 typedef struct data_reference *dr_p; | |
394 DEF_VEC_P(dr_p); | |
395 DEF_VEC_ALLOC_P(dr_p,heap); | |
396 | |
397 typedef struct _stmt_vec_info { | |
398 | |
399 enum stmt_vec_info_type type; | |
400 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
401 /* Indicates whether this stmts is part of a computation whose result is |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
402 used outside the loop. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
403 bool live; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
404 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
405 /* Stmt is part of some pattern (computation idiom) */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
406 bool in_pattern_p; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
407 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
408 /* For loads only, if there is a store with the same location, this field is |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
409 TRUE. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
410 bool read_write_dep; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
411 |
0 | 412 /* The stmt to which this info struct refers to. */ |
413 gimple stmt; | |
414 | |
415 /* The loop_vec_info with respect to which STMT is vectorized. */ | |
416 loop_vec_info loop_vinfo; | |
417 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
418 /* The vector type to be used for the LHS of this statement. */ |
0 | 419 tree vectype; |
420 | |
421 /* The vectorized version of the stmt. */ | |
422 gimple vectorized_stmt; | |
423 | |
424 | |
425 /** The following is relevant only for stmts that contain a non-scalar | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
426 data-ref (array/pointer/struct access). A GIMPLE stmt is expected to have |
0 | 427 at most one such data-ref. **/ |
428 | |
429 /* Information about the data-ref (access function, etc), | |
430 relative to the inner-most containing loop. */ | |
431 struct data_reference *data_ref_info; | |
432 | |
433 /* Information about the data-ref relative to this loop | |
434 nest (the loop that is being considered for vectorization). */ | |
435 tree dr_base_address; | |
436 tree dr_init; | |
437 tree dr_offset; | |
438 tree dr_step; | |
439 tree dr_aligned_to; | |
440 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
441 /* Used for various bookkeeping purposes, generally holding a pointer to |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
442 some other stmt S that is in some way "related" to this stmt. |
0 | 443 Current use of this field is: |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
444 If this stmt is part of a pattern (i.e. the field 'in_pattern_p' is |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
445 true): S is the "pattern stmt" that represents (and replaces) the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
446 sequence of stmts that constitutes the pattern. Similarly, the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
447 related_stmt of the "pattern stmt" points back to this stmt (which is |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
448 the last stmt in the original sequence of stmts that constitutes the |
0 | 449 pattern). */ |
450 gimple related_stmt; | |
451 | |
452 /* List of datarefs that are known to have the same alignment as the dataref | |
453 of this stmt. */ | |
454 VEC(dr_p,heap) *same_align_refs; | |
455 | |
456 /* Classify the def of this stmt. */ | |
457 enum vect_def_type def_type; | |
458 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
459 /* Whether the stmt is SLPed, loop-based vectorized, or both. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
460 enum slp_vect_type slp_type; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
461 |
0 | 462 /* Interleaving info. */ |
463 /* First data-ref in the interleaving group. */ | |
464 gimple first_dr; | |
465 /* Pointer to the next data-ref in the group. */ | |
466 gimple next_dr; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
467 /* In case that two or more stmts share data-ref, this is the pointer to the |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
468 previously detected stmt with the same dr. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
469 gimple same_dr_stmt; |
0 | 470 /* The size of the interleaving group. */ |
471 unsigned int size; | |
472 /* For stores, number of stores from this group seen. We vectorize the last | |
473 one. */ | |
474 unsigned int store_count; | |
475 /* For loads only, the gap from the previous load. For consecutive loads, GAP | |
476 is 1. */ | |
477 unsigned int gap; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
478 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
479 /* Not all stmts in the loop need to be vectorized. e.g, the increment |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
480 of the loop induction variable and computation of array indexes. relevant |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
481 indicates whether the stmt needs to be vectorized. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
482 enum vect_relevant relevant; |
0 | 483 |
484 /* Vectorization costs associated with statement. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
485 struct |
0 | 486 { |
487 int outside_of_loop; /* Statements generated outside loop. */ | |
488 int inside_of_loop; /* Statements generated inside loop. */ | |
489 } cost; | |
490 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
491 /* The bb_vec_info with respect to which STMT is vectorized. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
492 bb_vec_info bb_vinfo; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
493 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
494 /* Is this statement vectorizable or should it be skipped in (partial) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
495 vectorization. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
496 bool vectorizable; |
0 | 497 } *stmt_vec_info; |
498 | |
499 /* Access Functions. */ | |
500 #define STMT_VINFO_TYPE(S) (S)->type | |
501 #define STMT_VINFO_STMT(S) (S)->stmt | |
502 #define STMT_VINFO_LOOP_VINFO(S) (S)->loop_vinfo | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
503 #define STMT_VINFO_BB_VINFO(S) (S)->bb_vinfo |
0 | 504 #define STMT_VINFO_RELEVANT(S) (S)->relevant |
505 #define STMT_VINFO_LIVE_P(S) (S)->live | |
506 #define STMT_VINFO_VECTYPE(S) (S)->vectype | |
507 #define STMT_VINFO_VEC_STMT(S) (S)->vectorized_stmt | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
508 #define STMT_VINFO_VECTORIZABLE(S) (S)->vectorizable |
0 | 509 #define STMT_VINFO_DATA_REF(S) (S)->data_ref_info |
510 | |
511 #define STMT_VINFO_DR_BASE_ADDRESS(S) (S)->dr_base_address | |
512 #define STMT_VINFO_DR_INIT(S) (S)->dr_init | |
513 #define STMT_VINFO_DR_OFFSET(S) (S)->dr_offset | |
514 #define STMT_VINFO_DR_STEP(S) (S)->dr_step | |
515 #define STMT_VINFO_DR_ALIGNED_TO(S) (S)->dr_aligned_to | |
516 | |
517 #define STMT_VINFO_IN_PATTERN_P(S) (S)->in_pattern_p | |
518 #define STMT_VINFO_RELATED_STMT(S) (S)->related_stmt | |
519 #define STMT_VINFO_SAME_ALIGN_REFS(S) (S)->same_align_refs | |
520 #define STMT_VINFO_DEF_TYPE(S) (S)->def_type | |
521 #define STMT_VINFO_DR_GROUP_FIRST_DR(S) (S)->first_dr | |
522 #define STMT_VINFO_DR_GROUP_NEXT_DR(S) (S)->next_dr | |
523 #define STMT_VINFO_DR_GROUP_SIZE(S) (S)->size | |
524 #define STMT_VINFO_DR_GROUP_STORE_COUNT(S) (S)->store_count | |
525 #define STMT_VINFO_DR_GROUP_GAP(S) (S)->gap | |
526 #define STMT_VINFO_DR_GROUP_SAME_DR_STMT(S)(S)->same_dr_stmt | |
527 #define STMT_VINFO_DR_GROUP_READ_WRITE_DEPENDENCE(S) (S)->read_write_dep | |
528 #define STMT_VINFO_STRIDED_ACCESS(S) ((S)->first_dr != NULL) | |
529 | |
530 #define DR_GROUP_FIRST_DR(S) (S)->first_dr | |
531 #define DR_GROUP_NEXT_DR(S) (S)->next_dr | |
532 #define DR_GROUP_SIZE(S) (S)->size | |
533 #define DR_GROUP_STORE_COUNT(S) (S)->store_count | |
534 #define DR_GROUP_GAP(S) (S)->gap | |
535 #define DR_GROUP_SAME_DR_STMT(S) (S)->same_dr_stmt | |
536 #define DR_GROUP_READ_WRITE_DEPENDENCE(S) (S)->read_write_dep | |
537 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
538 #define STMT_VINFO_RELEVANT_P(S) ((S)->relevant != vect_unused_in_scope) |
0 | 539 #define STMT_VINFO_OUTSIDE_OF_LOOP_COST(S) (S)->cost.outside_of_loop |
540 #define STMT_VINFO_INSIDE_OF_LOOP_COST(S) (S)->cost.inside_of_loop | |
541 | |
542 #define HYBRID_SLP_STMT(S) ((S)->slp_type == hybrid) | |
543 #define PURE_SLP_STMT(S) ((S)->slp_type == pure_slp) | |
544 #define STMT_SLP_TYPE(S) (S)->slp_type | |
545 | |
546 /* These are some defines for the initial implementation of the vectorizer's | |
547 cost model. These will later be target specific hooks. */ | |
548 | |
549 /* Cost of conditional taken branch. */ | |
550 #ifndef TARG_COND_TAKEN_BRANCH_COST | |
551 #define TARG_COND_TAKEN_BRANCH_COST 3 | |
552 #endif | |
553 | |
554 /* Cost of conditional not taken branch. */ | |
555 #ifndef TARG_COND_NOT_TAKEN_BRANCH_COST | |
556 #define TARG_COND_NOT_TAKEN_BRANCH_COST 1 | |
557 #endif | |
558 | |
559 /* Cost of any scalar operation, excluding load and store. */ | |
560 #ifndef TARG_SCALAR_STMT_COST | |
561 #define TARG_SCALAR_STMT_COST 1 | |
562 #endif | |
563 | |
564 /* Cost of scalar load. */ | |
565 #ifndef TARG_SCALAR_LOAD_COST | |
566 #define TARG_SCALAR_LOAD_COST 1 | |
567 #endif | |
568 | |
569 /* Cost of scalar store. */ | |
570 #ifndef TARG_SCALAR_STORE_COST | |
571 #define TARG_SCALAR_STORE_COST 1 | |
572 #endif | |
573 | |
574 /* Cost of any vector operation, excluding load, store or vector to scalar | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
575 operation. */ |
0 | 576 #ifndef TARG_VEC_STMT_COST |
577 #define TARG_VEC_STMT_COST 1 | |
578 #endif | |
579 | |
580 /* Cost of vector to scalar operation. */ | |
581 #ifndef TARG_VEC_TO_SCALAR_COST | |
582 #define TARG_VEC_TO_SCALAR_COST 1 | |
583 #endif | |
584 | |
585 /* Cost of scalar to vector operation. */ | |
586 #ifndef TARG_SCALAR_TO_VEC_COST | |
587 #define TARG_SCALAR_TO_VEC_COST 1 | |
588 #endif | |
589 | |
590 /* Cost of aligned vector load. */ | |
591 #ifndef TARG_VEC_LOAD_COST | |
592 #define TARG_VEC_LOAD_COST 1 | |
593 #endif | |
594 | |
595 /* Cost of misaligned vector load. */ | |
596 #ifndef TARG_VEC_UNALIGNED_LOAD_COST | |
597 #define TARG_VEC_UNALIGNED_LOAD_COST 2 | |
598 #endif | |
599 | |
600 /* Cost of vector store. */ | |
601 #ifndef TARG_VEC_STORE_COST | |
602 #define TARG_VEC_STORE_COST 1 | |
603 #endif | |
604 | |
605 /* Cost of vector permutation. */ | |
606 #ifndef TARG_VEC_PERMUTE_COST | |
607 #define TARG_VEC_PERMUTE_COST 1 | |
608 #endif | |
609 | |
610 /* The maximum number of intermediate steps required in multi-step type | |
611 conversion. */ | |
612 #define MAX_INTERM_CVT_STEPS 3 | |
613 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
614 /* The maximum vectorization factor supported by any target (V32QI). */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
615 #define MAX_VECTORIZATION_FACTOR 32 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
616 |
0 | 617 /* Avoid GTY(()) on stmt_vec_info. */ |
618 typedef void *vec_void_p; | |
619 DEF_VEC_P (vec_void_p); | |
620 DEF_VEC_ALLOC_P (vec_void_p, heap); | |
621 | |
622 extern VEC(vec_void_p,heap) *stmt_vec_info_vec; | |
623 | |
624 void init_stmt_vec_info_vec (void); | |
625 void free_stmt_vec_info_vec (void); | |
626 | |
627 static inline stmt_vec_info | |
628 vinfo_for_stmt (gimple stmt) | |
629 { | |
630 unsigned int uid = gimple_uid (stmt); | |
631 if (uid == 0) | |
632 return NULL; | |
633 | |
634 gcc_assert (uid <= VEC_length (vec_void_p, stmt_vec_info_vec)); | |
635 return (stmt_vec_info) VEC_index (vec_void_p, stmt_vec_info_vec, uid - 1); | |
636 } | |
637 | |
638 static inline void | |
639 set_vinfo_for_stmt (gimple stmt, stmt_vec_info info) | |
640 { | |
641 unsigned int uid = gimple_uid (stmt); | |
642 if (uid == 0) | |
643 { | |
644 gcc_assert (info); | |
645 uid = VEC_length (vec_void_p, stmt_vec_info_vec) + 1; | |
646 gimple_set_uid (stmt, uid); | |
647 VEC_safe_push (vec_void_p, heap, stmt_vec_info_vec, (vec_void_p) info); | |
648 } | |
649 else | |
650 VEC_replace (vec_void_p, stmt_vec_info_vec, uid - 1, (vec_void_p) info); | |
651 } | |
652 | |
653 static inline gimple | |
654 get_earlier_stmt (gimple stmt1, gimple stmt2) | |
655 { | |
656 unsigned int uid1, uid2; | |
657 | |
658 if (stmt1 == NULL) | |
659 return stmt2; | |
660 | |
661 if (stmt2 == NULL) | |
662 return stmt1; | |
663 | |
664 uid1 = gimple_uid (stmt1); | |
665 uid2 = gimple_uid (stmt2); | |
666 | |
667 if (uid1 == 0 || uid2 == 0) | |
668 return NULL; | |
669 | |
670 gcc_assert (uid1 <= VEC_length (vec_void_p, stmt_vec_info_vec)); | |
671 gcc_assert (uid2 <= VEC_length (vec_void_p, stmt_vec_info_vec)); | |
672 | |
673 if (uid1 < uid2) | |
674 return stmt1; | |
675 else | |
676 return stmt2; | |
677 } | |
678 | |
679 static inline bool | |
680 is_pattern_stmt_p (stmt_vec_info stmt_info) | |
681 { | |
682 gimple related_stmt; | |
683 stmt_vec_info related_stmt_info; | |
684 | |
685 related_stmt = STMT_VINFO_RELATED_STMT (stmt_info); | |
686 if (related_stmt | |
687 && (related_stmt_info = vinfo_for_stmt (related_stmt)) | |
688 && STMT_VINFO_IN_PATTERN_P (related_stmt_info)) | |
689 return true; | |
690 | |
691 return false; | |
692 } | |
693 | |
694 static inline bool | |
695 is_loop_header_bb_p (basic_block bb) | |
696 { | |
697 if (bb == (bb->loop_father)->header) | |
698 return true; | |
699 gcc_assert (EDGE_COUNT (bb->preds) == 1); | |
700 return false; | |
701 } | |
702 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
703 static inline void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
704 stmt_vinfo_set_inside_of_loop_cost (stmt_vec_info stmt_info, slp_tree slp_node, |
0 | 705 int cost) |
706 { | |
707 if (slp_node) | |
708 SLP_TREE_INSIDE_OF_LOOP_COST (slp_node) = cost; | |
709 else | |
710 STMT_VINFO_INSIDE_OF_LOOP_COST (stmt_info) = cost; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
711 } |
0 | 712 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
713 static inline void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
714 stmt_vinfo_set_outside_of_loop_cost (stmt_vec_info stmt_info, slp_tree slp_node, |
0 | 715 int cost) |
716 { | |
717 if (slp_node) | |
718 SLP_TREE_OUTSIDE_OF_LOOP_COST (slp_node) = cost; | |
719 else | |
720 STMT_VINFO_OUTSIDE_OF_LOOP_COST (stmt_info) = cost; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
721 } |
0 | 722 |
723 static inline int | |
724 vect_pow2 (int x) | |
725 { | |
726 int i, res = 1; | |
727 | |
728 for (i = 0; i < x; i++) | |
729 res *= 2; | |
730 | |
731 return res; | |
732 } | |
733 | |
734 /*-----------------------------------------------------------------*/ | |
735 /* Info on data references alignment. */ | |
736 /*-----------------------------------------------------------------*/ | |
737 | |
738 /* Reflects actual alignment of first access in the vectorized loop, | |
739 taking into account peeling/versioning if applied. */ | |
740 #define DR_MISALIGNMENT(DR) ((int) (size_t) (DR)->aux) | |
741 #define SET_DR_MISALIGNMENT(DR, VAL) ((DR)->aux = (void *) (size_t) (VAL)) | |
742 | |
743 static inline bool | |
744 aligned_access_p (struct data_reference *data_ref_info) | |
745 { | |
746 return (DR_MISALIGNMENT (data_ref_info) == 0); | |
747 } | |
748 | |
749 static inline bool | |
750 known_alignment_for_access_p (struct data_reference *data_ref_info) | |
751 { | |
752 return (DR_MISALIGNMENT (data_ref_info) != -1); | |
753 } | |
754 | |
755 /* vect_dump will be set to stderr or dump_file if exist. */ | |
756 extern FILE *vect_dump; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
757 extern LOC vect_loop_location; |
0 | 758 |
759 /*-----------------------------------------------------------------*/ | |
760 /* Function prototypes. */ | |
761 /*-----------------------------------------------------------------*/ | |
762 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
763 /* Simple loop peeling and versioning utilities for vectorizer's purposes - |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
764 in tree-vect-loop-manip.c. */ |
0 | 765 extern void slpeel_make_loop_iterate_ntimes (struct loop *, tree); |
766 extern bool slpeel_can_duplicate_loop_p (const struct loop *, const_edge); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
767 extern void vect_loop_versioning (loop_vec_info, bool, tree *, gimple_seq *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
768 extern void vect_do_peeling_for_loop_bound (loop_vec_info, tree *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
769 tree, gimple_seq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
770 extern void vect_do_peeling_for_alignment (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
771 extern LOC find_loop_location (struct loop *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
772 extern bool vect_can_advance_ivs_p (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
773 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
774 /* In tree-vect-stmts.c. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
775 extern tree get_vectype_for_scalar_type (tree); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
776 extern tree get_same_sized_vectype (tree, tree); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
777 extern bool vect_is_simple_use (tree, loop_vec_info, bb_vec_info, gimple *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
778 tree *, enum vect_def_type *); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
779 extern bool vect_is_simple_use_1 (tree, loop_vec_info, bb_vec_info, gimple *, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
780 tree *, enum vect_def_type *, tree *); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
781 extern bool supportable_widening_operation (enum tree_code, gimple, tree, tree, |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
782 tree *, tree *, enum tree_code *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
783 enum tree_code *, int *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
784 VEC (tree, heap) **); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
785 extern bool supportable_narrowing_operation (enum tree_code, tree, tree, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
786 enum tree_code *, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
787 int *, VEC (tree, heap) **); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
788 extern stmt_vec_info new_stmt_vec_info (gimple stmt, loop_vec_info, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
789 bb_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
790 extern void free_stmt_vec_info (gimple stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
791 extern tree vectorizable_function (gimple, tree, tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
792 extern void vect_model_simple_cost (stmt_vec_info, int, enum vect_def_type *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
793 slp_tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
794 extern void vect_model_store_cost (stmt_vec_info, int, enum vect_def_type, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
795 slp_tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
796 extern void vect_model_load_cost (stmt_vec_info, int, slp_tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
797 extern void vect_finish_stmt_generation (gimple, gimple, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
798 gimple_stmt_iterator *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
799 extern bool vect_mark_stmts_to_be_vectorized (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
800 extern int cost_for_stmt (gimple); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
801 extern tree vect_get_vec_def_for_operand (tree, gimple, tree *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
802 extern tree vect_init_vector (gimple, tree, tree, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
803 gimple_stmt_iterator *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
804 extern tree vect_get_vec_def_for_stmt_copy (enum vect_def_type, tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
805 extern bool vect_transform_stmt (gimple, gimple_stmt_iterator *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
806 bool *, slp_tree, slp_instance); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
807 extern void vect_remove_stores (gimple); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
808 extern bool vect_analyze_stmt (gimple, bool *, slp_tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
809 extern bool vectorizable_condition (gimple, gimple_stmt_iterator *, gimple *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
810 tree, int); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
811 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
812 /* In tree-vect-data-refs.c. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
813 extern bool vect_can_force_dr_alignment_p (const_tree, unsigned int); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
814 extern enum dr_alignment_support vect_supportable_dr_alignment |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
815 (struct data_reference *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
816 extern tree vect_get_smallest_scalar_type (gimple, HOST_WIDE_INT *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
817 HOST_WIDE_INT *); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
818 extern bool vect_analyze_data_ref_dependences (loop_vec_info, bb_vec_info, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
819 int *); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
820 extern bool vect_enhance_data_refs_alignment (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
821 extern bool vect_analyze_data_refs_alignment (loop_vec_info, bb_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
822 extern bool vect_verify_datarefs_alignment (loop_vec_info, bb_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
823 extern bool vect_analyze_data_ref_accesses (loop_vec_info, bb_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
824 extern bool vect_prune_runtime_alias_test_list (loop_vec_info); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
825 extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
826 extern tree vect_create_data_ref_ptr (gimple, struct loop *, tree, tree *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
827 gimple *, bool, bool *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
828 extern tree bump_vector_ptr (tree, gimple, gimple_stmt_iterator *, gimple, tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
829 extern tree vect_create_destination_var (tree, tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
830 extern bool vect_strided_store_supported (tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
831 extern bool vect_strided_load_supported (tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
832 extern bool vect_permute_store_chain (VEC(tree,heap) *,unsigned int, gimple, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
833 gimple_stmt_iterator *, VEC(tree,heap) **); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
834 extern tree vect_setup_realignment (gimple, gimple_stmt_iterator *, tree *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
835 enum dr_alignment_support, tree, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
836 struct loop **); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
837 extern bool vect_permute_load_chain (VEC(tree,heap) *,unsigned int, gimple, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
838 gimple_stmt_iterator *, VEC(tree,heap) **); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
839 extern bool vect_transform_strided_load (gimple, VEC(tree,heap) *, int, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
840 gimple_stmt_iterator *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
841 extern int vect_get_place_in_interleaving_chain (gimple, gimple); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
842 extern tree vect_get_new_vect_var (tree, enum vect_var_kind, const char *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
843 extern tree vect_create_addr_base_for_vector_ref (gimple, gimple_seq *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
844 tree, struct loop *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
845 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
846 /* In tree-vect-loop.c. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
847 /* FORNOW: Used in tree-parloops.c. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
848 extern void destroy_loop_vec_info (loop_vec_info, bool); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
849 extern gimple vect_force_simple_reduction (loop_vec_info, gimple, bool, bool *); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
850 /* Drive for loop analysis stage. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
851 extern loop_vec_info vect_analyze_loop (struct loop *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
852 /* Drive for loop transformation stage. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
853 extern void vect_transform_loop (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
854 extern loop_vec_info vect_analyze_loop_form (struct loop *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
855 extern bool vectorizable_live_operation (gimple, gimple_stmt_iterator *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
856 gimple *); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
857 extern bool vectorizable_reduction (gimple, gimple_stmt_iterator *, gimple *, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
858 slp_tree); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
859 extern bool vectorizable_induction (gimple, gimple_stmt_iterator *, gimple *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
860 extern int vect_estimate_min_profitable_iters (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
861 extern tree get_initial_def_for_reduction (gimple, tree, tree *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
862 extern int vect_min_worthwhile_factor (enum tree_code); |
0 | 863 |
864 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
865 /* In tree-vect-slp.c. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
866 extern void vect_free_slp_instance (slp_instance); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
867 extern bool vect_transform_slp_perm_load (gimple, VEC (tree, heap) *, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
868 gimple_stmt_iterator *, int, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
869 slp_instance, bool); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
870 extern bool vect_schedule_slp (loop_vec_info, bb_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
871 extern void vect_update_slp_costs_according_to_vf (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
872 extern bool vect_analyze_slp (loop_vec_info, bb_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
873 extern void vect_make_slp_decision (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
874 extern void vect_detect_hybrid_slp (loop_vec_info); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
875 extern void vect_get_slp_defs (slp_tree, VEC (tree,heap) **, |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
876 VEC (tree,heap) **, int); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
877 extern LOC find_bb_location (basic_block); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
878 extern bb_vec_info vect_slp_analyze_bb (basic_block); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
879 extern void vect_slp_transform_bb (basic_block); |
0 | 880 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
881 /* In tree-vect-patterns.c. */ |
0 | 882 /* Pattern recognition functions. |
883 Additional pattern recognition functions can (and will) be added | |
884 in the future. */ | |
885 typedef gimple (* vect_recog_func_ptr) (gimple, tree *, tree *); | |
886 #define NUM_PATTERNS 4 | |
887 void vect_pattern_recog (loop_vec_info); | |
888 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
889 /* In tree-vectorizer.c. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
890 unsigned vectorize_loops (void); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
891 /* Vectorization debug information */ |
0 | 892 extern bool vect_print_dump_info (enum verbosity_levels); |
893 | |
894 #endif /* GCC_TREE_VECTORIZER_H */ |