Mercurial > hg > CbC > CbC_gcc
annotate gcc/tree-ssa-live.c @ 56:3c8a44c06a95
Added tag gcc-4.4.5 for changeset 77e2b8dfacca
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:41:23 +0900 |
parents | 77e2b8dfacca |
children | b7f97abdc517 |
rev | line source |
---|---|
0 | 1 /* Liveness for SSA trees. |
2 Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, | |
3 Inc. | |
4 Contributed by Andrew MacLeod <amacleod@redhat.com> | |
5 | |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify | |
9 it under the terms of the GNU General Public License as published by | |
10 the Free Software Foundation; either version 3, or (at your option) | |
11 any later version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, | |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 GNU General Public License for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 #include "config.h" | |
23 #include "system.h" | |
24 #include "coretypes.h" | |
25 #include "tm.h" | |
26 #include "tree.h" | |
27 #include "diagnostic.h" | |
28 #include "bitmap.h" | |
29 #include "tree-flow.h" | |
30 #include "tree-dump.h" | |
31 #include "tree-ssa-live.h" | |
32 #include "toplev.h" | |
33 #include "debug.h" | |
34 #include "flags.h" | |
35 | |
36 #ifdef ENABLE_CHECKING | |
37 static void verify_live_on_entry (tree_live_info_p); | |
38 #endif | |
39 | |
40 | |
41 /* VARMAP maintains a mapping from SSA version number to real variables. | |
42 | |
43 All SSA_NAMES are divided into partitions. Initially each ssa_name is the | |
44 only member of it's own partition. Coalescing will attempt to group any | |
45 ssa_names which occur in a copy or in a PHI node into the same partition. | |
46 | |
47 At the end of out-of-ssa, each partition becomes a "real" variable and is | |
48 rewritten as a compiler variable. | |
49 | |
50 The var_map data structure is used to manage these partitions. It allows | |
51 partitions to be combined, and determines which partition belongs to what | |
52 ssa_name or variable, and vice versa. */ | |
53 | |
54 | |
55 /* This routine will initialize the basevar fields of MAP. */ | |
56 | |
57 static void | |
58 var_map_base_init (var_map map) | |
59 { | |
60 int x, num_part, num; | |
61 tree var; | |
62 var_ann_t ann; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
63 |
0 | 64 num = 0; |
65 num_part = num_var_partitions (map); | |
66 | |
67 /* If a base table already exists, clear it, otherwise create it. */ | |
68 if (map->partition_to_base_index != NULL) | |
69 { | |
70 free (map->partition_to_base_index); | |
71 VEC_truncate (tree, map->basevars, 0); | |
72 } | |
73 else | |
74 map->basevars = VEC_alloc (tree, heap, MAX (40, (num_part / 10))); | |
75 | |
76 map->partition_to_base_index = (int *) xmalloc (sizeof (int) * num_part); | |
77 | |
78 /* Build the base variable list, and point partitions at their bases. */ | |
79 for (x = 0; x < num_part; x++) | |
80 { | |
81 var = partition_to_var (map, x); | |
82 if (TREE_CODE (var) == SSA_NAME) | |
83 var = SSA_NAME_VAR (var); | |
84 ann = var_ann (var); | |
85 /* If base variable hasn't been seen, set it up. */ | |
86 if (!ann->base_var_processed) | |
87 { | |
88 ann->base_var_processed = 1; | |
89 VAR_ANN_BASE_INDEX (ann) = num++; | |
90 VEC_safe_push (tree, heap, map->basevars, var); | |
91 } | |
92 map->partition_to_base_index[x] = VAR_ANN_BASE_INDEX (ann); | |
93 } | |
94 | |
95 map->num_basevars = num; | |
96 | |
97 /* Now clear the processed bit. */ | |
98 for (x = 0; x < num; x++) | |
99 { | |
100 var = VEC_index (tree, map->basevars, x); | |
101 var_ann (var)->base_var_processed = 0; | |
102 } | |
103 | |
104 #ifdef ENABLE_CHECKING | |
105 for (x = 0; x < num_part; x++) | |
106 { | |
107 tree var2; | |
108 var = SSA_NAME_VAR (partition_to_var (map, x)); | |
109 var2 = VEC_index (tree, map->basevars, basevar_index (map, x)); | |
110 gcc_assert (var == var2); | |
111 } | |
112 #endif | |
113 } | |
114 | |
115 | |
116 /* Remove the base table in MAP. */ | |
117 | |
118 static void | |
119 var_map_base_fini (var_map map) | |
120 { | |
121 /* Free the basevar info if it is present. */ | |
122 if (map->partition_to_base_index != NULL) | |
123 { | |
124 VEC_free (tree, heap, map->basevars); | |
125 free (map->partition_to_base_index); | |
126 map->partition_to_base_index = NULL; | |
127 map->num_basevars = 0; | |
128 } | |
129 } | |
130 /* Create a variable partition map of SIZE, initialize and return it. */ | |
131 | |
132 var_map | |
133 init_var_map (int size) | |
134 { | |
135 var_map map; | |
136 | |
137 map = (var_map) xmalloc (sizeof (struct _var_map)); | |
138 map->var_partition = partition_new (size); | |
139 | |
140 map->partition_to_view = NULL; | |
141 map->view_to_partition = NULL; | |
142 map->num_partitions = size; | |
143 map->partition_size = size; | |
144 map->num_basevars = 0; | |
145 map->partition_to_base_index = NULL; | |
146 map->basevars = NULL; | |
147 return map; | |
148 } | |
149 | |
150 | |
151 /* Free memory associated with MAP. */ | |
152 | |
153 void | |
154 delete_var_map (var_map map) | |
155 { | |
156 var_map_base_fini (map); | |
157 partition_delete (map->var_partition); | |
158 if (map->partition_to_view) | |
159 free (map->partition_to_view); | |
160 if (map->view_to_partition) | |
161 free (map->view_to_partition); | |
162 free (map); | |
163 } | |
164 | |
165 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
166 /* This function will combine the partitions in MAP for VAR1 and VAR2. It |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
167 Returns the partition which represents the new partition. If the two |
0 | 168 partitions cannot be combined, NO_PARTITION is returned. */ |
169 | |
170 int | |
171 var_union (var_map map, tree var1, tree var2) | |
172 { | |
173 int p1, p2, p3; | |
174 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
175 gcc_assert (TREE_CODE (var1) == SSA_NAME); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
176 gcc_assert (TREE_CODE (var2) == SSA_NAME); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
177 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
178 /* This is independent of partition_to_view. If partition_to_view is |
0 | 179 on, then whichever one of these partitions is absorbed will never have a |
180 dereference into the partition_to_view array any more. */ | |
181 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
182 p1 = partition_find (map->var_partition, SSA_NAME_VERSION (var1)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
183 p2 = partition_find (map->var_partition, SSA_NAME_VERSION (var2)); |
0 | 184 |
185 gcc_assert (p1 != NO_PARTITION); | |
186 gcc_assert (p2 != NO_PARTITION); | |
187 | |
188 if (p1 == p2) | |
189 p3 = p1; | |
190 else | |
191 p3 = partition_union (map->var_partition, p1, p2); | |
192 | |
193 if (map->partition_to_view) | |
194 p3 = map->partition_to_view[p3]; | |
195 | |
196 return p3; | |
197 } | |
198 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
199 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
200 /* Compress the partition numbers in MAP such that they fall in the range |
0 | 201 0..(num_partitions-1) instead of wherever they turned out during |
202 the partitioning exercise. This removes any references to unused | |
203 partitions, thereby allowing bitmaps and other vectors to be much | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
204 denser. |
0 | 205 |
206 This is implemented such that compaction doesn't affect partitioning. | |
207 Ie., once partitions are created and possibly merged, running one | |
208 or more different kind of compaction will not affect the partitions | |
209 themselves. Their index might change, but all the same variables will | |
210 still be members of the same partition group. This allows work on reduced | |
211 sets, and no loss of information when a larger set is later desired. | |
212 | |
213 In particular, coalescing can work on partitions which have 2 or more | |
214 definitions, and then 'recompact' later to include all the single | |
215 definitions for assignment to program variables. */ | |
216 | |
217 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
218 /* Set MAP back to the initial state of having no partition view. Return a |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
219 bitmap which has a bit set for each partition number which is in use in the |
0 | 220 varmap. */ |
221 | |
222 static bitmap | |
223 partition_view_init (var_map map) | |
224 { | |
225 bitmap used; | |
226 int tmp; | |
227 unsigned int x; | |
228 | |
229 used = BITMAP_ALLOC (NULL); | |
230 | |
231 /* Already in a view? Abandon the old one. */ | |
232 if (map->partition_to_view) | |
233 { | |
234 free (map->partition_to_view); | |
235 map->partition_to_view = NULL; | |
236 } | |
237 if (map->view_to_partition) | |
238 { | |
239 free (map->view_to_partition); | |
240 map->view_to_partition = NULL; | |
241 } | |
242 | |
243 /* Find out which partitions are actually referenced. */ | |
244 for (x = 0; x < map->partition_size; x++) | |
245 { | |
246 tmp = partition_find (map->var_partition, x); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
247 if (ssa_name (tmp) != NULL_TREE && is_gimple_reg (ssa_name (tmp)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
248 && (!has_zero_uses (ssa_name (tmp)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
249 || !SSA_NAME_IS_DEFAULT_DEF (ssa_name (tmp)))) |
0 | 250 bitmap_set_bit (used, tmp); |
251 } | |
252 | |
253 map->num_partitions = map->partition_size; | |
254 return used; | |
255 } | |
256 | |
257 | |
258 /* This routine will finalize the view data for MAP based on the partitions | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
259 set in SELECTED. This is either the same bitmap returned from |
0 | 260 partition_view_init, or a trimmed down version if some of those partitions |
261 were not desired in this view. SELECTED is freed before returning. */ | |
262 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
263 static void |
0 | 264 partition_view_fini (var_map map, bitmap selected) |
265 { | |
266 bitmap_iterator bi; | |
267 unsigned count, i, x, limit; | |
268 | |
269 gcc_assert (selected); | |
270 | |
271 count = bitmap_count_bits (selected); | |
272 limit = map->partition_size; | |
273 | |
274 /* If its a one-to-one ratio, we don't need any view compaction. */ | |
275 if (count < limit) | |
276 { | |
277 map->partition_to_view = (int *)xmalloc (limit * sizeof (int)); | |
278 memset (map->partition_to_view, 0xff, (limit * sizeof (int))); | |
279 map->view_to_partition = (int *)xmalloc (count * sizeof (int)); | |
280 | |
281 i = 0; | |
282 /* Give each selected partition an index. */ | |
283 EXECUTE_IF_SET_IN_BITMAP (selected, 0, x, bi) | |
284 { | |
285 map->partition_to_view[x] = i; | |
286 map->view_to_partition[i] = x; | |
287 i++; | |
288 } | |
289 gcc_assert (i == count); | |
290 map->num_partitions = i; | |
291 } | |
292 | |
293 BITMAP_FREE (selected); | |
294 } | |
295 | |
296 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
297 /* Create a partition view which includes all the used partitions in MAP. If |
0 | 298 WANT_BASES is true, create the base variable map as well. */ |
299 | |
300 extern void | |
301 partition_view_normal (var_map map, bool want_bases) | |
302 { | |
303 bitmap used; | |
304 | |
305 used = partition_view_init (map); | |
306 partition_view_fini (map, used); | |
307 | |
308 if (want_bases) | |
309 var_map_base_init (map); | |
310 else | |
311 var_map_base_fini (map); | |
312 } | |
313 | |
314 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
315 /* Create a partition view in MAP which includes just partitions which occur in |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
316 the bitmap ONLY. If WANT_BASES is true, create the base variable map |
0 | 317 as well. */ |
318 | |
319 extern void | |
320 partition_view_bitmap (var_map map, bitmap only, bool want_bases) | |
321 { | |
322 bitmap used; | |
323 bitmap new_partitions = BITMAP_ALLOC (NULL); | |
324 unsigned x, p; | |
325 bitmap_iterator bi; | |
326 | |
327 used = partition_view_init (map); | |
328 EXECUTE_IF_SET_IN_BITMAP (only, 0, x, bi) | |
329 { | |
330 p = partition_find (map->var_partition, x); | |
331 gcc_assert (bitmap_bit_p (used, p)); | |
332 bitmap_set_bit (new_partitions, p); | |
333 } | |
334 partition_view_fini (map, new_partitions); | |
335 | |
336 BITMAP_FREE (used); | |
337 if (want_bases) | |
338 var_map_base_init (map); | |
339 else | |
340 var_map_base_fini (map); | |
341 } | |
342 | |
343 | |
344 static inline void mark_all_vars_used (tree *, void *data); | |
345 | |
346 /* Helper function for mark_all_vars_used, called via walk_tree. */ | |
347 | |
348 static tree | |
349 mark_all_vars_used_1 (tree *tp, int *walk_subtrees, void *data) | |
350 { | |
351 tree t = *tp; | |
352 enum tree_code_class c = TREE_CODE_CLASS (TREE_CODE (t)); | |
353 tree b; | |
354 | |
355 if (TREE_CODE (t) == SSA_NAME) | |
356 t = SSA_NAME_VAR (t); | |
357 | |
358 if (IS_EXPR_CODE_CLASS (c) | |
359 && (b = TREE_BLOCK (t)) != NULL) | |
360 TREE_USED (b) = true; | |
361 | |
362 /* Ignore TREE_ORIGINAL for TARGET_MEM_REFS, as well as other | |
363 fields that do not contain vars. */ | |
364 if (TREE_CODE (t) == TARGET_MEM_REF) | |
365 { | |
366 mark_all_vars_used (&TMR_SYMBOL (t), data); | |
367 mark_all_vars_used (&TMR_BASE (t), data); | |
368 mark_all_vars_used (&TMR_INDEX (t), data); | |
369 *walk_subtrees = 0; | |
370 return NULL; | |
371 } | |
372 | |
373 /* Only need to mark VAR_DECLS; parameters and return results are not | |
374 eliminated as unused. */ | |
375 if (TREE_CODE (t) == VAR_DECL) | |
376 { | |
377 if (data != NULL && bitmap_bit_p ((bitmap) data, DECL_UID (t))) | |
378 { | |
379 bitmap_clear_bit ((bitmap) data, DECL_UID (t)); | |
380 mark_all_vars_used (&DECL_INITIAL (t), data); | |
381 } | |
382 set_is_used (t); | |
383 } | |
384 | |
385 if (IS_TYPE_OR_DECL_P (t)) | |
386 *walk_subtrees = 0; | |
387 | |
388 return NULL; | |
389 } | |
390 | |
391 /* Mark the scope block SCOPE and its subblocks unused when they can be | |
392 possibly eliminated if dead. */ | |
393 | |
394 static void | |
395 mark_scope_block_unused (tree scope) | |
396 { | |
397 tree t; | |
398 TREE_USED (scope) = false; | |
399 if (!(*debug_hooks->ignore_block) (scope)) | |
400 TREE_USED (scope) = true; | |
401 for (t = BLOCK_SUBBLOCKS (scope); t ; t = BLOCK_CHAIN (t)) | |
402 mark_scope_block_unused (t); | |
403 } | |
404 | |
405 /* Look if the block is dead (by possibly eliminating its dead subblocks) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
406 and return true if so. |
0 | 407 Block is declared dead if: |
408 1) No statements are associated with it. | |
409 2) Declares no live variables | |
410 3) All subblocks are dead | |
411 or there is precisely one subblocks and the block | |
412 has same abstract origin as outer block and declares | |
413 no variables, so it is pure wrapper. | |
414 When we are not outputting full debug info, we also eliminate dead variables | |
415 out of scope blocks to let them to be recycled by GGC and to save copying work | |
416 done by the inliner. */ | |
417 | |
418 static bool | |
419 remove_unused_scope_block_p (tree scope) | |
420 { | |
421 tree *t, *next; | |
422 bool unused = !TREE_USED (scope); | |
423 var_ann_t ann; | |
424 int nsubblocks = 0; | |
425 | |
426 for (t = &BLOCK_VARS (scope); *t; t = next) | |
427 { | |
428 next = &TREE_CHAIN (*t); | |
429 | |
430 /* Debug info of nested function refers to the block of the | |
431 function. We might stil call it even if all statements | |
432 of function it was nested into was elliminated. | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
433 |
0 | 434 TODO: We can actually look into cgraph to see if function |
435 will be output to file. */ | |
436 if (TREE_CODE (*t) == FUNCTION_DECL) | |
437 unused = false; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
438 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
439 /* If a decl has a value expr, we need to instantiate it |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
440 regardless of debug info generation, to avoid codegen |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
441 differences in memory overlap tests. update_equiv_regs() may |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
442 indirectly call validate_equiv_mem() to test whether a |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
443 SET_DEST overlaps with others, and if the value expr changes |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
444 by virtual register instantiation, we may get end up with |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
445 different results. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
446 else if (TREE_CODE (*t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*t)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
447 unused = false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
448 |
0 | 449 /* Remove everything we don't generate debug info for. */ |
450 else if (DECL_IGNORED_P (*t)) | |
451 { | |
452 *t = TREE_CHAIN (*t); | |
453 next = t; | |
454 } | |
455 | |
456 /* When we are outputting debug info, we usually want to output | |
457 info about optimized-out variables in the scope blocks. | |
458 Exception are the scope blocks not containing any instructions | |
459 at all so user can't get into the scopes at first place. */ | |
460 else if ((ann = var_ann (*t)) != NULL | |
461 && ann->used) | |
462 unused = false; | |
463 | |
464 /* When we are not doing full debug info, we however can keep around | |
465 only the used variables for cfgexpand's memory packing saving quite | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
466 a lot of memory. |
0 | 467 |
468 For sake of -g3, we keep around those vars but we don't count this as | |
469 use of block, so innermost block with no used vars and no instructions | |
470 can be considered dead. We only want to keep around blocks user can | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
471 breakpoint into and ask about value of optimized out variables. |
0 | 472 |
473 Similarly we need to keep around types at least until all variables of | |
474 all nested blocks are gone. We track no information on whether given | |
475 type is used or not. */ | |
476 | |
477 else if (debug_info_level == DINFO_LEVEL_NORMAL | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
478 || debug_info_level == DINFO_LEVEL_VERBOSE) |
0 | 479 ; |
480 else | |
481 { | |
482 *t = TREE_CHAIN (*t); | |
483 next = t; | |
484 } | |
485 } | |
486 | |
487 for (t = &BLOCK_SUBBLOCKS (scope); *t ;) | |
488 if (remove_unused_scope_block_p (*t)) | |
489 { | |
490 if (BLOCK_SUBBLOCKS (*t)) | |
491 { | |
492 tree next = BLOCK_CHAIN (*t); | |
493 tree supercontext = BLOCK_SUPERCONTEXT (*t); | |
494 | |
495 *t = BLOCK_SUBBLOCKS (*t); | |
496 while (BLOCK_CHAIN (*t)) | |
497 { | |
498 BLOCK_SUPERCONTEXT (*t) = supercontext; | |
499 t = &BLOCK_CHAIN (*t); | |
500 } | |
501 BLOCK_CHAIN (*t) = next; | |
502 BLOCK_SUPERCONTEXT (*t) = supercontext; | |
503 t = &BLOCK_CHAIN (*t); | |
504 nsubblocks ++; | |
505 } | |
506 else | |
507 *t = BLOCK_CHAIN (*t); | |
508 } | |
509 else | |
510 { | |
511 t = &BLOCK_CHAIN (*t); | |
512 nsubblocks ++; | |
513 } | |
514 | |
515 | |
516 if (!unused) | |
517 ; | |
518 /* Outer scope is always used. */ | |
519 else if (!BLOCK_SUPERCONTEXT (scope) | |
520 || TREE_CODE (BLOCK_SUPERCONTEXT (scope)) == FUNCTION_DECL) | |
521 unused = false; | |
522 /* Innermost blocks with no live variables nor statements can be always | |
523 eliminated. */ | |
524 else if (!nsubblocks) | |
525 ; | |
526 /* For terse debug info we can eliminate info on unused variables. */ | |
527 else if (debug_info_level == DINFO_LEVEL_NONE | |
528 || debug_info_level == DINFO_LEVEL_TERSE) | |
19
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
529 { |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
530 /* Even for -g0/-g1 don't prune outer scopes from artificial |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
531 functions, otherwise diagnostics using tree_nonartificial_location |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
532 will not be emitted properly. */ |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
533 if (inlined_function_outer_scope_p (scope)) |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
534 { |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
535 tree ao = scope; |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
536 |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
537 while (ao |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
538 && TREE_CODE (ao) == BLOCK |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
539 && BLOCK_ABSTRACT_ORIGIN (ao) != ao) |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
540 ao = BLOCK_ABSTRACT_ORIGIN (ao); |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
541 if (ao |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
542 && TREE_CODE (ao) == FUNCTION_DECL |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
543 && DECL_DECLARED_INLINE_P (ao) |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
544 && lookup_attribute ("artificial", DECL_ATTRIBUTES (ao))) |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
545 unused = false; |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
546 } |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
547 } |
0 | 548 else if (BLOCK_VARS (scope) || BLOCK_NUM_NONLOCALIZED_VARS (scope)) |
549 unused = false; | |
550 /* See if this block is important for representation of inlined function. | |
551 Inlined functions are always represented by block with | |
552 block_ultimate_origin being set to FUNCTION_DECL and DECL_SOURCE_LOCATION | |
553 set... */ | |
554 else if (inlined_function_outer_scope_p (scope)) | |
555 unused = false; | |
556 else | |
557 /* Verfify that only blocks with source location set | |
558 are entry points to the inlined functions. */ | |
559 gcc_assert (BLOCK_SOURCE_LOCATION (scope) == UNKNOWN_LOCATION); | |
19
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
560 |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
561 TREE_USED (scope) = !unused; |
0 | 562 return unused; |
563 } | |
564 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
565 /* Mark all VAR_DECLS under *EXPR_P as used, so that they won't be |
0 | 566 eliminated during the tree->rtl conversion process. */ |
567 | |
568 static inline void | |
569 mark_all_vars_used (tree *expr_p, void *data) | |
570 { | |
571 walk_tree (expr_p, mark_all_vars_used_1, data, NULL); | |
572 } | |
573 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
574 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
575 /* Dump scope blocks starting at SCOPE to FILE. INDENT is the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
576 indentation level and FLAGS is as in print_generic_expr. */ |
0 | 577 |
578 static void | |
579 dump_scope_block (FILE *file, int indent, tree scope, int flags) | |
580 { | |
581 tree var, t; | |
582 unsigned int i; | |
583 | |
584 fprintf (file, "\n%*s{ Scope block #%i%s%s",indent, "" , BLOCK_NUMBER (scope), | |
585 TREE_USED (scope) ? "" : " (unused)", | |
586 BLOCK_ABSTRACT (scope) ? " (abstract)": ""); | |
587 if (BLOCK_SOURCE_LOCATION (scope) != UNKNOWN_LOCATION) | |
588 { | |
589 expanded_location s = expand_location (BLOCK_SOURCE_LOCATION (scope)); | |
590 fprintf (file, " %s:%i", s.file, s.line); | |
591 } | |
592 if (BLOCK_ABSTRACT_ORIGIN (scope)) | |
593 { | |
594 tree origin = block_ultimate_origin (scope); | |
595 if (origin) | |
596 { | |
597 fprintf (file, " Originating from :"); | |
598 if (DECL_P (origin)) | |
599 print_generic_decl (file, origin, flags); | |
600 else | |
601 fprintf (file, "#%i", BLOCK_NUMBER (origin)); | |
602 } | |
603 } | |
604 fprintf (file, " \n"); | |
605 for (var = BLOCK_VARS (scope); var; var = TREE_CHAIN (var)) | |
606 { | |
607 bool used = false; | |
608 var_ann_t ann; | |
609 | |
610 if ((ann = var_ann (var)) | |
611 && ann->used) | |
612 used = true; | |
613 | |
614 fprintf (file, "%*s",indent, ""); | |
615 print_generic_decl (file, var, flags); | |
616 fprintf (file, "%s\n", used ? "" : " (unused)"); | |
617 } | |
618 for (i = 0; i < BLOCK_NUM_NONLOCALIZED_VARS (scope); i++) | |
619 { | |
620 fprintf (file, "%*s",indent, ""); | |
621 print_generic_decl (file, BLOCK_NONLOCALIZED_VAR (scope, i), | |
622 flags); | |
623 fprintf (file, " (nonlocalized)\n"); | |
624 } | |
625 for (t = BLOCK_SUBBLOCKS (scope); t ; t = BLOCK_CHAIN (t)) | |
626 dump_scope_block (file, indent + 2, t, flags); | |
627 fprintf (file, "\n%*s}\n",indent, ""); | |
628 } | |
629 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
630 /* Dump the tree of lexical scopes starting at SCOPE to stderr. FLAGS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
631 is as in print_generic_expr. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
632 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
633 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
634 debug_scope_block (tree scope, int flags) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
635 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
636 dump_scope_block (stderr, 0, scope, flags); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
637 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
638 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
639 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
640 /* Dump the tree of lexical scopes of current_function_decl to FILE. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
641 FLAGS is as in print_generic_expr. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
642 |
0 | 643 void |
644 dump_scope_blocks (FILE *file, int flags) | |
645 { | |
646 dump_scope_block (file, 0, DECL_INITIAL (current_function_decl), flags); | |
647 } | |
648 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
649 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
650 /* Dump the tree of lexical scopes of current_function_decl to stderr. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
651 FLAGS is as in print_generic_expr. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
652 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
653 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
654 debug_scope_blocks (int flags) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
655 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
656 dump_scope_blocks (stderr, flags); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
657 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
658 |
0 | 659 /* Remove local variables that are not referenced in the IL. */ |
660 | |
661 void | |
662 remove_unused_locals (void) | |
663 { | |
664 basic_block bb; | |
665 tree t, *cell; | |
666 referenced_var_iterator rvi; | |
667 var_ann_t ann; | |
668 bitmap global_unused_vars = NULL; | |
669 | |
19
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
670 /* Removing declarations from lexical blocks when not optimizing is |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
671 not only a waste of time, it actually causes differences in stack |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
672 layout. */ |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
673 if (!optimize) |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
674 return; |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
675 |
0 | 676 mark_scope_block_unused (DECL_INITIAL (current_function_decl)); |
677 | |
678 /* Assume all locals are unused. */ | |
679 FOR_EACH_REFERENCED_VAR (t, rvi) | |
680 var_ann (t)->used = false; | |
681 | |
682 /* Walk the CFG marking all referenced symbols. */ | |
683 FOR_EACH_BB (bb) | |
684 { | |
685 gimple_stmt_iterator gsi; | |
686 size_t i; | |
687 edge_iterator ei; | |
688 edge e; | |
689 | |
690 /* Walk the statements. */ | |
691 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | |
692 { | |
693 gimple stmt = gsi_stmt (gsi); | |
694 tree b = gimple_block (stmt); | |
695 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
696 if (is_gimple_debug (stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
697 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
698 |
0 | 699 if (b) |
700 TREE_USED (b) = true; | |
701 | |
702 for (i = 0; i < gimple_num_ops (stmt); i++) | |
703 mark_all_vars_used (gimple_op_ptr (gsi_stmt (gsi), i), NULL); | |
704 } | |
705 | |
706 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | |
707 { | |
708 use_operand_p arg_p; | |
709 ssa_op_iter i; | |
710 tree def; | |
711 gimple phi = gsi_stmt (gsi); | |
712 | |
713 /* No point processing globals. */ | |
714 if (is_global_var (SSA_NAME_VAR (gimple_phi_result (phi)))) | |
715 continue; | |
716 | |
717 def = gimple_phi_result (phi); | |
718 mark_all_vars_used (&def, NULL); | |
719 | |
720 FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES) | |
721 { | |
722 tree arg = USE_FROM_PTR (arg_p); | |
723 mark_all_vars_used (&arg, NULL); | |
724 } | |
725 } | |
726 | |
727 FOR_EACH_EDGE (e, ei, bb->succs) | |
728 if (e->goto_locus) | |
729 TREE_USED (e->goto_block) = true; | |
730 } | |
731 | |
732 cfun->has_local_explicit_reg_vars = false; | |
733 | |
734 /* Remove unmarked local vars from local_decls. */ | |
735 for (cell = &cfun->local_decls; *cell; ) | |
736 { | |
737 tree var = TREE_VALUE (*cell); | |
738 | |
739 if (TREE_CODE (var) != FUNCTION_DECL | |
740 && (!(ann = var_ann (var)) | |
19
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
741 || !ann->used)) |
0 | 742 { |
743 if (is_global_var (var)) | |
744 { | |
745 if (global_unused_vars == NULL) | |
746 global_unused_vars = BITMAP_ALLOC (NULL); | |
747 bitmap_set_bit (global_unused_vars, DECL_UID (var)); | |
748 } | |
749 else | |
750 { | |
751 *cell = TREE_CHAIN (*cell); | |
752 continue; | |
753 } | |
754 } | |
755 else if (TREE_CODE (var) == VAR_DECL | |
756 && DECL_HARD_REGISTER (var) | |
757 && !is_global_var (var)) | |
758 cfun->has_local_explicit_reg_vars = true; | |
759 cell = &TREE_CHAIN (*cell); | |
760 } | |
761 | |
762 /* Remove unmarked global vars from local_decls. */ | |
763 if (global_unused_vars != NULL) | |
764 { | |
765 for (t = cfun->local_decls; t; t = TREE_CHAIN (t)) | |
766 { | |
767 tree var = TREE_VALUE (t); | |
768 | |
769 if (TREE_CODE (var) == VAR_DECL | |
770 && is_global_var (var) | |
771 && (ann = var_ann (var)) != NULL | |
772 && ann->used) | |
773 mark_all_vars_used (&DECL_INITIAL (var), global_unused_vars); | |
774 } | |
775 | |
776 for (cell = &cfun->local_decls; *cell; ) | |
777 { | |
778 tree var = TREE_VALUE (*cell); | |
779 | |
780 if (TREE_CODE (var) == VAR_DECL | |
781 && is_global_var (var) | |
782 && bitmap_bit_p (global_unused_vars, DECL_UID (var))) | |
783 *cell = TREE_CHAIN (*cell); | |
784 else | |
785 cell = &TREE_CHAIN (*cell); | |
786 } | |
787 BITMAP_FREE (global_unused_vars); | |
788 } | |
789 | |
790 /* Remove unused variables from REFERENCED_VARs. As a special | |
791 exception keep the variables that are believed to be aliased. | |
792 Those can't be easily removed from the alias sets and operand | |
793 caches. They will be removed shortly after the next may_alias | |
794 pass is performed. */ | |
795 FOR_EACH_REFERENCED_VAR (t, rvi) | |
796 if (!is_global_var (t) | |
797 && TREE_CODE (t) != PARM_DECL | |
798 && TREE_CODE (t) != RESULT_DECL | |
799 && !(ann = var_ann (t))->used | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
800 && !ann->is_heapvar |
19
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
801 && !TREE_ADDRESSABLE (t)) |
0 | 802 remove_referenced_var (t); |
803 remove_unused_scope_block_p (DECL_INITIAL (current_function_decl)); | |
804 if (dump_file && (dump_flags & TDF_DETAILS)) | |
805 { | |
806 fprintf (dump_file, "Scope blocks after cleanups:\n"); | |
807 dump_scope_blocks (dump_file, dump_flags); | |
808 } | |
809 } | |
810 | |
811 | |
812 /* Allocate and return a new live range information object base on MAP. */ | |
813 | |
814 static tree_live_info_p | |
815 new_tree_live_info (var_map map) | |
816 { | |
817 tree_live_info_p live; | |
818 unsigned x; | |
819 | |
820 live = (tree_live_info_p) xmalloc (sizeof (struct tree_live_info_d)); | |
821 live->map = map; | |
822 live->num_blocks = last_basic_block; | |
823 | |
824 live->livein = (bitmap *)xmalloc (last_basic_block * sizeof (bitmap)); | |
825 for (x = 0; x < (unsigned)last_basic_block; x++) | |
826 live->livein[x] = BITMAP_ALLOC (NULL); | |
827 | |
828 live->liveout = (bitmap *)xmalloc (last_basic_block * sizeof (bitmap)); | |
829 for (x = 0; x < (unsigned)last_basic_block; x++) | |
830 live->liveout[x] = BITMAP_ALLOC (NULL); | |
831 | |
832 live->work_stack = XNEWVEC (int, last_basic_block); | |
833 live->stack_top = live->work_stack; | |
834 | |
835 live->global = BITMAP_ALLOC (NULL); | |
836 return live; | |
837 } | |
838 | |
839 | |
840 /* Free storage for live range info object LIVE. */ | |
841 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
842 void |
0 | 843 delete_tree_live_info (tree_live_info_p live) |
844 { | |
845 int x; | |
846 | |
847 BITMAP_FREE (live->global); | |
848 free (live->work_stack); | |
849 | |
850 for (x = live->num_blocks - 1; x >= 0; x--) | |
851 BITMAP_FREE (live->liveout[x]); | |
852 free (live->liveout); | |
853 | |
854 for (x = live->num_blocks - 1; x >= 0; x--) | |
855 BITMAP_FREE (live->livein[x]); | |
856 free (live->livein); | |
857 | |
858 free (live); | |
859 } | |
860 | |
861 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
862 /* Visit basic block BB and propagate any required live on entry bits from |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
863 LIVE into the predecessors. VISITED is the bitmap of visited blocks. |
0 | 864 TMP is a temporary work bitmap which is passed in to avoid reallocating |
865 it each time. */ | |
866 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
867 static void |
0 | 868 loe_visit_block (tree_live_info_p live, basic_block bb, sbitmap visited, |
869 bitmap tmp) | |
870 { | |
871 edge e; | |
872 bool change; | |
873 edge_iterator ei; | |
874 basic_block pred_bb; | |
875 bitmap loe; | |
876 gcc_assert (!TEST_BIT (visited, bb->index)); | |
877 | |
878 SET_BIT (visited, bb->index); | |
879 loe = live_on_entry (live, bb); | |
880 | |
881 FOR_EACH_EDGE (e, ei, bb->preds) | |
882 { | |
883 pred_bb = e->src; | |
884 if (pred_bb == ENTRY_BLOCK_PTR) | |
885 continue; | |
886 /* TMP is variables live-on-entry from BB that aren't defined in the | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
887 predecessor block. This should be the live on entry vars to pred. |
0 | 888 Note that liveout is the DEFs in a block while live on entry is |
889 being calculated. */ | |
890 bitmap_and_compl (tmp, loe, live->liveout[pred_bb->index]); | |
891 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
892 /* Add these bits to live-on-entry for the pred. if there are any |
0 | 893 changes, and pred_bb has been visited already, add it to the |
894 revisit stack. */ | |
895 change = bitmap_ior_into (live_on_entry (live, pred_bb), tmp); | |
896 if (TEST_BIT (visited, pred_bb->index) && change) | |
897 { | |
898 RESET_BIT (visited, pred_bb->index); | |
899 *(live->stack_top)++ = pred_bb->index; | |
900 } | |
901 } | |
902 } | |
903 | |
904 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
905 /* Using LIVE, fill in all the live-on-entry blocks between the defs and uses |
0 | 906 of all the variables. */ |
907 | |
908 static void | |
909 live_worklist (tree_live_info_p live) | |
910 { | |
911 unsigned b; | |
912 basic_block bb; | |
913 sbitmap visited = sbitmap_alloc (last_basic_block + 1); | |
914 bitmap tmp = BITMAP_ALLOC (NULL); | |
915 | |
916 sbitmap_zero (visited); | |
917 | |
918 /* Visit all the blocks in reverse order and propagate live on entry values | |
919 into the predecessors blocks. */ | |
920 FOR_EACH_BB_REVERSE (bb) | |
921 loe_visit_block (live, bb, visited, tmp); | |
922 | |
923 /* Process any blocks which require further iteration. */ | |
924 while (live->stack_top != live->work_stack) | |
925 { | |
926 b = *--(live->stack_top); | |
927 loe_visit_block (live, BASIC_BLOCK (b), visited, tmp); | |
928 } | |
929 | |
930 BITMAP_FREE (tmp); | |
931 sbitmap_free (visited); | |
932 } | |
933 | |
934 | |
935 /* Calculate the initial live on entry vector for SSA_NAME using immediate_use | |
936 links. Set the live on entry fields in LIVE. Def's are marked temporarily | |
937 in the liveout vector. */ | |
938 | |
939 static void | |
940 set_var_live_on_entry (tree ssa_name, tree_live_info_p live) | |
941 { | |
942 int p; | |
943 gimple stmt; | |
944 use_operand_p use; | |
945 basic_block def_bb = NULL; | |
946 imm_use_iterator imm_iter; | |
947 bool global = false; | |
948 | |
949 p = var_to_partition (live->map, ssa_name); | |
950 if (p == NO_PARTITION) | |
951 return; | |
952 | |
953 stmt = SSA_NAME_DEF_STMT (ssa_name); | |
954 if (stmt) | |
955 { | |
956 def_bb = gimple_bb (stmt); | |
957 /* Mark defs in liveout bitmap temporarily. */ | |
958 if (def_bb) | |
959 bitmap_set_bit (live->liveout[def_bb->index], p); | |
960 } | |
961 else | |
962 def_bb = ENTRY_BLOCK_PTR; | |
963 | |
964 /* Visit each use of SSA_NAME and if it isn't in the same block as the def, | |
965 add it to the list of live on entry blocks. */ | |
966 FOR_EACH_IMM_USE_FAST (use, imm_iter, ssa_name) | |
967 { | |
968 gimple use_stmt = USE_STMT (use); | |
969 basic_block add_block = NULL; | |
970 | |
971 if (gimple_code (use_stmt) == GIMPLE_PHI) | |
972 { | |
973 /* Uses in PHI's are considered to be live at exit of the SRC block | |
974 as this is where a copy would be inserted. Check to see if it is | |
975 defined in that block, or whether its live on entry. */ | |
976 int index = PHI_ARG_INDEX_FROM_USE (use); | |
977 edge e = gimple_phi_arg_edge (use_stmt, index); | |
978 if (e->src != ENTRY_BLOCK_PTR) | |
979 { | |
980 if (e->src != def_bb) | |
981 add_block = e->src; | |
982 } | |
983 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
984 else if (is_gimple_debug (use_stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
985 continue; |
0 | 986 else |
987 { | |
988 /* If its not defined in this block, its live on entry. */ | |
989 basic_block use_bb = gimple_bb (use_stmt); | |
990 if (use_bb != def_bb) | |
991 add_block = use_bb; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
992 } |
0 | 993 |
994 /* If there was a live on entry use, set the bit. */ | |
995 if (add_block) | |
996 { | |
997 global = true; | |
998 bitmap_set_bit (live->livein[add_block->index], p); | |
999 } | |
1000 } | |
1001 | |
1002 /* If SSA_NAME is live on entry to at least one block, fill in all the live | |
1003 on entry blocks between the def and all the uses. */ | |
1004 if (global) | |
1005 bitmap_set_bit (live->global, p); | |
1006 } | |
1007 | |
1008 | |
1009 /* Calculate the live on exit vectors based on the entry info in LIVEINFO. */ | |
1010 | |
1011 void | |
1012 calculate_live_on_exit (tree_live_info_p liveinfo) | |
1013 { | |
1014 basic_block bb; | |
1015 edge e; | |
1016 edge_iterator ei; | |
1017 | |
1018 /* live on entry calculations used liveout vectors for defs, clear them. */ | |
1019 FOR_EACH_BB (bb) | |
1020 bitmap_clear (liveinfo->liveout[bb->index]); | |
1021 | |
1022 /* Set all the live-on-exit bits for uses in PHIs. */ | |
1023 FOR_EACH_BB (bb) | |
1024 { | |
1025 gimple_stmt_iterator gsi; | |
1026 size_t i; | |
1027 | |
1028 /* Mark the PHI arguments which are live on exit to the pred block. */ | |
1029 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | |
1030 { | |
1031 gimple phi = gsi_stmt (gsi); | |
1032 for (i = 0; i < gimple_phi_num_args (phi); i++) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1033 { |
0 | 1034 tree t = PHI_ARG_DEF (phi, i); |
1035 int p; | |
1036 | |
1037 if (TREE_CODE (t) != SSA_NAME) | |
1038 continue; | |
1039 | |
1040 p = var_to_partition (liveinfo->map, t); | |
1041 if (p == NO_PARTITION) | |
1042 continue; | |
1043 e = gimple_phi_arg_edge (phi, i); | |
1044 if (e->src != ENTRY_BLOCK_PTR) | |
1045 bitmap_set_bit (liveinfo->liveout[e->src->index], p); | |
1046 } | |
1047 } | |
1048 | |
1049 /* Add each successors live on entry to this bock live on exit. */ | |
1050 FOR_EACH_EDGE (e, ei, bb->succs) | |
1051 if (e->dest != EXIT_BLOCK_PTR) | |
1052 bitmap_ior_into (liveinfo->liveout[bb->index], | |
1053 live_on_entry (liveinfo, e->dest)); | |
1054 } | |
1055 } | |
1056 | |
1057 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1058 /* Given partition map MAP, calculate all the live on entry bitmaps for |
0 | 1059 each partition. Return a new live info object. */ |
1060 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1061 tree_live_info_p |
0 | 1062 calculate_live_ranges (var_map map) |
1063 { | |
1064 tree var; | |
1065 unsigned i; | |
1066 tree_live_info_p live; | |
1067 | |
1068 live = new_tree_live_info (map); | |
1069 for (i = 0; i < num_var_partitions (map); i++) | |
1070 { | |
1071 var = partition_to_var (map, i); | |
1072 if (var != NULL_TREE) | |
1073 set_var_live_on_entry (var, live); | |
1074 } | |
1075 | |
1076 live_worklist (live); | |
1077 | |
1078 #ifdef ENABLE_CHECKING | |
1079 verify_live_on_entry (live); | |
1080 #endif | |
1081 | |
1082 calculate_live_on_exit (live); | |
1083 return live; | |
1084 } | |
1085 | |
1086 | |
1087 /* Output partition map MAP to file F. */ | |
1088 | |
1089 void | |
1090 dump_var_map (FILE *f, var_map map) | |
1091 { | |
1092 int t; | |
1093 unsigned x, y; | |
1094 int p; | |
1095 | |
1096 fprintf (f, "\nPartition map \n\n"); | |
1097 | |
1098 for (x = 0; x < map->num_partitions; x++) | |
1099 { | |
1100 if (map->view_to_partition != NULL) | |
1101 p = map->view_to_partition[x]; | |
1102 else | |
1103 p = x; | |
1104 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1105 if (ssa_name (p) == NULL_TREE) |
0 | 1106 continue; |
1107 | |
1108 t = 0; | |
1109 for (y = 1; y < num_ssa_names; y++) | |
1110 { | |
1111 p = partition_find (map->var_partition, y); | |
1112 if (map->partition_to_view) | |
1113 p = map->partition_to_view[p]; | |
1114 if (p == (int)x) | |
1115 { | |
1116 if (t++ == 0) | |
1117 { | |
1118 fprintf(f, "Partition %d (", x); | |
1119 print_generic_expr (f, partition_to_var (map, p), TDF_SLIM); | |
1120 fprintf (f, " - "); | |
1121 } | |
1122 fprintf (f, "%d ", y); | |
1123 } | |
1124 } | |
1125 if (t != 0) | |
1126 fprintf (f, ")\n"); | |
1127 } | |
1128 fprintf (f, "\n"); | |
1129 } | |
1130 | |
1131 | |
1132 /* Output live range info LIVE to file F, controlled by FLAG. */ | |
1133 | |
1134 void | |
1135 dump_live_info (FILE *f, tree_live_info_p live, int flag) | |
1136 { | |
1137 basic_block bb; | |
1138 unsigned i; | |
1139 var_map map = live->map; | |
1140 bitmap_iterator bi; | |
1141 | |
1142 if ((flag & LIVEDUMP_ENTRY) && live->livein) | |
1143 { | |
1144 FOR_EACH_BB (bb) | |
1145 { | |
1146 fprintf (f, "\nLive on entry to BB%d : ", bb->index); | |
1147 EXECUTE_IF_SET_IN_BITMAP (live->livein[bb->index], 0, i, bi) | |
1148 { | |
1149 print_generic_expr (f, partition_to_var (map, i), TDF_SLIM); | |
1150 fprintf (f, " "); | |
1151 } | |
1152 fprintf (f, "\n"); | |
1153 } | |
1154 } | |
1155 | |
1156 if ((flag & LIVEDUMP_EXIT) && live->liveout) | |
1157 { | |
1158 FOR_EACH_BB (bb) | |
1159 { | |
1160 fprintf (f, "\nLive on exit from BB%d : ", bb->index); | |
1161 EXECUTE_IF_SET_IN_BITMAP (live->liveout[bb->index], 0, i, bi) | |
1162 { | |
1163 print_generic_expr (f, partition_to_var (map, i), TDF_SLIM); | |
1164 fprintf (f, " "); | |
1165 } | |
1166 fprintf (f, "\n"); | |
1167 } | |
1168 } | |
1169 } | |
1170 | |
1171 | |
1172 #ifdef ENABLE_CHECKING | |
1173 /* Verify that SSA_VAR is a non-virtual SSA_NAME. */ | |
1174 | |
1175 void | |
1176 register_ssa_partition_check (tree ssa_var) | |
1177 { | |
1178 gcc_assert (TREE_CODE (ssa_var) == SSA_NAME); | |
1179 if (!is_gimple_reg (SSA_NAME_VAR (ssa_var))) | |
1180 { | |
1181 fprintf (stderr, "Illegally registering a virtual SSA name :"); | |
1182 print_generic_expr (stderr, ssa_var, TDF_SLIM); | |
1183 fprintf (stderr, " in the SSA->Normal phase.\n"); | |
1184 internal_error ("SSA corruption"); | |
1185 } | |
1186 } | |
1187 | |
1188 | |
1189 /* Verify that the info in LIVE matches the current cfg. */ | |
1190 | |
1191 static void | |
1192 verify_live_on_entry (tree_live_info_p live) | |
1193 { | |
1194 unsigned i; | |
1195 tree var; | |
1196 gimple stmt; | |
1197 basic_block bb; | |
1198 edge e; | |
1199 int num; | |
1200 edge_iterator ei; | |
1201 var_map map = live->map; | |
1202 | |
1203 /* Check for live on entry partitions and report those with a DEF in | |
1204 the program. This will typically mean an optimization has done | |
1205 something wrong. */ | |
1206 bb = ENTRY_BLOCK_PTR; | |
1207 num = 0; | |
1208 FOR_EACH_EDGE (e, ei, bb->succs) | |
1209 { | |
1210 int entry_block = e->dest->index; | |
1211 if (e->dest == EXIT_BLOCK_PTR) | |
1212 continue; | |
1213 for (i = 0; i < (unsigned)num_var_partitions (map); i++) | |
1214 { | |
1215 basic_block tmp; | |
1216 tree d; | |
1217 bitmap loe; | |
1218 var = partition_to_var (map, i); | |
1219 stmt = SSA_NAME_DEF_STMT (var); | |
1220 tmp = gimple_bb (stmt); | |
1221 d = gimple_default_def (cfun, SSA_NAME_VAR (var)); | |
1222 | |
1223 loe = live_on_entry (live, e->dest); | |
1224 if (loe && bitmap_bit_p (loe, i)) | |
1225 { | |
1226 if (!gimple_nop_p (stmt)) | |
1227 { | |
1228 num++; | |
1229 print_generic_expr (stderr, var, TDF_SLIM); | |
1230 fprintf (stderr, " is defined "); | |
1231 if (tmp) | |
1232 fprintf (stderr, " in BB%d, ", tmp->index); | |
1233 fprintf (stderr, "by:\n"); | |
1234 print_gimple_stmt (stderr, stmt, 0, TDF_SLIM); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1235 fprintf (stderr, "\nIt is also live-on-entry to entry BB %d", |
0 | 1236 entry_block); |
1237 fprintf (stderr, " So it appears to have multiple defs.\n"); | |
1238 } | |
1239 else | |
1240 { | |
1241 if (d != var) | |
1242 { | |
1243 num++; | |
1244 print_generic_expr (stderr, var, TDF_SLIM); | |
1245 fprintf (stderr, " is live-on-entry to BB%d ", | |
1246 entry_block); | |
1247 if (d) | |
1248 { | |
1249 fprintf (stderr, " but is not the default def of "); | |
1250 print_generic_expr (stderr, d, TDF_SLIM); | |
1251 fprintf (stderr, "\n"); | |
1252 } | |
1253 else | |
1254 fprintf (stderr, " and there is no default def.\n"); | |
1255 } | |
1256 } | |
1257 } | |
1258 else | |
1259 if (d == var) | |
1260 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1261 /* The only way this var shouldn't be marked live on entry is |
0 | 1262 if it occurs in a PHI argument of the block. */ |
1263 size_t z; | |
1264 bool ok = false; | |
1265 gimple_stmt_iterator gsi; | |
1266 for (gsi = gsi_start_phis (e->dest); | |
1267 !gsi_end_p (gsi) && !ok; | |
1268 gsi_next (&gsi)) | |
1269 { | |
1270 gimple phi = gsi_stmt (gsi); | |
1271 for (z = 0; z < gimple_phi_num_args (phi); z++) | |
1272 if (var == gimple_phi_arg_def (phi, z)) | |
1273 { | |
1274 ok = true; | |
1275 break; | |
1276 } | |
1277 } | |
1278 if (ok) | |
1279 continue; | |
1280 num++; | |
1281 print_generic_expr (stderr, var, TDF_SLIM); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1282 fprintf (stderr, " is not marked live-on-entry to entry BB%d ", |
0 | 1283 entry_block); |
1284 fprintf (stderr, "but it is a default def so it should be.\n"); | |
1285 } | |
1286 } | |
1287 } | |
1288 gcc_assert (num <= 0); | |
1289 } | |
1290 #endif |