Mercurial > hg > CbC > CbC_gcc
annotate gcc/ipa-reference.c @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
rev | line source |
---|---|
0 | 1 /* Callgraph based analysis of static variables. |
145 | 2 Copyright (C) 2004-2020 Free Software Foundation, Inc. |
0 | 3 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com> |
4 | |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify it under | |
8 the terms of the GNU General Public License as published by the Free | |
9 Software Foundation; either version 3, or (at your option) any later | |
10 version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 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 /* This file gathers information about how variables whose scope is | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
22 confined to the compilation unit are used. |
0 | 23 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
24 The transitive call site specific clobber effects are computed |
0 | 25 for the variables whose scope is contained within this compilation |
26 unit. | |
27 | |
28 First each function and static variable initialization is analyzed | |
29 to determine which local static variables are either read, written, | |
30 or have their address taken. Any local static that has its address | |
31 taken is removed from consideration. Once the local read and | |
32 writes are determined, a transitive closure of this information is | |
33 performed over the call graph to determine the worst case set of | |
34 side effects of each call. In later parts of the compiler, these | |
35 local and global sets are examined to make the call clobbering less | |
36 traumatic, promote some statics to registers, and improve aliasing | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
37 information. */ |
0 | 38 |
39 #include "config.h" | |
40 #include "system.h" | |
41 #include "coretypes.h" | |
111 | 42 #include "backend.h" |
0 | 43 #include "tree.h" |
111 | 44 #include "gimple.h" |
0 | 45 #include "tree-pass.h" |
111 | 46 #include "cgraph.h" |
47 #include "data-streamer.h" | |
48 #include "calls.h" | |
0 | 49 #include "ipa-utils.h" |
50 #include "ipa-reference.h" | |
145 | 51 #include "alloc-pool.h" |
131 | 52 #include "symbol-summary.h" |
0 | 53 |
54 /* The static variables defined within the compilation unit that are | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
55 loaded or stored directly by function that owns this structure. */ |
0 | 56 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
57 struct ipa_reference_local_vars_info_d |
0 | 58 { |
59 bitmap statics_read; | |
60 bitmap statics_written; | |
61 }; | |
62 | |
63 /* Statics that are read and written by some set of functions. The | |
64 local ones are based on the loads and stores local to the function. | |
65 The global ones are based on the local info as well as the | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
66 transitive closure of the functions that are called. */ |
0 | 67 |
68 struct ipa_reference_global_vars_info_d | |
69 { | |
70 bitmap statics_read; | |
71 bitmap statics_written; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
72 }; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
73 |
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
|
74 /* Information we save about every function after ipa-reference is completed. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
75 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
76 struct ipa_reference_optimization_summary_d |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
77 { |
145 | 78 bitmap statics_read; |
79 bitmap statics_written; | |
0 | 80 }; |
81 | |
131 | 82 typedef ipa_reference_local_vars_info_d *ipa_reference_local_vars_info_t; |
83 typedef ipa_reference_global_vars_info_d *ipa_reference_global_vars_info_t; | |
84 typedef ipa_reference_optimization_summary_d * | |
85 ipa_reference_optimization_summary_t; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
86 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
87 struct ipa_reference_vars_info_d |
0 | 88 { |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
89 struct ipa_reference_local_vars_info_d local; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
90 struct ipa_reference_global_vars_info_d global; |
0 | 91 }; |
92 | |
93 typedef struct ipa_reference_vars_info_d *ipa_reference_vars_info_t; | |
94 | |
145 | 95 /* This map contains all of the static variables that are |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
96 being considered by the compilation level alias analysis. */ |
145 | 97 typedef hash_map<tree, int> reference_vars_map_t; |
98 static reference_vars_map_t *ipa_reference_vars_map; | |
99 static int ipa_reference_vars_uids; | |
100 static vec<tree> *reference_vars_to_consider; | |
101 varpool_node_hook_list *varpool_node_hooks; | |
0 | 102 |
111 | 103 /* Set of all interesting module statics. A bit is set for every module |
104 static we are considering. This is added to the local info when asm | |
105 code is found that clobbers all memory. */ | |
0 | 106 static bitmap all_module_statics; |
145 | 107 /* Zero bitmap. */ |
108 static bitmap no_module_statics; | |
111 | 109 /* Set of all statics that should be ignored because they are touched by |
110 -fno-ipa-reference code. */ | |
111 static bitmap ignore_module_statics; | |
0 | 112 |
113 /* Obstack holding bitmaps of local analysis (live from analysis to | |
114 propagation) */ | |
115 static bitmap_obstack local_info_obstack; | |
116 /* Obstack holding global analysis live forever. */ | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
117 static bitmap_obstack optimization_summary_obstack; |
0 | 118 |
145 | 119 class ipa_ref_var_info_summary_t: public fast_function_summary |
120 <ipa_reference_vars_info_d *, va_heap> | |
131 | 121 { |
122 public: | |
123 ipa_ref_var_info_summary_t (symbol_table *symtab): | |
145 | 124 fast_function_summary <ipa_reference_vars_info_d *, va_heap> (symtab) {} |
131 | 125 }; |
126 | |
127 static ipa_ref_var_info_summary_t *ipa_ref_var_info_summaries = NULL; | |
0 | 128 |
145 | 129 class ipa_ref_opt_summary_t: public fast_function_summary |
130 <ipa_reference_optimization_summary_d *, va_heap> | |
131 | 131 { |
132 public: | |
133 ipa_ref_opt_summary_t (symbol_table *symtab): | |
145 | 134 fast_function_summary <ipa_reference_optimization_summary_d *, va_heap> (symtab) {} |
111 | 135 |
131 | 136 virtual void remove (cgraph_node *src_node, |
137 ipa_reference_optimization_summary_d *data); | |
138 virtual void duplicate (cgraph_node *src_node, cgraph_node *dst_node, | |
139 ipa_reference_optimization_summary_d *src_data, | |
140 ipa_reference_optimization_summary_d *dst_data); | |
141 }; | |
142 | |
143 static ipa_ref_opt_summary_t *ipa_ref_opt_sum_summaries = NULL; | |
0 | 144 |
145 | 145 /* Return ID used by ipa-reference bitmaps. -1 if failed. */ |
146 int | |
147 ipa_reference_var_uid (tree t) | |
148 { | |
149 if (!ipa_reference_vars_map) | |
150 return -1; | |
151 int *id = ipa_reference_vars_map->get | |
152 (symtab_node::get (t)->ultimate_alias_target (NULL)->decl); | |
153 if (!id) | |
154 return -1; | |
155 return *id; | |
156 } | |
157 | |
158 /* Return ID used by ipa-reference bitmaps. Create new entry if | |
159 T is not in map. Set EXISTED accordinly */ | |
160 int | |
161 ipa_reference_var_get_or_insert_uid (tree t, bool *existed) | |
162 { | |
163 int &id = ipa_reference_vars_map->get_or_insert | |
164 (symtab_node::get (t)->ultimate_alias_target (NULL)->decl, existed); | |
165 if (!*existed) | |
166 id = ipa_reference_vars_uids++; | |
167 return id; | |
168 } | |
169 | |
0 | 170 /* Return the ipa_reference_vars structure starting from the cgraph NODE. */ |
171 static inline ipa_reference_vars_info_t | |
172 get_reference_vars_info (struct cgraph_node *node) | |
173 { | |
131 | 174 if (ipa_ref_var_info_summaries == NULL) |
0 | 175 return NULL; |
131 | 176 |
177 ipa_reference_vars_info_t v = ipa_ref_var_info_summaries->get (node); | |
178 return v == NULL ? NULL : v; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
179 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
180 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
181 /* Return the ipa_reference_vars structure starting from the cgraph NODE. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
182 static inline ipa_reference_optimization_summary_t |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
183 get_reference_optimization_summary (struct cgraph_node *node) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
184 { |
131 | 185 if (ipa_ref_opt_sum_summaries == NULL) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
186 return NULL; |
0 | 187 |
131 | 188 ipa_reference_optimization_summary_t v |
189 = ipa_ref_opt_sum_summaries->get (node); | |
0 | 190 |
131 | 191 return v == NULL ? NULL : v; |
0 | 192 } |
193 | |
111 | 194 /* Return a bitmap indexed by ipa_reference_var_uid for the static variables |
195 that are *not* read during the execution of the function FN. Returns | |
0 | 196 NULL if no data is available. */ |
197 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
198 bitmap |
145 | 199 ipa_reference_get_read_global (struct cgraph_node *fn) |
0 | 200 { |
111 | 201 if (!opt_for_fn (current_function_decl, flag_ipa_reference)) |
202 return NULL; | |
203 | |
204 enum availability avail; | |
205 struct cgraph_node *fn2 = fn->function_symbol (&avail); | |
206 ipa_reference_optimization_summary_t info = | |
207 get_reference_optimization_summary (fn2); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
208 |
111 | 209 if (info |
210 && (avail >= AVAIL_AVAILABLE | |
211 || (avail == AVAIL_INTERPOSABLE | |
212 && flags_from_decl_or_type (fn->decl) & ECF_LEAF)) | |
213 && opt_for_fn (fn2->decl, flag_ipa_reference)) | |
145 | 214 return info->statics_read; |
111 | 215 else if (avail == AVAIL_NOT_AVAILABLE |
216 && flags_from_decl_or_type (fn->decl) & ECF_LEAF) | |
145 | 217 return no_module_statics; |
0 | 218 else |
219 return NULL; | |
220 } | |
221 | |
111 | 222 /* Return a bitmap indexed by ipa_reference_var_uid for the static variables |
223 that are *not* written during the execution of the function FN. Note | |
0 | 224 that variables written may or may not be read during the function |
225 call. Returns NULL if no data is available. */ | |
226 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
227 bitmap |
145 | 228 ipa_reference_get_written_global (struct cgraph_node *fn) |
0 | 229 { |
111 | 230 if (!opt_for_fn (current_function_decl, flag_ipa_reference)) |
231 return NULL; | |
232 | |
233 enum availability avail; | |
234 struct cgraph_node *fn2 = fn->function_symbol (&avail); | |
235 ipa_reference_optimization_summary_t info = | |
236 get_reference_optimization_summary (fn2); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
237 |
111 | 238 if (info |
239 && (avail >= AVAIL_AVAILABLE | |
240 || (avail == AVAIL_INTERPOSABLE | |
241 && flags_from_decl_or_type (fn->decl) & ECF_LEAF)) | |
242 && opt_for_fn (fn2->decl, flag_ipa_reference)) | |
145 | 243 return info->statics_written; |
111 | 244 else if (avail == AVAIL_NOT_AVAILABLE |
245 && flags_from_decl_or_type (fn->decl) & ECF_LEAF) | |
145 | 246 return no_module_statics; |
0 | 247 else |
248 return NULL; | |
249 } | |
250 | |
251 | |
111 | 252 /* Hepler for is_proper_for_analysis. */ |
253 static bool | |
254 is_improper (symtab_node *n, void *v ATTRIBUTE_UNUSED) | |
0 | 255 { |
111 | 256 tree t = n->decl; |
257 /* If the variable has the "used" attribute, treat it as if it had a | |
258 been touched by the devil. */ | |
259 if (DECL_PRESERVE_P (t)) | |
260 return true; | |
261 | |
262 /* Do not want to do anything with volatile except mark any | |
263 function that uses one to be not const or pure. */ | |
264 if (TREE_THIS_VOLATILE (t)) | |
265 return true; | |
266 | |
267 /* We do not need to analyze readonly vars, we already know they do not | |
268 alias. */ | |
269 if (TREE_READONLY (t)) | |
270 return true; | |
271 | |
145 | 272 /* We cannot track variables with address taken. */ |
111 | 273 if (TREE_ADDRESSABLE (t)) |
274 return true; | |
275 | |
276 /* TODO: We could track public variables that are not addressable, but | |
277 currently frontends don't give us those. */ | |
278 if (TREE_PUBLIC (t)) | |
279 return true; | |
280 | |
281 return false; | |
0 | 282 } |
283 | |
284 /* Return true if the variable T is the right kind of static variable to | |
285 perform compilation unit scope escape analysis. */ | |
286 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
287 static inline 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
|
288 is_proper_for_analysis (tree t) |
0 | 289 { |
145 | 290 int id = ipa_reference_var_uid (t); |
291 | |
292 if (id != -1 && bitmap_bit_p (ignore_module_statics, id)) | |
0 | 293 return false; |
294 | |
111 | 295 if (symtab_node::get (t) |
296 ->call_for_symbol_and_aliases (is_improper, NULL, true)) | |
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
|
297 return false; |
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
|
298 |
0 | 299 return true; |
300 } | |
301 | |
302 /* Lookup the tree node for the static variable that has UID and | |
303 convert the name to a string for debugging. */ | |
304 | |
305 static const char * | |
306 get_static_name (int index) | |
307 { | |
145 | 308 return fndecl_name ((*reference_vars_to_consider)[index]); |
111 | 309 } |
310 | |
311 /* Dump a set of static vars to FILE. */ | |
312 static void | |
313 dump_static_vars_set_to_file (FILE *f, bitmap set) | |
314 { | |
315 unsigned int index; | |
316 bitmap_iterator bi; | |
317 if (set == NULL) | |
318 return; | |
319 else if (set == all_module_statics) | |
320 fprintf (f, "ALL"); | |
145 | 321 else if (set == no_module_statics) |
322 fprintf (f, "NO"); | |
111 | 323 else |
324 EXECUTE_IF_SET_IN_BITMAP (set, 0, index, bi) | |
325 { | |
326 fprintf (f, "%s ", get_static_name (index)); | |
327 } | |
0 | 328 } |
329 | |
111 | 330 /* Compute X |= Y, taking into account the possibility that |
331 either X or Y is already the maximum set. | |
332 Return true if X is the maximum set after taking the union with Y. */ | |
333 | |
334 static bool | |
335 union_static_var_sets (bitmap &x, bitmap y) | |
336 { | |
337 if (x != all_module_statics) | |
338 { | |
339 if (y == all_module_statics) | |
340 { | |
341 BITMAP_FREE (x); | |
342 x = all_module_statics; | |
343 } | |
344 else if (bitmap_ior_into (x, y)) | |
345 { | |
346 /* The union may have reduced X to the maximum set. | |
347 In that case, we want to make that visible explicitly. | |
348 Even though bitmap_equal_p can be very expensive, it | |
349 turns out to be an overall win to check this here for | |
350 an LTO bootstrap of GCC itself. Liberally extrapoliate | |
351 that result to be applicable to all cases. */ | |
352 if (bitmap_equal_p (x, all_module_statics)) | |
353 { | |
354 BITMAP_FREE (x); | |
355 x = all_module_statics; | |
356 } | |
357 } | |
358 } | |
359 return x == all_module_statics; | |
360 } | |
361 | |
362 /* Return a copy of SET on the bitmap obstack containing SET. | |
363 But if SET is NULL or the maximum set, return that instead. */ | |
364 | |
365 static bitmap | |
145 | 366 copy_static_var_set (bitmap set, bool for_propagation) |
111 | 367 { |
368 if (set == NULL || set == all_module_statics) | |
369 return set; | |
145 | 370 if (!for_propagation && set == no_module_statics) |
371 return set; | |
111 | 372 bitmap_obstack *o = set->obstack; |
373 gcc_checking_assert (o); | |
374 bitmap copy = BITMAP_ALLOC (o); | |
375 bitmap_copy (copy, set); | |
376 return copy; | |
377 } | |
378 | |
379 /* Compute the union all of the statics read and written by every callee of X | |
380 into X_GLOBAL->statics_read and X_GLOBAL->statics_written. X_GLOBAL is | |
381 actually the set representing the cycle containing X. If the read and | |
382 written sets of X_GLOBAL has been reduced to the maximum set, we don't | |
383 have to look at the remaining callees. */ | |
0 | 384 |
385 static void | |
386 propagate_bits (ipa_reference_global_vars_info_t x_global, struct cgraph_node *x) | |
387 { | |
388 struct cgraph_edge *e; | |
111 | 389 bool read_all = x_global->statics_read == all_module_statics; |
390 bool write_all = x_global->statics_written == all_module_statics; | |
391 for (e = x->callees; | |
392 e && !(read_all && write_all); | |
393 e = e->next_callee) | |
0 | 394 { |
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
|
395 enum availability avail; |
111 | 396 struct cgraph_node *y = e->callee->function_symbol (&avail); |
397 if (!y) | |
398 continue; | |
0 | 399 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
400 /* Only look into nodes we can propagate something. */ |
111 | 401 int flags = flags_from_decl_or_type (y->decl); |
402 if (opt_for_fn (y->decl, flag_ipa_reference) | |
403 && (avail > AVAIL_INTERPOSABLE | |
404 || (avail == AVAIL_INTERPOSABLE && (flags & ECF_LEAF)))) | |
0 | 405 { |
406 if (get_reference_vars_info (y)) | |
407 { | |
111 | 408 ipa_reference_vars_info_t y_info = get_reference_vars_info (y); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
409 ipa_reference_global_vars_info_t y_global = &y_info->global; |
0 | 410 |
111 | 411 /* Calls in the current cycle do not have their global set |
412 computed yet (but everything else does because we're | |
413 visiting nodes in topological order). */ | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
414 if (!y_global->statics_read) |
0 | 415 continue; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
416 |
111 | 417 /* If the function is const, it reads no memory even if it |
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
|
418 seems so to local analysis. */ |
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
|
419 if (flags & ECF_CONST) |
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
|
420 continue; |
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
|
421 |
111 | 422 union_static_var_sets (x_global->statics_read, |
0 | 423 y_global->statics_read); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
424 |
111 | 425 /* If the function is pure, it has no stores even if it |
426 seems so to local analysis. If we cannot return from | |
427 the function, we can safely ignore the call. */ | |
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
|
428 if ((flags & ECF_PURE) |
111 | 429 || e->cannot_lead_to_return_p ()) |
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
|
430 continue; |
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
|
431 |
111 | 432 union_static_var_sets (x_global->statics_written, |
0 | 433 y_global->statics_written); |
434 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
435 else |
0 | 436 gcc_unreachable (); |
437 } | |
438 } | |
439 } | |
440 | |
145 | 441 /* Delete NODE from map. */ |
442 | |
443 static void | |
444 varpool_removal_hook (varpool_node *node, void *) | |
445 { | |
446 ipa_reference_vars_map->remove (node->decl); | |
447 } | |
448 | |
111 | 449 static bool ipa_init_p = false; |
450 | |
0 | 451 /* The init routine for analyzing global static variable usage. See |
452 comments at top for description. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
453 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
454 ipa_init (void) |
0 | 455 { |
111 | 456 if (ipa_init_p) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
457 return; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
458 |
111 | 459 ipa_init_p = true; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
460 |
145 | 461 vec_alloc (reference_vars_to_consider, 10); |
0 | 462 |
131 | 463 |
464 if (ipa_ref_opt_sum_summaries != NULL) | |
465 { | |
466 delete ipa_ref_opt_sum_summaries; | |
467 ipa_ref_opt_sum_summaries = NULL; | |
145 | 468 delete ipa_reference_vars_map; |
131 | 469 } |
145 | 470 ipa_reference_vars_map = new reference_vars_map_t(257); |
471 varpool_node_hooks | |
472 = symtab->add_varpool_removal_hook (varpool_removal_hook, NULL); | |
473 ipa_reference_vars_uids = 0; | |
474 | |
475 bitmap_obstack_initialize (&local_info_obstack); | |
476 bitmap_obstack_initialize (&optimization_summary_obstack); | |
477 all_module_statics = BITMAP_ALLOC (&optimization_summary_obstack); | |
478 no_module_statics = BITMAP_ALLOC (&optimization_summary_obstack); | |
479 ignore_module_statics = BITMAP_ALLOC (&optimization_summary_obstack); | |
480 | |
481 if (ipa_ref_var_info_summaries == NULL) | |
482 ipa_ref_var_info_summaries = new ipa_ref_var_info_summary_t (symtab); | |
0 | 483 } |
484 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
485 |
0 | 486 /* Set up the persistent info for FN. */ |
487 | |
488 static ipa_reference_local_vars_info_t | |
489 init_function_info (struct cgraph_node *fn) | |
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 ipa_reference_vars_info_t info |
131 | 492 = ipa_ref_var_info_summaries->get_create (fn); |
0 | 493 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
494 info->local.statics_read = BITMAP_ALLOC (&local_info_obstack); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
495 info->local.statics_written = BITMAP_ALLOC (&local_info_obstack); |
145 | 496 info->global.statics_read = NULL; |
0 | 497 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
498 return &info->local; |
0 | 499 } |
500 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
501 |
0 | 502 /* This is the main routine for finding the reference patterns for |
503 global variables within a function FN. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
504 |
0 | 505 static void |
506 analyze_function (struct cgraph_node *fn) | |
507 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
508 ipa_reference_local_vars_info_t local; |
111 | 509 struct ipa_ref *ref = NULL; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
510 int i; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
511 tree var; |
0 | 512 |
111 | 513 if (!opt_for_fn (fn->decl, flag_ipa_reference)) |
514 return; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
515 local = init_function_info (fn); |
111 | 516 for (i = 0; fn->iterate_reference (i, ref); i++) |
0 | 517 { |
145 | 518 int id; |
519 bool existed; | |
111 | 520 if (!is_a <varpool_node *> (ref->referred)) |
521 continue; | |
522 var = ref->referred->decl; | |
523 if (!is_proper_for_analysis (var)) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
524 continue; |
111 | 525 /* This is a variable we care about. Check if we have seen it |
526 before, and if not add it the set of variables we care about. */ | |
145 | 527 id = ipa_reference_var_get_or_insert_uid (var, &existed); |
528 if (!existed) | |
111 | 529 { |
145 | 530 bitmap_set_bit (all_module_statics, id); |
111 | 531 if (dump_file) |
145 | 532 reference_vars_to_consider->safe_push (var); |
111 | 533 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
534 switch (ref->use) |
0 | 535 { |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
536 case IPA_REF_LOAD: |
145 | 537 bitmap_set_bit (local->statics_read, id); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
538 break; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
539 case IPA_REF_STORE: |
111 | 540 if (ref->cannot_lead_to_return ()) |
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
|
541 break; |
145 | 542 bitmap_set_bit (local->statics_written, id); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
543 break; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
544 case IPA_REF_ADDR: |
111 | 545 break; |
546 default: | |
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
|
547 gcc_unreachable (); |
0 | 548 } |
549 } | |
550 | |
111 | 551 if (fn->cannot_return_p ()) |
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
|
552 bitmap_clear (local->statics_written); |
0 | 553 } |
554 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
555 |
0 | 556 /* Called when new clone is inserted to callgraph late. */ |
557 | |
131 | 558 void |
559 ipa_ref_opt_summary_t::duplicate (cgraph_node *, cgraph_node *, | |
560 ipa_reference_optimization_summary_d *ginfo, | |
561 ipa_reference_optimization_summary_d | |
562 *dst_ginfo) | |
0 | 563 { |
145 | 564 dst_ginfo->statics_read = |
565 copy_static_var_set (ginfo->statics_read, false); | |
566 dst_ginfo->statics_written = | |
567 copy_static_var_set (ginfo->statics_written, false); | |
0 | 568 } |
569 | |
570 /* Called when node is removed. */ | |
571 | |
131 | 572 void |
573 ipa_ref_opt_summary_t::remove (cgraph_node *, | |
574 ipa_reference_optimization_summary_d *ginfo) | |
0 | 575 { |
145 | 576 if (ginfo->statics_read |
577 && ginfo->statics_read != all_module_statics | |
578 && ginfo->statics_read != no_module_statics) | |
579 BITMAP_FREE (ginfo->statics_read); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
580 |
145 | 581 if (ginfo->statics_written |
582 && ginfo->statics_written != all_module_statics | |
583 && ginfo->statics_written != no_module_statics) | |
584 BITMAP_FREE (ginfo->statics_written); | |
0 | 585 } |
586 | |
587 /* Analyze each function in the cgraph to see which global or statics | |
588 are read or written. */ | |
589 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
590 static void |
0 | 591 generate_summary (void) |
592 { | |
593 struct cgraph_node *node; | |
594 unsigned int index; | |
595 bitmap_iterator bi; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
596 |
0 | 597 ipa_init (); |
598 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
599 /* Process all of the functions next. */ |
111 | 600 FOR_EACH_DEFINED_FUNCTION (node) |
601 if (!node->alias && !opt_for_fn (node->decl, flag_ipa_reference)) | |
602 { | |
603 struct ipa_ref *ref = NULL; | |
604 int i; | |
605 tree var; | |
606 for (i = 0; node->iterate_reference (i, ref); i++) | |
607 { | |
608 if (!is_a <varpool_node *> (ref->referred)) | |
609 continue; | |
610 var = ref->referred->decl; | |
611 if (!is_proper_for_analysis (var)) | |
612 continue; | |
613 bitmap_set_bit (ignore_module_statics, ipa_reference_var_uid (var)); | |
614 } | |
615 } | |
616 FOR_EACH_DEFINED_FUNCTION (node) | |
617 analyze_function (node); | |
0 | 618 |
619 if (dump_file) | |
620 EXECUTE_IF_SET_IN_BITMAP (all_module_statics, 0, index, bi) | |
621 { | |
111 | 622 fprintf (dump_file, "\nPromotable global:%s (uid=%u)\n", |
623 get_static_name (index), index); | |
0 | 624 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
625 |
0 | 626 if (dump_file) |
111 | 627 FOR_EACH_DEFINED_FUNCTION (node) |
628 if (node->get_availability () >= AVAIL_INTERPOSABLE | |
629 && opt_for_fn (node->decl, flag_ipa_reference)) | |
0 | 630 { |
631 ipa_reference_local_vars_info_t l; | |
632 unsigned int index; | |
633 bitmap_iterator bi; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
634 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
635 l = &get_reference_vars_info (node)->local; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
636 fprintf (dump_file, |
111 | 637 "\nFunction name:%s:", node->dump_name ()); |
0 | 638 fprintf (dump_file, "\n locals read: "); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
639 if (l->statics_read) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
640 EXECUTE_IF_SET_IN_BITMAP (l->statics_read, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
641 0, index, bi) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
642 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
643 fprintf (dump_file, "%s ", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
644 get_static_name (index)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
645 } |
0 | 646 fprintf (dump_file, "\n locals written: "); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
647 if (l->statics_written) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
648 EXECUTE_IF_SET_IN_BITMAP (l->statics_written, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
649 0, index, bi) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
650 { |
111 | 651 fprintf (dump_file, "%s ", get_static_name (index)); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
652 } |
0 | 653 } |
654 } | |
655 | |
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
|
656 /* Set READ_ALL/WRITE_ALL based on decl flags of NODE. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
657 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
658 static void |
111 | 659 read_write_all_from_decl (struct cgraph_node *node, |
660 bool &read_all, bool &write_all) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
661 { |
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
|
662 tree decl = node->decl; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
663 int flags = flags_from_decl_or_type (decl); |
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
|
664 if ((flags & ECF_LEAF) |
111 | 665 && node->get_availability () < AVAIL_INTERPOSABLE) |
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
|
666 ; |
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
|
667 else if (flags & ECF_CONST) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
668 ; |
111 | 669 else if ((flags & ECF_PURE) || node->cannot_return_p ()) |
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
|
670 { |
111 | 671 read_all = true; |
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
|
672 if (dump_file && (dump_flags & TDF_DETAILS)) |
111 | 673 fprintf (dump_file, " %s -> read all\n", node->dump_name ()); |
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
|
674 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
675 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
676 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
677 /* TODO: To be able to produce sane results, we should also handle |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
678 common builtins, in particular throw. */ |
111 | 679 read_all = true; |
680 write_all = true; | |
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
|
681 if (dump_file && (dump_flags & TDF_DETAILS)) |
111 | 682 fprintf (dump_file, " %s -> read all, write all\n", |
683 node->dump_name ()); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
684 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
685 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
686 |
111 | 687 /* Set READ_ALL/WRITE_ALL based on decl flags of NODE or any member |
688 in the cycle of NODE. */ | |
689 | |
690 static void | |
691 get_read_write_all_from_node (struct cgraph_node *node, | |
692 bool &read_all, bool &write_all) | |
693 { | |
694 struct cgraph_edge *e, *ie; | |
695 | |
145 | 696 /* When function is overwritable, we cannot assume anything. */ |
111 | 697 if (node->get_availability () <= AVAIL_INTERPOSABLE |
698 || (node->analyzed && !opt_for_fn (node->decl, flag_ipa_reference))) | |
699 read_write_all_from_decl (node, read_all, write_all); | |
700 | |
701 for (e = node->callees; | |
702 e && !(read_all && write_all); | |
703 e = e->next_callee) | |
704 { | |
705 enum availability avail; | |
706 struct cgraph_node *callee = e->callee->function_symbol (&avail); | |
707 gcc_checking_assert (callee); | |
708 if (avail <= AVAIL_INTERPOSABLE | |
131 | 709 || (callee->analyzed && !opt_for_fn (callee->decl, |
710 flag_ipa_reference))) | |
111 | 711 read_write_all_from_decl (callee, read_all, write_all); |
712 } | |
713 | |
714 for (ie = node->indirect_calls; | |
715 ie && !(read_all && write_all); | |
716 ie = ie->next_callee) | |
717 if (!(ie->indirect_info->ecf_flags & ECF_CONST)) | |
718 { | |
719 read_all = true; | |
720 if (dump_file && (dump_flags & TDF_DETAILS)) | |
721 fprintf (dump_file, " indirect call -> read all\n"); | |
722 if (!ie->cannot_lead_to_return_p () | |
723 && !(ie->indirect_info->ecf_flags & ECF_PURE)) | |
724 { | |
725 if (dump_file && (dump_flags & TDF_DETAILS)) | |
726 fprintf (dump_file, " indirect call -> write all\n"); | |
727 write_all = true; | |
728 } | |
729 } | |
730 } | |
731 | |
145 | 732 /* Skip edges from and to nodes without ipa_reference enabled. |
733 Ignore not available symbols. This leave | |
734 them out of strongly connected components and makes them easy to skip in the | |
111 | 735 propagation loop bellow. */ |
736 | |
737 static bool | |
738 ignore_edge_p (cgraph_edge *e) | |
739 { | |
145 | 740 enum availability avail; |
741 cgraph_node *ultimate_target | |
742 = e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); | |
743 | |
744 return (avail < AVAIL_INTERPOSABLE | |
745 || (avail == AVAIL_INTERPOSABLE | |
746 && !(flags_from_decl_or_type (e->callee->decl) & ECF_LEAF)) | |
747 || !opt_for_fn (e->caller->decl, flag_ipa_reference) | |
748 || !opt_for_fn (ultimate_target->decl, flag_ipa_reference)); | |
111 | 749 } |
750 | |
0 | 751 /* Produce the global information by preforming a transitive closure |
111 | 752 on the local information that was produced by ipa_analyze_function. */ |
0 | 753 |
754 static unsigned int | |
755 propagate (void) | |
756 { | |
757 struct cgraph_node *node; | |
758 struct cgraph_node **order = | |
111 | 759 XCNEWVEC (struct cgraph_node *, symtab->cgraph_count); |
760 int order_pos; | |
0 | 761 int i; |
111 | 762 bool remove_p; |
0 | 763 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
764 if (dump_file) |
111 | 765 cgraph_node::dump_cgraph (dump_file); |
0 | 766 |
145 | 767 remove_p = ipa_discover_variable_flags (); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
768 generate_summary (); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
769 |
111 | 770 /* Propagate the local information through the call graph to produce |
0 | 771 the global information. All the nodes within a cycle will have |
772 the same info so we collapse cycles first. Then we can do the | |
773 propagation in one pass from the leaves to the roots. */ | |
145 | 774 order_pos = ipa_reduced_postorder (order, true, ignore_edge_p); |
0 | 775 if (dump_file) |
111 | 776 ipa_print_order (dump_file, "reduced", order, order_pos); |
0 | 777 |
778 for (i = 0; i < order_pos; i++ ) | |
779 { | |
111 | 780 unsigned x; |
781 struct cgraph_node *w; | |
0 | 782 ipa_reference_vars_info_t node_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
|
783 ipa_reference_global_vars_info_t node_g; |
0 | 784 ipa_reference_local_vars_info_t node_l; |
111 | 785 bool read_all = false; |
786 bool write_all = false; | |
0 | 787 |
788 node = order[i]; | |
111 | 789 if (node->alias || !opt_for_fn (node->decl, flag_ipa_reference)) |
790 continue; | |
791 | |
0 | 792 node_info = get_reference_vars_info (node); |
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
|
793 gcc_assert (node_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
|
794 node_l = &node_info->local; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
795 node_g = &node_info->global; |
0 | 796 |
111 | 797 if (dump_file && (dump_flags & TDF_DETAILS)) |
798 fprintf (dump_file, "Starting cycle with %s\n", node->dump_name ()); | |
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
|
799 |
111 | 800 vec<cgraph_node *> cycle_nodes = ipa_get_nodes_in_cycle (node); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
801 |
111 | 802 /* If any node in a cycle is read_all or write_all, they all are. */ |
803 FOR_EACH_VEC_ELT (cycle_nodes, x, w) | |
0 | 804 { |
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
|
805 if (dump_file && (dump_flags & TDF_DETAILS)) |
111 | 806 fprintf (dump_file, " Visiting %s\n", w->dump_asm_name ()); |
807 get_read_write_all_from_node (w, read_all, write_all); | |
808 if (read_all && write_all) | |
809 break; | |
0 | 810 } |
811 | |
111 | 812 /* Initialized the bitmaps global sets for the reduced node. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
813 if (read_all) |
0 | 814 node_g->statics_read = all_module_statics; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
815 else |
145 | 816 node_g->statics_read = copy_static_var_set (node_l->statics_read, true); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
817 if (write_all) |
0 | 818 node_g->statics_written = all_module_statics; |
819 else | |
145 | 820 node_g->statics_written |
821 = copy_static_var_set (node_l->statics_written, true); | |
0 | 822 |
111 | 823 /* Merge the sets of this cycle with all sets of callees reached |
824 from this cycle. */ | |
825 FOR_EACH_VEC_ELT (cycle_nodes, x, w) | |
0 | 826 { |
111 | 827 if (read_all && write_all) |
828 break; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
829 |
111 | 830 if (w != node) |
831 { | |
832 ipa_reference_vars_info_t w_ri = get_reference_vars_info (w); | |
833 ipa_reference_local_vars_info_t w_l = &w_ri->local; | |
834 int flags = flags_from_decl_or_type (w->decl); | |
835 | |
836 if (!(flags & ECF_CONST)) | |
837 read_all = union_static_var_sets (node_g->statics_read, | |
838 w_l->statics_read); | |
839 if (!(flags & ECF_PURE) | |
840 && !w->cannot_return_p ()) | |
841 write_all = union_static_var_sets (node_g->statics_written, | |
842 w_l->statics_written); | |
843 } | |
844 | |
0 | 845 propagate_bits (node_g, w); |
846 } | |
847 | |
848 /* All nodes within a cycle have the same global info bitmaps. */ | |
111 | 849 FOR_EACH_VEC_ELT (cycle_nodes, x, w) |
0 | 850 { |
111 | 851 ipa_reference_vars_info_t w_ri = get_reference_vars_info (w); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
852 w_ri->global = *node_g; |
111 | 853 } |
0 | 854 |
111 | 855 cycle_nodes.release (); |
0 | 856 } |
857 | |
858 if (dump_file) | |
859 { | |
111 | 860 for (i = 0; i < order_pos; i++) |
0 | 861 { |
111 | 862 unsigned x; |
863 struct cgraph_node *w; | |
0 | 864 |
865 node = order[i]; | |
111 | 866 if (node->alias || !opt_for_fn (node->decl, flag_ipa_reference)) |
867 continue; | |
868 | |
869 fprintf (dump_file, "\nFunction name:%s:", node->dump_asm_name ()); | |
870 | |
871 ipa_reference_vars_info_t node_info = get_reference_vars_info (node); | |
872 ipa_reference_global_vars_info_t node_g = &node_info->global; | |
0 | 873 |
111 | 874 vec<cgraph_node *> cycle_nodes = ipa_get_nodes_in_cycle (node); |
875 FOR_EACH_VEC_ELT (cycle_nodes, x, w) | |
0 | 876 { |
111 | 877 ipa_reference_vars_info_t w_ri = get_reference_vars_info (w); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
878 ipa_reference_local_vars_info_t w_l = &w_ri->local; |
111 | 879 if (w != node) |
880 fprintf (dump_file, "\n next cycle: %s ", w->dump_asm_name ()); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
881 fprintf (dump_file, "\n locals read: "); |
111 | 882 dump_static_vars_set_to_file (dump_file, w_l->statics_read); |
0 | 883 fprintf (dump_file, "\n locals written: "); |
111 | 884 dump_static_vars_set_to_file (dump_file, w_l->statics_written); |
0 | 885 } |
111 | 886 cycle_nodes.release (); |
887 | |
0 | 888 fprintf (dump_file, "\n globals read: "); |
111 | 889 dump_static_vars_set_to_file (dump_file, node_g->statics_read); |
0 | 890 fprintf (dump_file, "\n globals written: "); |
111 | 891 dump_static_vars_set_to_file (dump_file, node_g->statics_written); |
892 fprintf (dump_file, "\n"); | |
0 | 893 } |
894 } | |
895 | |
131 | 896 if (ipa_ref_opt_sum_summaries == NULL) |
897 ipa_ref_opt_sum_summaries = new ipa_ref_opt_summary_t (symtab); | |
898 | |
0 | 899 /* Cleanup. */ |
111 | 900 FOR_EACH_DEFINED_FUNCTION (node) |
0 | 901 { |
902 ipa_reference_vars_info_t node_info; | |
903 ipa_reference_global_vars_info_t node_g; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
904 |
145 | 905 /* No need to produce summaries for inline clones. */ |
906 if (node->inlined_to) | |
907 continue; | |
908 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
909 node_info = get_reference_vars_info (node); |
145 | 910 if (!node->alias && opt_for_fn (node->decl, flag_ipa_reference)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
911 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
912 node_g = &node_info->global; |
145 | 913 bool read_all = |
914 (node_g->statics_read == all_module_statics | |
915 || bitmap_equal_p (node_g->statics_read, all_module_statics)); | |
916 bool written_all = | |
917 (node_g->statics_written == all_module_statics | |
918 || bitmap_equal_p (node_g->statics_written, | |
919 all_module_statics)); | |
920 | |
921 /* There is no need to produce summary if we collected nothing | |
922 useful. */ | |
923 if (read_all && written_all) | |
924 continue; | |
0 | 925 |
131 | 926 ipa_reference_optimization_summary_d *opt |
927 = ipa_ref_opt_sum_summaries->get_create (node); | |
0 | 928 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
929 /* Create the complimentary sets. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
930 |
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
|
931 if (bitmap_empty_p (node_g->statics_read)) |
145 | 932 opt->statics_read = no_module_statics; |
933 else if (read_all) | |
934 opt->statics_read = all_module_statics; | |
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
|
935 else |
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
|
936 { |
145 | 937 opt->statics_read |
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
|
938 = BITMAP_ALLOC (&optimization_summary_obstack); |
145 | 939 bitmap_copy (opt->statics_read, node_g->statics_read); |
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
|
940 } |
0 | 941 |
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
|
942 if (bitmap_empty_p (node_g->statics_written)) |
145 | 943 opt->statics_written = no_module_statics; |
944 else if (written_all) | |
945 opt->statics_written = all_module_statics; | |
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
|
946 else |
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
|
947 { |
145 | 948 opt->statics_written |
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
|
949 = BITMAP_ALLOC (&optimization_summary_obstack); |
145 | 950 bitmap_copy (opt->statics_written, node_g->statics_written); |
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
|
951 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
952 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
953 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
954 |
111 | 955 ipa_free_postorder_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
|
956 free (order); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
957 |
0 | 958 bitmap_obstack_release (&local_info_obstack); |
131 | 959 |
145 | 960 if (ipa_ref_var_info_summaries != NULL) |
131 | 961 { |
962 delete ipa_ref_var_info_summaries; | |
963 ipa_ref_var_info_summaries = NULL; | |
964 } | |
965 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
966 if (dump_file) |
145 | 967 vec_free (reference_vars_to_consider); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
968 reference_vars_to_consider = NULL; |
111 | 969 return remove_p ? TODO_remove_functions : 0; |
0 | 970 } |
971 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
972 /* Return true if we need to write summary of NODE. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
973 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
974 static bool |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
975 write_node_summary_p (struct cgraph_node *node, |
111 | 976 lto_symtab_encoder_t encoder, |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
977 bitmap ltrans_statics) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
978 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
979 ipa_reference_optimization_summary_t info; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
980 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
981 /* See if we have (non-empty) info. */ |
145 | 982 if (!node->definition || node->inlined_to) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
983 return false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
984 info = get_reference_optimization_summary (node); |
145 | 985 if (!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
|
986 return false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
987 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
988 /* See if we want to encode it. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
989 Encode also referenced functions since constant folding might turn it into |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
990 a direct call. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
991 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
992 In future we might also want to include summaries of functions references |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
993 by initializers of constant variables references in current unit. */ |
111 | 994 if (!reachable_from_this_partition_p (node, encoder) |
995 && !referenced_from_this_partition_p (node, encoder)) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
996 return false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
997 |
145 | 998 /* See if the info has non-empty intersections with vars we want to |
999 encode. */ | |
1000 bitmap_iterator bi; | |
1001 unsigned int i; | |
1002 EXECUTE_IF_AND_COMPL_IN_BITMAP (ltrans_statics, info->statics_read, 0, | |
1003 i, bi) | |
1004 return true; | |
1005 EXECUTE_IF_AND_COMPL_IN_BITMAP (ltrans_statics, info->statics_written, 0, | |
1006 i, bi) | |
1007 return true; | |
1008 return false; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1009 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1010 |
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
|
1011 /* Stream out BITS<RANS_STATICS as list of decls to OB. |
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
|
1012 LTRANS_STATICS_BITCOUNT specify number of bits in LTRANS_STATICS |
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
|
1013 or -1. When it is positive, just output -1 when |
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
|
1014 BITS<RANS_STATICS == BITS<RANS_STATICS. */ |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1015 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1016 static void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1017 stream_out_bitmap (struct lto_simple_output_block *ob, |
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
|
1018 bitmap bits, bitmap ltrans_statics, |
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
|
1019 int ltrans_statics_bitcount) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1020 { |
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
|
1021 int count = 0; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1022 unsigned int index; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1023 bitmap_iterator bi; |
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
|
1024 if (bits == all_module_statics) |
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
|
1025 { |
111 | 1026 streamer_write_hwi_stream (ob->main_stream, -1); |
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
|
1027 return; |
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
|
1028 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1029 EXECUTE_IF_AND_IN_BITMAP (bits, ltrans_statics, 0, index, bi) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1030 count ++; |
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
|
1031 if (count == ltrans_statics_bitcount) |
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
|
1032 { |
111 | 1033 streamer_write_hwi_stream (ob->main_stream, -1); |
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
|
1034 return; |
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
|
1035 } |
111 | 1036 streamer_write_hwi_stream (ob->main_stream, count); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1037 if (!count) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1038 return; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1039 EXECUTE_IF_AND_IN_BITMAP (bits, ltrans_statics, 0, index, bi) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1040 { |
145 | 1041 tree decl = (*reference_vars_to_consider) [index]; |
111 | 1042 lto_output_var_decl_index (ob->decl_state, ob->main_stream, decl); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1043 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1044 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1045 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1046 /* Serialize the ipa info for lto. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1047 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1048 static void |
111 | 1049 ipa_reference_write_optimization_summary (void) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1050 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1051 struct lto_simple_output_block *ob |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1052 = lto_create_simple_output_block (LTO_section_ipa_reference); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1053 unsigned int count = 0; |
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
|
1054 int ltrans_statics_bitcount = 0; |
111 | 1055 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder; |
1056 auto_bitmap ltrans_statics; | |
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
|
1057 int i; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1058 |
145 | 1059 vec_alloc (reference_vars_to_consider, ipa_reference_vars_uids); |
1060 reference_vars_to_consider->safe_grow (ipa_reference_vars_uids); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1061 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1062 /* See what variables we are interested in. */ |
111 | 1063 for (i = 0; i < lto_symtab_encoder_size (encoder); i++) |
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
|
1064 { |
111 | 1065 symtab_node *snode = lto_symtab_encoder_deref (encoder, i); |
1066 varpool_node *vnode = dyn_cast <varpool_node *> (snode); | |
145 | 1067 int id; |
1068 | |
111 | 1069 if (vnode |
145 | 1070 && (id = ipa_reference_var_uid (vnode->decl)) != -1 |
111 | 1071 && referenced_from_this_partition_p (vnode, encoder)) |
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
|
1072 { |
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
|
1073 tree decl = vnode->decl; |
145 | 1074 bitmap_set_bit (ltrans_statics, id); |
1075 (*reference_vars_to_consider)[id] = decl; | |
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
|
1076 ltrans_statics_bitcount ++; |
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
|
1077 } |
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
|
1078 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1079 |
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
|
1080 |
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
|
1081 if (ltrans_statics_bitcount) |
111 | 1082 for (i = 0; i < lto_symtab_encoder_size (encoder); i++) |
1083 { | |
1084 symtab_node *snode = lto_symtab_encoder_deref (encoder, i); | |
1085 cgraph_node *cnode = dyn_cast <cgraph_node *> (snode); | |
1086 if (cnode && write_node_summary_p (cnode, encoder, ltrans_statics)) | |
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
|
1087 count++; |
111 | 1088 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1089 |
111 | 1090 streamer_write_uhwi_stream (ob->main_stream, count); |
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
|
1091 if (count) |
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
|
1092 stream_out_bitmap (ob, ltrans_statics, ltrans_statics, |
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
|
1093 -1); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1094 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1095 /* Process all of the functions. */ |
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
|
1096 if (ltrans_statics_bitcount) |
111 | 1097 for (i = 0; i < lto_symtab_encoder_size (encoder); i++) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1098 { |
111 | 1099 symtab_node *snode = lto_symtab_encoder_deref (encoder, i); |
1100 cgraph_node *cnode = dyn_cast <cgraph_node *> (snode); | |
1101 if (cnode && write_node_summary_p (cnode, encoder, ltrans_statics)) | |
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
|
1102 { |
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
|
1103 ipa_reference_optimization_summary_t info; |
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
|
1104 int node_ref; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1105 |
111 | 1106 info = get_reference_optimization_summary (cnode); |
1107 node_ref = lto_symtab_encoder_encode (encoder, snode); | |
1108 streamer_write_uhwi_stream (ob->main_stream, node_ref); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1109 |
145 | 1110 stream_out_bitmap (ob, info->statics_read, ltrans_statics, |
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
|
1111 ltrans_statics_bitcount); |
145 | 1112 stream_out_bitmap (ob, info->statics_written, ltrans_statics, |
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
|
1113 ltrans_statics_bitcount); |
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
|
1114 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1115 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1116 lto_destroy_simple_output_block (ob); |
145 | 1117 delete reference_vars_to_consider; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1118 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1119 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1120 /* Deserialize the ipa info for lto. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1121 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1122 static void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1123 ipa_reference_read_optimization_summary (void) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1124 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1125 struct lto_file_decl_data ** file_data_vec |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1126 = lto_get_file_decl_data (); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1127 struct lto_file_decl_data * file_data; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1128 unsigned int j = 0; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1129 bitmap_obstack_initialize (&optimization_summary_obstack); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1130 |
145 | 1131 gcc_checking_assert (ipa_ref_opt_sum_summaries == NULL); |
1132 ipa_ref_opt_sum_summaries = new ipa_ref_opt_summary_t (symtab); | |
1133 ipa_reference_vars_map = new reference_vars_map_t(257); | |
1134 varpool_node_hooks | |
1135 = symtab->add_varpool_removal_hook (varpool_removal_hook, NULL); | |
1136 ipa_reference_vars_uids = 0; | |
131 | 1137 |
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
|
1138 all_module_statics = BITMAP_ALLOC (&optimization_summary_obstack); |
145 | 1139 no_module_statics = BITMAP_ALLOC (&optimization_summary_obstack); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1140 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1141 while ((file_data = file_data_vec[j++])) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1142 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1143 const char *data; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1144 size_t len; |
145 | 1145 class lto_input_block *ib |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1146 = lto_create_simple_input_block (file_data, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1147 LTO_section_ipa_reference, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1148 &data, &len); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1149 if (ib) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1150 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1151 unsigned int i; |
111 | 1152 unsigned int f_count = streamer_read_uhwi (ib); |
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
|
1153 int b_count; |
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
|
1154 if (!f_count) |
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
|
1155 continue; |
111 | 1156 b_count = streamer_read_hwi (ib); |
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
|
1157 if (dump_file) |
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
|
1158 fprintf (dump_file, "all module statics:"); |
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
|
1159 for (i = 0; i < (unsigned int)b_count; i++) |
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
|
1160 { |
111 | 1161 unsigned int var_index = streamer_read_uhwi (ib); |
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
|
1162 tree v_decl = lto_file_decl_data_get_var_decl (file_data, |
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
|
1163 var_index); |
145 | 1164 bool existed; |
111 | 1165 bitmap_set_bit (all_module_statics, |
145 | 1166 ipa_reference_var_get_or_insert_uid |
1167 (v_decl, &existed)); | |
1168 gcc_checking_assert (!existed); | |
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
|
1169 if (dump_file) |
111 | 1170 fprintf (dump_file, " %s", fndecl_name (v_decl)); |
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
|
1171 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1172 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1173 for (i = 0; i < f_count; i++) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1174 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1175 unsigned int j, index; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1176 struct cgraph_node *node; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1177 int v_count; |
111 | 1178 lto_symtab_encoder_t encoder; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1179 |
111 | 1180 index = streamer_read_uhwi (ib); |
1181 encoder = file_data->symtab_node_encoder; | |
1182 node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref | |
1183 (encoder, index)); | |
131 | 1184 |
1185 ipa_reference_optimization_summary_d *info | |
1186 = ipa_ref_opt_sum_summaries->get_create (node); | |
1187 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1188 if (dump_file) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1189 fprintf (dump_file, |
145 | 1190 "\nFunction name:%s:\n static read:", |
111 | 1191 node->dump_asm_name ()); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1192 |
145 | 1193 /* Set the statics read. */ |
111 | 1194 v_count = streamer_read_hwi (ib); |
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
|
1195 if (v_count == -1) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1196 { |
145 | 1197 info->statics_read = all_module_statics; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1198 if (dump_file) |
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
|
1199 fprintf (dump_file, " all module statics"); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1200 } |
145 | 1201 else if (v_count == 0) |
1202 info->statics_read = no_module_statics; | |
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
|
1203 else |
145 | 1204 { |
1205 info->statics_read = BITMAP_ALLOC | |
1206 (&optimization_summary_obstack); | |
1207 for (j = 0; j < (unsigned int)v_count; j++) | |
1208 { | |
1209 unsigned int var_index = streamer_read_uhwi (ib); | |
1210 tree v_decl = lto_file_decl_data_get_var_decl (file_data, | |
1211 var_index); | |
1212 bitmap_set_bit (info->statics_read, | |
1213 ipa_reference_var_uid (v_decl)); | |
1214 if (dump_file) | |
1215 fprintf (dump_file, " %s", fndecl_name (v_decl)); | |
1216 } | |
1217 } | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1218 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1219 if (dump_file) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1220 fprintf (dump_file, |
145 | 1221 "\n static written:"); |
1222 /* Set the statics written. */ | |
111 | 1223 v_count = streamer_read_hwi (ib); |
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
|
1224 if (v_count == -1) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1225 { |
145 | 1226 info->statics_written = all_module_statics; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1227 if (dump_file) |
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
|
1228 fprintf (dump_file, " all module statics"); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1229 } |
145 | 1230 else if (v_count == 0) |
1231 info->statics_written = no_module_statics; | |
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
|
1232 else |
145 | 1233 { |
1234 info->statics_written = BITMAP_ALLOC | |
1235 (&optimization_summary_obstack); | |
1236 for (j = 0; j < (unsigned int)v_count; j++) | |
1237 { | |
1238 unsigned int var_index = streamer_read_uhwi (ib); | |
1239 tree v_decl = lto_file_decl_data_get_var_decl (file_data, | |
1240 var_index); | |
1241 bitmap_set_bit (info->statics_written, | |
1242 ipa_reference_var_uid (v_decl)); | |
1243 if (dump_file) | |
1244 fprintf (dump_file, " %s", fndecl_name (v_decl)); | |
1245 } | |
1246 } | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1247 if (dump_file) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1248 fprintf (dump_file, "\n"); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1249 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1250 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1251 lto_destroy_simple_input_block (file_data, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1252 LTO_section_ipa_reference, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1253 ib, data, len); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1254 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1255 else |
131 | 1256 /* Fatal error here. We do not want to support compiling ltrans units |
1257 with different version of compiler or different flags than | |
1258 the WPA unit, so this should never happen. */ | |
111 | 1259 fatal_error (input_location, |
1260 "ipa reference summary is missing in ltrans unit"); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1261 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1262 } |
0 | 1263 |
111 | 1264 namespace { |
1265 | |
1266 const pass_data pass_data_ipa_reference = | |
1267 { | |
1268 IPA_PASS, /* type */ | |
1269 "static-var", /* name */ | |
1270 OPTGROUP_NONE, /* optinfo_flags */ | |
1271 TV_IPA_REFERENCE, /* tv_id */ | |
1272 0, /* properties_required */ | |
1273 0, /* properties_provided */ | |
1274 0, /* properties_destroyed */ | |
1275 0, /* todo_flags_start */ | |
1276 0, /* todo_flags_finish */ | |
1277 }; | |
1278 | |
1279 class pass_ipa_reference : public ipa_opt_pass_d | |
0 | 1280 { |
111 | 1281 public: |
1282 pass_ipa_reference (gcc::context *ctxt) | |
1283 : ipa_opt_pass_d (pass_data_ipa_reference, ctxt, | |
1284 NULL, /* generate_summary */ | |
1285 NULL, /* write_summary */ | |
1286 NULL, /* read_summary */ | |
1287 ipa_reference_write_optimization_summary, /* | |
1288 write_optimization_summary */ | |
1289 ipa_reference_read_optimization_summary, /* | |
1290 read_optimization_summary */ | |
1291 NULL, /* stmt_fixup */ | |
1292 0, /* function_transform_todo_flags_start */ | |
1293 NULL, /* function_transform */ | |
1294 NULL) /* variable_transform */ | |
1295 {} | |
1296 | |
1297 /* opt_pass methods: */ | |
1298 virtual bool gate (function *) | |
1299 { | |
1300 return ((in_lto_p || flag_ipa_reference) | |
1301 /* Don't bother doing anything if the program has errors. */ | |
1302 && !seen_error ()); | |
1303 } | |
1304 | |
1305 virtual unsigned int execute (function *) { return propagate (); } | |
1306 | |
1307 }; // class pass_ipa_reference | |
1308 | |
1309 } // anon namespace | |
1310 | |
1311 ipa_opt_pass_d * | |
1312 make_pass_ipa_reference (gcc::context *ctxt) | |
1313 { | |
1314 return new pass_ipa_reference (ctxt); | |
0 | 1315 } |
1316 | |
111 | 1317 /* Reset all state within ipa-reference.c so that we can rerun the compiler |
1318 within the same process. For use by toplev::finalize. */ | |
1319 | |
1320 void | |
1321 ipa_reference_c_finalize (void) | |
0 | 1322 { |
131 | 1323 if (ipa_ref_opt_sum_summaries != NULL) |
1324 { | |
1325 delete ipa_ref_opt_sum_summaries; | |
1326 ipa_ref_opt_sum_summaries = NULL; | |
145 | 1327 delete ipa_reference_vars_map; |
1328 ipa_reference_vars_map = NULL; | |
1329 symtab->remove_varpool_removal_hook (varpool_node_hooks); | |
131 | 1330 } |
1331 | |
111 | 1332 if (ipa_init_p) |
1333 { | |
1334 bitmap_obstack_release (&optimization_summary_obstack); | |
1335 ipa_init_p = false; | |
1336 } | |
1337 } |