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