Mercurial > hg > CbC > CbC_gcc
annotate gcc/tree-ssa-sccvn.h @ 127:4c56639505ff
fix function.c and add CbC-example Makefile
author | mir3636 |
---|---|
date | Wed, 11 Apr 2018 18:46:58 +0900 |
parents | 04ced10e8804 |
children | 84e7813d76e9 |
rev | line source |
---|---|
0 | 1 /* Tree SCC value numbering |
111 | 2 Copyright (C) 2007-2017 Free Software Foundation, Inc. |
0 | 3 Contributed by Daniel Berlin <dberlin@dberlin.org> |
4 | |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify | |
8 under the terms of the GNU General Public License as published by | |
9 the Free Software Foundation; either version 3 of the License, or | |
10 (at your option) any later version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 #ifndef TREE_SSA_SCCVN_H | |
22 #define TREE_SSA_SCCVN_H | |
23 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
24 /* In tree-ssa-sccvn.c */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
25 bool expressions_equal_p (tree, tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
26 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
27 |
0 | 28 /* TOP of the VN lattice. */ |
29 extern tree VN_TOP; | |
30 | |
31 /* N-ary operations in the hashtable consist of length operands, an | |
32 opcode, and a type. Result is the value number of the operation, | |
33 and hashcode is stored to avoid having to calculate it | |
34 repeatedly. */ | |
35 | |
36 typedef struct vn_nary_op_s | |
37 { | |
38 /* Unique identify that all expressions with the same value have. */ | |
39 unsigned int value_id; | |
40 ENUM_BITFIELD(tree_code) opcode : 16; | |
41 unsigned length : 16; | |
42 hashval_t hashcode; | |
43 tree result; | |
44 tree type; | |
111 | 45 tree op[1]; |
0 | 46 } *vn_nary_op_t; |
47 typedef const struct vn_nary_op_s *const_vn_nary_op_t; | |
48 | |
111 | 49 /* Return the size of a vn_nary_op_t with LENGTH operands. */ |
50 | |
51 static inline size_t | |
52 sizeof_vn_nary_op (unsigned int length) | |
53 { | |
54 return sizeof (struct vn_nary_op_s) + sizeof (tree) * length - sizeof (tree); | |
55 } | |
56 | |
0 | 57 /* Phi nodes in the hashtable consist of their non-VN_TOP phi |
58 arguments, and the basic block the phi is in. Result is the value | |
59 number of the operation, and hashcode is stored to avoid having to | |
60 calculate it repeatedly. Phi nodes not in the same block are never | |
61 considered equivalent. */ | |
62 | |
63 typedef struct vn_phi_s | |
64 { | |
65 /* Unique identifier that all expressions with the same value have. */ | |
66 unsigned int value_id; | |
67 hashval_t hashcode; | |
111 | 68 vec<tree> phiargs; |
0 | 69 basic_block block; |
111 | 70 /* Controlling condition lhs/rhs. */ |
71 tree cclhs; | |
72 tree ccrhs; | |
73 tree type; | |
0 | 74 tree result; |
75 } *vn_phi_t; | |
76 typedef const struct vn_phi_s *const_vn_phi_t; | |
77 | |
78 /* Reference operands only exist in reference operations structures. | |
79 They consist of an opcode, type, and some number of operands. For | |
80 a given opcode, some, all, or none of the operands may be used. | |
81 The operands are there to store the information that makes up the | |
82 portion of the addressing calculation that opcode performs. */ | |
83 | |
84 typedef struct vn_reference_op_struct | |
85 { | |
111 | 86 ENUM_BITFIELD(tree_code) opcode : 16; |
87 /* Dependence info, used for [TARGET_]MEM_REF only. */ | |
88 unsigned short clique; | |
89 unsigned short base; | |
90 /* 1 for instrumented calls. */ | |
91 unsigned with_bounds : 1; | |
92 unsigned reverse : 1; | |
93 /* For storing TYPE_ALIGN for array ref element size computation. */ | |
94 unsigned align : 6; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
95 /* Constant offset this op adds or -1 if it is variable. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
96 HOST_WIDE_INT off; |
0 | 97 tree type; |
98 tree op0; | |
99 tree op1; | |
100 tree op2; | |
101 } vn_reference_op_s; | |
102 typedef vn_reference_op_s *vn_reference_op_t; | |
103 typedef const vn_reference_op_s *const_vn_reference_op_t; | |
104 | |
111 | 105 inline unsigned |
106 vn_ref_op_align_unit (vn_reference_op_t op) | |
107 { | |
108 return op->align ? ((unsigned)1 << (op->align - 1)) / BITS_PER_UNIT : 0; | |
109 } | |
0 | 110 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
111 /* A reference operation in the hashtable is representation as |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
112 the vuse, representing the memory state at the time of |
0 | 113 the operation, and a collection of operands that make up the |
114 addressing calculation. If two vn_reference_t's have the same set | |
115 of operands, they access the same memory location. We also store | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
116 the resulting value number, and the hashcode. */ |
0 | 117 |
118 typedef struct vn_reference_s | |
119 { | |
120 /* Unique identifier that all expressions with the same value have. */ | |
121 unsigned int value_id; | |
122 hashval_t hashcode; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
123 tree vuse; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
124 alias_set_type set; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
125 tree type; |
111 | 126 vec<vn_reference_op_s> operands; |
0 | 127 tree result; |
111 | 128 tree result_vdef; |
0 | 129 } *vn_reference_t; |
130 typedef const struct vn_reference_s *const_vn_reference_t; | |
131 | |
132 typedef struct vn_constant_s | |
133 { | |
134 unsigned int value_id; | |
135 hashval_t hashcode; | |
136 tree constant; | |
137 } *vn_constant_t; | |
138 | |
111 | 139 enum vn_kind { VN_NONE, VN_CONSTANT, VN_NARY, VN_REFERENCE, VN_PHI }; |
140 enum vn_kind vn_get_stmt_kind (gimple *); | |
141 | |
142 /* Hash the type TYPE using bits that distinguishes it in the | |
143 types_compatible_p sense. */ | |
144 | |
145 static inline hashval_t | |
146 vn_hash_type (tree type) | |
147 { | |
148 return (INTEGRAL_TYPE_P (type) | |
149 + (INTEGRAL_TYPE_P (type) | |
150 ? TYPE_PRECISION (type) + TYPE_UNSIGNED (type) : 0)); | |
151 } | |
152 | |
0 | 153 /* Hash the constant CONSTANT with distinguishing type incompatible |
154 constants in the types_compatible_p sense. */ | |
155 | |
156 static inline hashval_t | |
157 vn_hash_constant_with_type (tree constant) | |
158 { | |
111 | 159 inchash::hash hstate; |
160 inchash::add_expr (constant, hstate); | |
161 hstate.merge_hash (vn_hash_type (TREE_TYPE (constant))); | |
162 return hstate.end (); | |
0 | 163 } |
164 | |
165 /* Compare the constants C1 and C2 with distinguishing type incompatible | |
166 constants in the types_compatible_p sense. */ | |
167 | |
168 static inline bool | |
169 vn_constant_eq_with_type (tree c1, tree c2) | |
170 { | |
171 return (expressions_equal_p (c1, c2) | |
172 && types_compatible_p (TREE_TYPE (c1), TREE_TYPE (c2))); | |
173 } | |
174 | |
175 typedef struct vn_ssa_aux | |
176 { | |
177 /* Value number. This may be an SSA name or a constant. */ | |
178 tree valnum; | |
111 | 179 /* Statements to insert if needs_insertion is true. */ |
180 gimple_seq expr; | |
181 | |
182 /* Saved SSA name info. */ | |
183 tree_ssa_name::ssa_name_info_type info; | |
0 | 184 |
185 /* Unique identifier that all expressions with the same value have. */ | |
186 unsigned int value_id; | |
187 | |
188 /* SCC information. */ | |
189 unsigned int dfsnum; | |
190 unsigned int low; | |
191 unsigned visited : 1; | |
192 unsigned on_sccstack : 1; | |
193 | |
194 /* Whether the SSA_NAME has been value numbered already. This is | |
195 only saying whether visit_use has been called on it at least | |
196 once. It cannot be used to avoid visitation for SSA_NAME's | |
197 involved in non-singleton SCC's. */ | |
198 unsigned use_processed : 1; | |
199 | |
200 /* Whether the SSA_NAME has no defining statement and thus an | |
201 insertion of such with EXPR as definition is required before | |
202 a use can be created of it. */ | |
203 unsigned needs_insertion : 1; | |
111 | 204 |
205 /* Whether range-info is anti-range. */ | |
206 unsigned range_info_anti_range_p : 1; | |
0 | 207 } *vn_ssa_aux_t; |
208 | |
111 | 209 enum vn_lookup_kind { VN_NOWALK, VN_WALK, VN_WALKREWRITE }; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
210 |
0 | 211 /* Return the value numbering info for an SSA_NAME. */ |
111 | 212 bool has_VN_INFO (tree); |
0 | 213 extern vn_ssa_aux_t VN_INFO (tree); |
214 extern vn_ssa_aux_t VN_INFO_GET (tree); | |
215 tree vn_get_expr_for (tree); | |
111 | 216 void run_scc_vn (vn_lookup_kind); |
217 unsigned int vn_eliminate (bitmap); | |
0 | 218 void free_scc_vn (void); |
111 | 219 void scc_vn_restore_ssa_info (void); |
0 | 220 tree vn_nary_op_lookup (tree, vn_nary_op_t *); |
111 | 221 tree vn_nary_op_lookup_stmt (gimple *, vn_nary_op_t *); |
0 | 222 tree vn_nary_op_lookup_pieces (unsigned int, enum tree_code, |
111 | 223 tree, tree *, vn_nary_op_t *); |
0 | 224 vn_nary_op_t vn_nary_op_insert (tree, tree); |
225 vn_nary_op_t vn_nary_op_insert_pieces (unsigned int, enum tree_code, | |
111 | 226 tree, tree *, tree, unsigned int); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
227 bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree, |
111 | 228 vec<vn_reference_op_s> ); |
229 vec<vn_reference_op_s> vn_reference_operands_for_lookup (tree); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
230 tree vn_reference_lookup_pieces (tree, alias_set_type, tree, |
111 | 231 vec<vn_reference_op_s> , |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
232 vn_reference_t *, vn_lookup_kind); |
111 | 233 tree vn_reference_lookup (tree, tree, vn_lookup_kind, vn_reference_t *, bool); |
234 void vn_reference_lookup_call (gcall *, vn_reference_t *, vn_reference_t); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
235 vn_reference_t vn_reference_insert_pieces (tree, alias_set_type, tree, |
111 | 236 vec<vn_reference_op_s> , |
0 | 237 tree, unsigned int); |
238 | |
111 | 239 bool vn_nary_op_eq (const_vn_nary_op_t const vno1, |
240 const_vn_nary_op_t const vno2); | |
0 | 241 bool vn_nary_may_trap (vn_nary_op_t); |
111 | 242 bool vn_reference_eq (const_vn_reference_t const, const_vn_reference_t const); |
0 | 243 unsigned int get_max_value_id (void); |
244 unsigned int get_next_value_id (void); | |
245 unsigned int get_constant_value_id (tree); | |
246 unsigned int get_or_alloc_constant_value_id (tree); | |
247 bool value_id_constant_p (unsigned 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
|
248 tree fully_constant_vn_reference_p (vn_reference_t); |
111 | 249 tree vn_nary_simplify (vn_nary_op_t); |
250 | |
251 /* Valueize NAME if it is an SSA name, otherwise just return it. */ | |
252 | |
253 static inline tree | |
254 vn_valueize (tree name) | |
255 { | |
256 if (TREE_CODE (name) == SSA_NAME) | |
257 { | |
258 tree tem = VN_INFO (name)->valnum; | |
259 return tem == VN_TOP ? name : tem; | |
260 } | |
261 return name; | |
262 } | |
263 | |
264 /* Get at the original range info for NAME. */ | |
265 | |
266 inline range_info_def * | |
267 VN_INFO_RANGE_INFO (tree name) | |
268 { | |
269 return (VN_INFO (name)->info.range_info | |
270 ? VN_INFO (name)->info.range_info | |
271 : SSA_NAME_RANGE_INFO (name)); | |
272 } | |
273 | |
274 /* Whether the original range info of NAME is an anti-range. */ | |
275 | |
276 inline bool | |
277 VN_INFO_ANTI_RANGE_P (tree name) | |
278 { | |
279 return (VN_INFO (name)->info.range_info | |
280 ? VN_INFO (name)->range_info_anti_range_p | |
281 : SSA_NAME_ANTI_RANGE_P (name)); | |
282 } | |
283 | |
284 /* Get at the original range info kind for NAME. */ | |
285 | |
286 inline value_range_type | |
287 VN_INFO_RANGE_TYPE (tree name) | |
288 { | |
289 return VN_INFO_ANTI_RANGE_P (name) ? VR_ANTI_RANGE : VR_RANGE; | |
290 } | |
291 | |
292 /* Get at the original pointer info for NAME. */ | |
293 | |
294 inline ptr_info_def * | |
295 VN_INFO_PTR_INFO (tree name) | |
296 { | |
297 return (VN_INFO (name)->info.ptr_info | |
298 ? VN_INFO (name)->info.ptr_info | |
299 : SSA_NAME_PTR_INFO (name)); | |
300 } | |
301 | |
0 | 302 #endif /* TREE_SSA_SCCVN_H */ |