]> gcc.gnu.org Git - gcc.git/blob - gcc/tree-into-ssa.c
37ad103c67f2b5c9196e34312fda75f41de3fbbd
[gcc.git] / gcc / tree-into-ssa.c
1 /* Rewrite a program in Normal form into SSA.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "flags.h"
28 #include "rtl.h"
29 #include "tm_p.h"
30 #include "langhooks.h"
31 #include "hard-reg-set.h"
32 #include "basic-block.h"
33 #include "output.h"
34 #include "errors.h"
35 #include "expr.h"
36 #include "function.h"
37 #include "diagnostic.h"
38 #include "bitmap.h"
39 #include "tree-flow.h"
40 #include "tree-gimple.h"
41 #include "tree-inline.h"
42 #include "varray.h"
43 #include "timevar.h"
44 #include "hashtab.h"
45 #include "tree-dump.h"
46 #include "tree-pass.h"
47 #include "cfgloop.h"
48 #include "domwalk.h"
49 #include "ggc.h"
50
51 /* This file builds the SSA form for a function as described in:
52 R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and K. Zadeck. Efficiently
53 Computing Static Single Assignment Form and the Control Dependence
54 Graph. ACM Transactions on Programming Languages and Systems,
55 13(4):451-490, October 1991. */
56
57 /* Structure to map a variable VAR to the set of blocks that contain
58 definitions for VAR. */
59 struct def_blocks_d
60 {
61 /* The variable. */
62 tree var;
63
64 /* Blocks that contain definitions of VAR. Bit I will be set if the
65 Ith block contains a definition of VAR. */
66 bitmap def_blocks;
67
68 /* Blocks that contain a PHI node for VAR. */
69 bitmap phi_blocks;
70
71 /* Blocks where VAR is live-on-entry. Similar semantics as
72 DEF_BLOCKS. */
73 bitmap livein_blocks;
74 };
75
76
77 /* Each entry in DEF_BLOCKS contains an element of type STRUCT
78 DEF_BLOCKS_D, mapping a variable VAR to a bitmap describing all the
79 basic blocks where VAR is defined (assigned a new value). It also
80 contains a bitmap of all the blocks where VAR is live-on-entry
81 (i.e., there is a use of VAR in block B without a preceding
82 definition in B). The live-on-entry information is used when
83 computing PHI pruning heuristics. */
84 static htab_t def_blocks;
85
86 /* Stack of trees used to restore the global currdefs to its original
87 state after completing rewriting of a block and its dominator children.
88
89 This vector is used in two contexts. The first is rewriting of _DECL
90 nodes into SSA_NAMEs. In that context its elements have the
91 following properties:
92
93 An SSA_NAME indicates that the current definition of the underlying
94 variable should be set to the given SSA_NAME.
95
96 A _DECL node indicates that the underlying variable has no current
97 definition.
98
99 A NULL node is used to mark the last node associated with the
100 current block.
101
102 This vector is also used when rewriting an SSA_NAME which has multiple
103 definition sites into multiple SSA_NAMEs. In that context entries come
104 in pairs.
105
106 The top entry is an SSA_NAME and the top-1 entry is the
107 current value for that SSA_NAME.
108
109 A NULL node at the top entry is used to mark the last node associated
110 with the current block. */
111 static VEC(tree_on_heap) *block_defs_stack;
112
113 /* Basic block vectors used in this file ought to be allocated in the heap. */
114 DEF_VEC_MALLOC_P(int);
115
116 /* Global data to attach to the main dominator walk structure. */
117 struct mark_def_sites_global_data
118 {
119 /* This sbitmap contains the variables which are set before they
120 are used in a basic block. We keep it as a global variable
121 solely to avoid the overhead of allocating and deallocating
122 the bitmap. */
123 bitmap kills;
124
125 /* Bitmap of names to rename. */
126 sbitmap names_to_rename;
127 };
128
129
130 /* Information stored for ssa names. */
131 struct ssa_name_info
132 {
133 /* This field indicates whether or not the variable may need PHI nodes.
134 See the enum's definition for more detailed information about the
135 states. */
136 ENUM_BITFIELD (need_phi_state) need_phi_state : 2;
137
138 /* The actual definition of the ssa name. */
139 tree current_def;
140 };
141
142
143 /* Use TREE_VISITED to keep track of which statements we want to
144 rename. When renaming a subset of the variables, not all
145 statements will be processed. This is decided in mark_def_sites. */
146 #define REWRITE_THIS_STMT(T) TREE_VISITED (T)
147
148
149 /* Get the information associated with NAME. */
150
151 static inline struct ssa_name_info *
152 get_ssa_name_ann (tree name)
153 {
154 if (!SSA_NAME_AUX (name))
155 SSA_NAME_AUX (name) = xcalloc (1, sizeof (struct ssa_name_info));
156
157 return SSA_NAME_AUX (name);
158 }
159
160
161 /* Gets phi_state field for VAR. */
162
163 static inline enum need_phi_state
164 get_phi_state (tree var)
165 {
166 if (TREE_CODE (var) == SSA_NAME)
167 return get_ssa_name_ann (var)->need_phi_state;
168 else
169 return var_ann (var)->need_phi_state;
170 }
171
172
173 /* Sets phi_state field for VAR to STATE. */
174
175 static inline void
176 set_phi_state (tree var, enum need_phi_state state)
177 {
178 if (TREE_CODE (var) == SSA_NAME)
179 get_ssa_name_ann (var)->need_phi_state = state;
180 else
181 var_ann (var)->need_phi_state = state;
182 }
183
184
185 /* Return the current definition for VAR. */
186
187 static inline tree
188 get_current_def (tree var)
189 {
190 if (TREE_CODE (var) == SSA_NAME)
191 return get_ssa_name_ann (var)->current_def;
192 else
193 return var_ann (var)->current_def;
194 }
195
196
197 /* Sets current definition of VAR to DEF. */
198
199 static inline void
200 set_current_def (tree var, tree def)
201 {
202 if (TREE_CODE (var) == SSA_NAME)
203 get_ssa_name_ann (var)->current_def = def;
204 else
205 var_ann (var)->current_def = def;
206 }
207
208
209 /* Compute global livein information given the set of blockx where
210 an object is locally live at the start of the block (LIVEIN)
211 and the set of blocks where the object is defined (DEF_BLOCKS).
212
213 Note: This routine augments the existing local livein information
214 to include global livein (i.e., it modifies the underlying bitmap
215 for LIVEIN). */
216
217 void
218 compute_global_livein (bitmap livein, bitmap def_blocks)
219 {
220 basic_block bb, *worklist, *tos;
221 unsigned i;
222 bitmap_iterator bi;
223
224 tos = worklist
225 = (basic_block *) xmalloc (sizeof (basic_block) * (n_basic_blocks + 1));
226
227 EXECUTE_IF_SET_IN_BITMAP (livein, 0, i, bi)
228 {
229 *tos++ = BASIC_BLOCK (i);
230 }
231
232 /* Iterate until the worklist is empty. */
233 while (tos != worklist)
234 {
235 edge e;
236 edge_iterator ei;
237
238 /* Pull a block off the worklist. */
239 bb = *--tos;
240
241 /* For each predecessor block. */
242 FOR_EACH_EDGE (e, ei, bb->preds)
243 {
244 basic_block pred = e->src;
245 int pred_index = pred->index;
246
247 /* None of this is necessary for the entry block. */
248 if (pred != ENTRY_BLOCK_PTR
249 && ! bitmap_bit_p (livein, pred_index)
250 && ! bitmap_bit_p (def_blocks, pred_index))
251 {
252 *tos++ = pred;
253 bitmap_set_bit (livein, pred_index);
254 }
255 }
256 }
257
258 free (worklist);
259 }
260
261
262 /* Return the set of blocks where variable VAR is defined and the blocks
263 where VAR is live on entry (livein). If no entry is found in
264 DEF_BLOCKS, a new one is created and returned. */
265
266 static inline struct def_blocks_d *
267 get_def_blocks_for (tree var)
268 {
269 struct def_blocks_d db, *db_p;
270 void **slot;
271
272 db.var = var;
273 slot = htab_find_slot (def_blocks, (void *) &db, INSERT);
274 if (*slot == NULL)
275 {
276 db_p = xmalloc (sizeof (*db_p));
277 db_p->var = var;
278 db_p->def_blocks = BITMAP_ALLOC (NULL);
279 db_p->phi_blocks = BITMAP_ALLOC (NULL);
280 db_p->livein_blocks = BITMAP_ALLOC (NULL);
281 *slot = (void *) db_p;
282 }
283 else
284 db_p = (struct def_blocks_d *) *slot;
285
286 return db_p;
287 }
288
289
290 /* Mark block BB as the definition site for variable VAR. PHI_P is true if
291 VAR is defined by a PHI node. IS_UPDATE is true if the caller is
292 updating an existing SSA form. */
293
294 static void
295 set_def_block (tree var, basic_block bb, bool phi_p, bool is_update)
296 {
297 struct def_blocks_d *db_p;
298 enum need_phi_state state;
299
300 if (!is_update && TREE_CODE (var) == SSA_NAME)
301 var = SSA_NAME_VAR (var);
302
303 state = get_phi_state (var);
304 db_p = get_def_blocks_for (var);
305
306 /* Set the bit corresponding to the block where VAR is defined. */
307 bitmap_set_bit (db_p->def_blocks, bb->index);
308 if (phi_p)
309 bitmap_set_bit (db_p->phi_blocks, bb->index);
310
311 /* Keep track of whether or not we may need to insert PHI nodes.
312
313 If we are in the UNKNOWN state, then this is the first definition
314 of VAR. Additionally, we have not seen any uses of VAR yet, so
315 we do not need a PHI node for this variable at this time (i.e.,
316 transition to NEED_PHI_STATE_NO).
317
318 If we are in any other state, then we either have multiple definitions
319 of this variable occurring in different blocks or we saw a use of the
320 variable which was not dominated by the block containing the
321 definition(s). In this case we may need a PHI node, so enter
322 state NEED_PHI_STATE_MAYBE. */
323 if (state == NEED_PHI_STATE_UNKNOWN)
324 set_phi_state (var, NEED_PHI_STATE_NO);
325 else
326 set_phi_state (var, NEED_PHI_STATE_MAYBE);
327 }
328
329
330 /* Mark block BB as having VAR live at the entry to BB. */
331
332 static void
333 set_livein_block (tree var, basic_block bb)
334 {
335 struct def_blocks_d *db_p;
336 enum need_phi_state state = get_phi_state (var);
337
338 db_p = get_def_blocks_for (var);
339
340 /* Set the bit corresponding to the block where VAR is live in. */
341 bitmap_set_bit (db_p->livein_blocks, bb->index);
342
343 /* Keep track of whether or not we may need to insert PHI nodes.
344
345 If we reach here in NEED_PHI_STATE_NO, see if this use is dominated
346 by the single block containing the definition(s) of this variable. If
347 it is, then we remain in NEED_PHI_STATE_NO, otherwise we transition to
348 NEED_PHI_STATE_MAYBE. */
349 if (state == NEED_PHI_STATE_NO)
350 {
351 int def_block_index = bitmap_first_set_bit (db_p->def_blocks);
352
353 if (def_block_index == -1
354 || ! dominated_by_p (CDI_DOMINATORS, bb,
355 BASIC_BLOCK (def_block_index)))
356 set_phi_state (var, NEED_PHI_STATE_MAYBE);
357 }
358 else
359 set_phi_state (var, NEED_PHI_STATE_MAYBE);
360 }
361
362
363 /* If the use operand pointed to by OP_P needs to be renamed, then strip away
364 any SSA_NAME wrapping the operand, set *UID_P to the underlying variable's
365 uid, and return true. Otherwise return false. If the operand was an
366 SSA_NAME, change it to the stripped name. */
367
368 static bool
369 prepare_use_operand_for_rename (use_operand_p op_p, size_t *uid_p)
370 {
371 tree use = USE_FROM_PTR (op_p);
372 tree var = (TREE_CODE (use) != SSA_NAME) ? use : SSA_NAME_VAR (use);
373 *uid_p = var_ann (var)->uid;
374
375 /* Ignore variables that don't need to be renamed. */
376 if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
377 return false;
378
379 /* The variable needs to be renamed. If this is a use which already
380 has an SSA_NAME, then strip it off.
381
382 By not throwing away SSA_NAMEs on assignments, we avoid a lot of
383 useless churn of SSA_NAMEs without having to overly complicate the
384 renamer. */
385 if (TREE_CODE (use) == SSA_NAME)
386 SET_USE (op_p, var);
387
388 return true;
389 }
390
391
392 /* If the def variable DEF needs to be renamed, then strip away any SSA_NAME
393 wrapping the operand, set *UID_P to the underlying variable's uid and return
394 true. Otherwise return false. */
395
396 static bool
397 prepare_def_operand_for_rename (tree def, size_t *uid_p)
398 {
399 tree var = (TREE_CODE (def) != SSA_NAME) ? def : SSA_NAME_VAR (def);
400 *uid_p = var_ann (var)->uid;
401
402 /* Ignore variables that don't need to be renamed. */
403 if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
404 return false;
405
406 return true;
407 }
408
409
410 /* Call back for walk_dominator_tree used to collect definition sites
411 for every variable in the function. For every statement S in block
412 BB:
413
414 1- Variables defined by S in DEF_OPS(S) are marked in the bitmap
415 WALK_DATA->GLOBAL_DATA->KILLS.
416
417 2- If S uses a variable VAR and there is no preceding kill of VAR,
418 then it is marked in marked in the LIVEIN_BLOCKS bitmap
419 associated with VAR.
420
421 This information is used to determine which variables are live
422 across block boundaries to reduce the number of PHI nodes
423 we create. */
424
425 static void
426 mark_def_sites (struct dom_walk_data *walk_data,
427 basic_block bb,
428 block_stmt_iterator bsi)
429 {
430 struct mark_def_sites_global_data *gd = walk_data->global_data;
431 bitmap kills = gd->kills;
432 size_t uid;
433 tree stmt, def;
434 use_operand_p use_p;
435 def_operand_p def_p;
436 ssa_op_iter iter;
437
438 /* Mark all the blocks that have definitions for each variable in the
439 VARS_TO_RENAME bitmap. */
440 stmt = bsi_stmt (bsi);
441 get_stmt_operands (stmt);
442
443 REWRITE_THIS_STMT (stmt) = 0;
444
445 /* If a variable is used before being set, then the variable is live
446 across a block boundary, so mark it live-on-entry to BB. */
447
448 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter,
449 SSA_OP_USE | SSA_OP_VUSE | SSA_OP_VMUSTDEFKILL)
450 {
451 if (prepare_use_operand_for_rename (use_p, &uid))
452 {
453 REWRITE_THIS_STMT (stmt) = 1;
454 if (!bitmap_bit_p (kills, uid))
455 set_livein_block (USE_FROM_PTR (use_p), bb);
456 }
457 }
458
459 /* Note that virtual definitions are irrelevant for computing KILLS
460 because a V_MAY_DEF does not constitute a killing definition of the
461 variable. However, the operand of a virtual definitions is a use
462 of the variable, so it may cause the variable to be considered
463 live-on-entry. */
464 FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
465 {
466 if (prepare_use_operand_for_rename (use_p, &uid))
467 {
468 /* If we do not already have an SSA_NAME for our destination,
469 then set the destination to the source. */
470 if (TREE_CODE (DEF_FROM_PTR (def_p)) != SSA_NAME)
471 SET_DEF (def_p, USE_FROM_PTR (use_p));
472
473 set_livein_block (USE_FROM_PTR (use_p), bb);
474 set_def_block (DEF_FROM_PTR (def_p), bb, false, false);
475 REWRITE_THIS_STMT (stmt) = 1;
476 }
477 }
478
479 /* Now process the defs and must-defs made by this statement. */
480 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF | SSA_OP_VMUSTDEF)
481 {
482 if (prepare_def_operand_for_rename (def, &uid))
483 {
484 set_def_block (def, bb, false, false);
485 bitmap_set_bit (kills, uid);
486 REWRITE_THIS_STMT (stmt) = 1;
487 }
488 }
489 }
490
491
492 /* Given a set of blocks with variable definitions (DEF_BLOCKS),
493 return a bitmap with all the blocks in the iterated dominance
494 frontier of the blocks in DEF_BLOCKS. DFS contains dominance
495 frontier information as returned by compute_dominance_frontiers.
496
497 The resulting set of blocks are the potential sites where PHI nodes
498 are needed. The caller is responsible from freeing the memory
499 allocated for the return value. */
500
501 static bitmap
502 find_idf (bitmap def_blocks, bitmap *dfs)
503 {
504 bitmap_iterator bi;
505 unsigned bb_index;
506 VEC(int) *work_stack;
507 bitmap phi_insertion_points;
508
509 work_stack = VEC_alloc (int, n_basic_blocks);
510 phi_insertion_points = BITMAP_ALLOC (NULL);
511
512 /* Seed the work list with all the blocks in DEF_BLOCKS. */
513 EXECUTE_IF_SET_IN_BITMAP (def_blocks, 0, bb_index, bi)
514 /* We use VEC_quick_push here for speed. This is safe because we
515 know that the number of definition blocks is no greater than
516 the number of basic blocks, which is the initial capacity of
517 WORK_STACK. */
518 VEC_quick_push (int, work_stack, bb_index);
519
520 /* Pop a block off the worklist, add every block that appears in
521 the original block's DF that we have not already processed to
522 the worklist. Iterate until the worklist is empty. Blocks
523 which are added to the worklist are potential sites for
524 PHI nodes. */
525 while (VEC_length (int, work_stack) > 0)
526 {
527 bb_index = VEC_pop (int, work_stack);
528
529 EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs[bb_index], phi_insertion_points,
530 0, bb_index, bi)
531 {
532 /* Use a safe push because if there is a definition of VAR
533 in every basic block, then WORK_STACK may eventually have
534 more than N_BASIC_BLOCK entries. */
535 VEC_safe_push (int, work_stack, bb_index);
536 bitmap_set_bit (phi_insertion_points, bb_index);
537 }
538 }
539
540 VEC_free (int, work_stack);
541
542 return phi_insertion_points;
543 }
544
545
546 /* Return the set of blocks where variable VAR is defined and the blocks
547 where VAR is live on entry (livein). Return NULL, if no entry is
548 found in DEF_BLOCKS. */
549
550 static inline struct def_blocks_d *
551 find_def_blocks_for (tree var)
552 {
553 struct def_blocks_d dm;
554 dm.var = var;
555 return (struct def_blocks_d *) htab_find (def_blocks, &dm);
556 }
557
558
559 /* Insert PHI nodes for variable VAR using the iterated dominance
560 frontier given in PHI_INSERTION_POINTS. */
561
562 static void
563 insert_phi_nodes_for (tree var, bitmap phi_insertion_points)
564 {
565 unsigned bb_index;
566 edge e;
567 tree phi;
568 basic_block bb;
569 bitmap_iterator bi;
570 struct def_blocks_d *def_map;
571
572 def_map = find_def_blocks_for (var);
573
574 /* Remove the blocks where we already have PHI nodes for VAR. */
575 bitmap_and_compl_into (phi_insertion_points, def_map->phi_blocks);
576
577 /* Now compute global livein for this variable. Note this modifies
578 def_map->livein_blocks. */
579 compute_global_livein (def_map->livein_blocks, def_map->def_blocks);
580
581 /* And insert the PHI nodes. */
582 EXECUTE_IF_AND_IN_BITMAP (phi_insertion_points, def_map->livein_blocks,
583 0, bb_index, bi)
584 {
585 bb = BASIC_BLOCK (bb_index);
586 phi = create_phi_node (var, bb);
587
588 /* If we are rewriting SSA names, add also the PHI arguments. */
589 if (TREE_CODE (var) == SSA_NAME)
590 {
591 edge_iterator ei;
592 FOR_EACH_EDGE (e, ei, bb->preds)
593 add_phi_arg (phi, var, e);
594 }
595 }
596 }
597
598
599 /* Helper for insert_phi_nodes. If VAR needs PHI nodes, insert them
600 at the dominance frontier (DFS) of blocks defining VAR. */
601
602 static inline void
603 insert_phi_nodes_1 (tree var, bitmap *dfs)
604 {
605 struct def_blocks_d *def_map;
606 bitmap idf;
607
608 def_map = find_def_blocks_for (var);
609 if (def_map == NULL)
610 return;
611
612 idf = find_idf (def_map->def_blocks, dfs);
613
614 if (get_phi_state (var) != NEED_PHI_STATE_NO)
615 insert_phi_nodes_for (var, idf);
616
617 BITMAP_FREE (idf);
618 }
619
620
621 /* Insert PHI nodes at the dominance frontier of blocks with variable
622 definitions. DFS contains the dominance frontier information for
623 the flowgraph. PHI nodes will only be inserted at the dominance
624 frontier of definition blocks for variables whose NEED_PHI_STATE
625 annotation is marked as ``maybe'' or ``unknown'' (computed by
626 mark_def_sites). If NAMES_TO_RENAME is not NULL, do the same but
627 for ssa name rewriting. */
628
629 static void
630 insert_phi_nodes (bitmap *dfs, bitmap names_to_rename)
631 {
632 unsigned i;
633 bitmap_iterator bi;
634
635 timevar_push (TV_TREE_INSERT_PHI_NODES);
636
637 /* Iterate over all variables in VARS_TO_RENAME. For each variable, add
638 to the work list all the blocks that have a definition for the
639 variable. PHI nodes will be added to the dominance frontier blocks of
640 each definition block. */
641 if (names_to_rename)
642 {
643 EXECUTE_IF_SET_IN_BITMAP (names_to_rename, 0, i, bi)
644 if (ssa_name (i))
645 insert_phi_nodes_1 (ssa_name (i), dfs);
646 }
647 else if (vars_to_rename)
648 {
649 EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i, bi)
650 insert_phi_nodes_1 (referenced_var (i), dfs);
651 }
652 else
653 {
654 for (i = 0; i < num_referenced_vars; i++)
655 insert_phi_nodes_1 (referenced_var (i), dfs);
656 }
657
658 timevar_pop (TV_TREE_INSERT_PHI_NODES);
659 }
660
661
662 /* Register DEF (an SSA_NAME) to be a new definition for its underlying
663 variable (SSA_NAME_VAR (DEF)) and push VAR's current reaching definition
664 into the stack pointed by BLOCK_DEFS_P. */
665
666 void
667 register_new_def (tree def, VEC (tree_on_heap) **block_defs_p)
668 {
669 tree var = SSA_NAME_VAR (def);
670 tree currdef;
671
672 /* If this variable is set in a single basic block and all uses are
673 dominated by the set(s) in that single basic block, then there is
674 no reason to record anything for this variable in the block local
675 definition stacks. Doing so just wastes time and memory.
676
677 This is the same test to prune the set of variables which may
678 need PHI nodes. So we just use that information since it's already
679 computed and available for us to use. */
680 if (get_phi_state (var) == NEED_PHI_STATE_NO)
681 {
682 set_current_def (var, def);
683 return;
684 }
685
686 currdef = get_current_def (var);
687
688 /* Push the current reaching definition into *BLOCK_DEFS_P. This stack is
689 later used by the dominator tree callbacks to restore the reaching
690 definitions for all the variables defined in the block after a recursive
691 visit to all its immediately dominated blocks. If there is no current
692 reaching definition, then just record the underlying _DECL node. */
693 VEC_safe_push (tree_on_heap, *block_defs_p, currdef ? currdef : var);
694
695 /* Set the current reaching definition for VAR to be DEF. */
696 set_current_def (var, def);
697 }
698
699
700 /* Perform a depth-first traversal of the dominator tree looking for
701 variables to rename. BB is the block where to start searching.
702 Renaming is a five step process:
703
704 1- Every definition made by PHI nodes at the start of the blocks is
705 registered as the current definition for the corresponding variable.
706
707 2- Every statement in BB is rewritten. USE and VUSE operands are
708 rewritten with their corresponding reaching definition. DEF and
709 VDEF targets are registered as new definitions.
710
711 3- All the PHI nodes in successor blocks of BB are visited. The
712 argument corresponding to BB is replaced with its current reaching
713 definition.
714
715 4- Recursively rewrite every dominator child block of BB.
716
717 5- Restore (in reverse order) the current reaching definition for every
718 new definition introduced in this block. This is done so that when
719 we return from the recursive call, all the current reaching
720 definitions are restored to the names that were valid in the
721 dominator parent of BB. */
722
723 /* SSA Rewriting Step 1. Initialization, create a block local stack
724 of reaching definitions for new SSA names produced in this block
725 (BLOCK_DEFS). Register new definitions for every PHI node in the
726 block. */
727
728 static void
729 rewrite_initialize_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
730 basic_block bb)
731 {
732 tree phi;
733
734 if (dump_file && (dump_flags & TDF_DETAILS))
735 fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
736
737 /* Mark the unwind point for this block. */
738 VEC_safe_push (tree_on_heap, block_defs_stack, NULL_TREE);
739
740 /* Step 1. Register new definitions for every PHI node in the block.
741 Conceptually, all the PHI nodes are executed in parallel and each PHI
742 node introduces a new version for the associated variable. */
743 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
744 {
745 tree result = PHI_RESULT (phi);
746 register_new_def (result, &block_defs_stack);
747 }
748 }
749
750
751 /* Return the current definition for variable VAR. If none is found,
752 create a new SSA name to act as the zeroth definition for VAR. If VAR
753 is call clobbered and there exists a more recent definition of
754 GLOBAL_VAR, return the definition for GLOBAL_VAR. This means that VAR
755 has been clobbered by a function call since its last assignment. */
756
757 static tree
758 get_reaching_def (tree var)
759 {
760 tree default_d, currdef_var, avar;
761
762 /* Lookup the current reaching definition for VAR. */
763 default_d = NULL_TREE;
764 currdef_var = get_current_def (var);
765
766 /* If there is no reaching definition for VAR, create and register a
767 default definition for it (if needed). */
768 if (currdef_var == NULL_TREE)
769 {
770 if (TREE_CODE (var) == SSA_NAME)
771 avar = SSA_NAME_VAR (var);
772 else
773 avar = var;
774
775 default_d = default_def (avar);
776 if (default_d == NULL_TREE)
777 {
778 default_d = make_ssa_name (avar, build_empty_stmt ());
779 set_default_def (avar, default_d);
780 }
781 set_current_def (var, default_d);
782 }
783
784 /* Return the current reaching definition for VAR, or the default
785 definition, if we had to create one. */
786 return (currdef_var) ? currdef_var : default_d;
787 }
788
789
790 /* Replace the operand pointed by OP_P with its immediate reaching
791 definition. */
792
793 static inline void
794 rewrite_operand (use_operand_p op_p)
795 {
796 tree var = USE_FROM_PTR (op_p);
797 if (TREE_CODE (var) != SSA_NAME)
798 SET_USE (op_p, get_reaching_def (var));
799 else
800 {
801 #if defined ENABLE_CHECKING
802 /* If we get to this point, VAR is an SSA_NAME. If VAR's symbol
803 was marked for renaming, make sure that its reaching
804 definition is VAR itself. Otherwise, something has gone
805 wrong. */
806 tree sym = SSA_NAME_VAR (var);
807 if (bitmap_bit_p (vars_to_rename, var_ann (sym)->uid))
808 gcc_assert (var == get_reaching_def (SSA_NAME_VAR (var)));
809 #endif
810 }
811 }
812
813
814 /* SSA Rewriting Step 2. Rewrite every variable used in each statement in
815 the block with its immediate reaching definitions. Update the current
816 definition of a variable when a new real or virtual definition is found. */
817
818 static void
819 rewrite_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
820 basic_block bb ATTRIBUTE_UNUSED,
821 block_stmt_iterator si)
822 {
823 tree stmt;
824 use_operand_p use_p;
825 def_operand_p def_p;
826 ssa_op_iter iter;
827
828 stmt = bsi_stmt (si);
829
830 /* If mark_def_sites decided that we don't need to rewrite this
831 statement, ignore it. */
832 if (!REWRITE_THIS_STMT (stmt))
833 return;
834
835 if (dump_file && (dump_flags & TDF_DETAILS))
836 {
837 fprintf (dump_file, "Renaming statement ");
838 print_generic_stmt (dump_file, stmt, TDF_SLIM);
839 fprintf (dump_file, "\n");
840 }
841
842 get_stmt_operands (stmt);
843
844 /* Step 1. Rewrite USES and VUSES in the statement. */
845 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES | SSA_OP_ALL_KILLS)
846 rewrite_operand (use_p);
847
848 /* Step 2. Register the statement's DEF and VDEF operands. */
849 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
850 {
851 if (TREE_CODE (DEF_FROM_PTR (def_p)) != SSA_NAME)
852 SET_DEF (def_p, make_ssa_name (DEF_FROM_PTR (def_p), stmt));
853
854 /* FIXME: We shouldn't be registering new defs if the variable
855 doesn't need to be renamed. */
856 register_new_def (DEF_FROM_PTR (def_p), &block_defs_stack);
857 }
858 }
859
860
861 /* SSA Rewriting Step 3. Visit all the successor blocks of BB looking for
862 PHI nodes. For every PHI node found, add a new argument containing the
863 current reaching definition for the variable and the edge through which
864 that definition is reaching the PHI node. */
865
866 static void
867 rewrite_add_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
868 basic_block bb)
869 {
870 edge e;
871 edge_iterator ei;
872
873 FOR_EACH_EDGE (e, ei, bb->succs)
874 {
875 tree phi;
876
877 for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
878 {
879 tree currdef;
880
881 /* If this PHI node has already been rewritten, then there is
882 nothing to do for this PHI or any following PHIs since we
883 always add new PHI nodes at the start of the PHI chain. */
884 if (PHI_REWRITTEN (phi))
885 break;
886
887 currdef = get_reaching_def (SSA_NAME_VAR (PHI_RESULT (phi)));
888 add_phi_arg (phi, currdef, e);
889 }
890 }
891 }
892
893
894 /* Rewrite existing virtual PHI arguments so that they have the correct
895 reaching definitions. BB is the basic block whose successors contain the
896 PHI nodes we want to add arguments for. */
897
898 static void
899 rewrite_virtual_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
900 basic_block bb)
901 {
902 edge e;
903 use_operand_p op;
904 edge_iterator ei;
905
906 FOR_EACH_EDGE (e, ei, bb->succs)
907 {
908 tree phi;
909
910 if (e->dest == EXIT_BLOCK_PTR)
911 continue;
912
913 for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
914 {
915 tree result = PHI_RESULT (phi);
916 op = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
917
918 if (is_gimple_reg (result)
919 || !bitmap_bit_p (vars_to_rename,
920 var_ann (SSA_NAME_VAR (result))->uid))
921 continue;
922
923 SET_USE (op, get_reaching_def (SSA_NAME_VAR (result)));
924 if (e->flags & EDGE_ABNORMAL)
925 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (op)) = 1;
926 }
927 }
928 }
929
930
931 /* Called after visiting basic block BB. Restore CURRDEFS to its
932 original value. */
933
934 static void
935 rewrite_finalize_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
936 basic_block bb ATTRIBUTE_UNUSED)
937 {
938 /* Restore CURRDEFS to its original state. */
939 while (VEC_length (tree_on_heap, block_defs_stack) > 0)
940 {
941 tree tmp = VEC_pop (tree_on_heap, block_defs_stack);
942 tree saved_def, var;
943
944 if (tmp == NULL_TREE)
945 break;
946
947 /* If we recorded an SSA_NAME, then make the SSA_NAME the current
948 definition of its underlying variable. If we recorded anything
949 else, it must have been an _DECL node and its current reaching
950 definition must have been NULL. */
951 if (TREE_CODE (tmp) == SSA_NAME)
952 {
953 saved_def = tmp;
954 var = SSA_NAME_VAR (saved_def);
955 }
956 else
957 {
958 saved_def = NULL;
959 var = tmp;
960 }
961
962 set_current_def (var, saved_def);
963 }
964 }
965
966
967 /* Dump SSA information to FILE. */
968
969 void
970 dump_tree_ssa (FILE *file)
971 {
972 basic_block bb;
973 const char *funcname
974 = lang_hooks.decl_printable_name (current_function_decl, 2);
975
976 fprintf (file, "SSA information for %s\n\n", funcname);
977
978 FOR_EACH_BB (bb)
979 {
980 dump_bb (bb, file, 0);
981 fputs (" ", file);
982 print_generic_stmt (file, phi_nodes (bb), dump_flags);
983 fputs ("\n\n", file);
984 }
985 }
986
987
988 /* Dump SSA information to stderr. */
989
990 void
991 debug_tree_ssa (void)
992 {
993 dump_tree_ssa (stderr);
994 }
995
996
997 /* Dump statistics for the hash table HTAB. */
998
999 static void
1000 htab_statistics (FILE *file, htab_t htab)
1001 {
1002 fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
1003 (long) htab_size (htab),
1004 (long) htab_elements (htab),
1005 htab_collisions (htab));
1006 }
1007
1008
1009 /* Dump SSA statistics on FILE. */
1010
1011 void
1012 dump_tree_ssa_stats (FILE *file)
1013 {
1014 fprintf (file, "\nHash table statistics:\n");
1015
1016 fprintf (file, " def_blocks: ");
1017 htab_statistics (file, def_blocks);
1018
1019 fprintf (file, "\n");
1020 }
1021
1022
1023 /* Dump SSA statistics on stderr. */
1024
1025 void
1026 debug_tree_ssa_stats (void)
1027 {
1028 dump_tree_ssa_stats (stderr);
1029 }
1030
1031
1032 /* Hashing and equality functions for DEF_BLOCKS. */
1033
1034 static hashval_t
1035 def_blocks_hash (const void *p)
1036 {
1037 return htab_hash_pointer
1038 ((const void *)((const struct def_blocks_d *)p)->var);
1039 }
1040
1041 static int
1042 def_blocks_eq (const void *p1, const void *p2)
1043 {
1044 return ((const struct def_blocks_d *)p1)->var
1045 == ((const struct def_blocks_d *)p2)->var;
1046 }
1047
1048
1049 /* Free memory allocated by one entry in DEF_BLOCKS. */
1050
1051 static void
1052 def_blocks_free (void *p)
1053 {
1054 struct def_blocks_d *entry = p;
1055 BITMAP_FREE (entry->def_blocks);
1056 BITMAP_FREE (entry->phi_blocks);
1057 BITMAP_FREE (entry->livein_blocks);
1058 free (entry);
1059 }
1060
1061
1062 /* Callback for htab_traverse to dump the DEF_BLOCKS hash table. */
1063
1064 static int
1065 debug_def_blocks_r (void **slot, void *data ATTRIBUTE_UNUSED)
1066 {
1067 struct def_blocks_d *db_p = (struct def_blocks_d *) *slot;
1068
1069 fprintf (stderr, "VAR: ");
1070 print_generic_expr (stderr, db_p->var, dump_flags);
1071 bitmap_print (stderr, db_p->def_blocks, ", DEF_BLOCKS: { ", "}");
1072 bitmap_print (stderr, db_p->livein_blocks, ", LIVEIN_BLOCKS: { ", "}\n");
1073
1074 return 1;
1075 }
1076
1077
1078 /* Dump the DEF_BLOCKS hash table on stderr. */
1079
1080 void
1081 debug_def_blocks (void)
1082 {
1083 htab_traverse (def_blocks, debug_def_blocks_r, NULL);
1084 }
1085
1086
1087 /* If a variable V in VARS_TO_RENAME is a pointer, the renaming
1088 process will cause us to lose the name memory tags that may have
1089 been associated with the various SSA_NAMEs of V. This means that
1090 the variables aliased to those name tags also need to be renamed
1091 again.
1092
1093 FIXME 1- We should either have a better scheme for renaming
1094 pointers that doesn't lose name tags or re-run alias
1095 analysis to recover points-to information.
1096
1097 2- Currently we just invalidate *all* the name tags. This
1098 should be more selective. */
1099
1100 static void
1101 invalidate_name_tags (bitmap vars_to_rename)
1102 {
1103 unsigned i;
1104 bool rename_name_tags_p;
1105 bitmap_iterator bi;
1106
1107 rename_name_tags_p = false;
1108 EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i, bi)
1109 {
1110 if (POINTER_TYPE_P (TREE_TYPE (referenced_var (i))))
1111 {
1112 rename_name_tags_p = true;
1113 break;
1114 }
1115 }
1116
1117 if (rename_name_tags_p)
1118 for (i = 0; i < num_referenced_vars; i++)
1119 {
1120 var_ann_t ann = var_ann (referenced_var (i));
1121
1122 if (ann->mem_tag_kind == NAME_TAG)
1123 {
1124 size_t j;
1125 varray_type may_aliases = ann->may_aliases;
1126
1127 bitmap_set_bit (vars_to_rename, ann->uid);
1128 if (ann->may_aliases)
1129 for (j = 0; j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
1130 {
1131 tree var = VARRAY_TREE (may_aliases, j);
1132 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1133 }
1134 }
1135 }
1136 }
1137
1138
1139 /* Rewrite the actual blocks, statements, and PHI arguments, to be in SSA
1140 form. FIX_VIRTUAL_PHIS is true if we should only be fixing up virtual
1141 PHI arguments, instead of adding new PHI arguments for just added PHI
1142 nodes. */
1143
1144 static void
1145 rewrite_blocks (bool fix_virtual_phis)
1146 {
1147 struct dom_walk_data walk_data;
1148
1149 /* Rewrite all the basic blocks in the program. */
1150 timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
1151
1152 /* Setup callbacks for the generic dominator tree walker. */
1153 walk_data.walk_stmts_backward = false;
1154 walk_data.dom_direction = CDI_DOMINATORS;
1155 walk_data.initialize_block_local_data = NULL;
1156 walk_data.before_dom_children_before_stmts = rewrite_initialize_block;
1157 walk_data.before_dom_children_walk_stmts = rewrite_stmt;
1158 walk_data.before_dom_children_after_stmts = NULL;
1159 if (!fix_virtual_phis)
1160 walk_data.before_dom_children_after_stmts = rewrite_add_phi_arguments;
1161 else
1162 walk_data.before_dom_children_after_stmts = rewrite_virtual_phi_arguments;
1163
1164 walk_data.after_dom_children_before_stmts = NULL;
1165 walk_data.after_dom_children_walk_stmts = NULL;
1166 walk_data.after_dom_children_after_stmts = rewrite_finalize_block;
1167 walk_data.global_data = NULL;
1168 walk_data.block_local_data_size = 0;
1169
1170 block_defs_stack = VEC_alloc (tree_on_heap, 10);
1171
1172 /* Initialize the dominator walker. */
1173 init_walk_dominator_tree (&walk_data);
1174
1175 /* Recursively walk the dominator tree rewriting each statement in
1176 each basic block. */
1177 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1178
1179 /* Finalize the dominator walker. */
1180 fini_walk_dominator_tree (&walk_data);
1181
1182 /* Debugging dumps. */
1183 if (dump_file && (dump_flags & TDF_STATS))
1184 {
1185 dump_dfa_stats (dump_file);
1186 dump_tree_ssa_stats (dump_file);
1187 }
1188
1189 htab_delete (def_blocks);
1190 def_blocks = NULL;
1191
1192 VEC_free (tree_on_heap, block_defs_stack);
1193 block_defs_stack = NULL;
1194
1195 timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS);
1196 }
1197
1198
1199 /* Block initialization routine for mark_def_sites. Clear the
1200 KILLS bitmap at the start of each block. */
1201
1202 static void
1203 mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
1204 basic_block bb ATTRIBUTE_UNUSED)
1205 {
1206 struct mark_def_sites_global_data *gd = walk_data->global_data;
1207 bitmap kills = gd->kills;
1208 bitmap_clear (kills);
1209 }
1210
1211
1212 /* Mark the definition site blocks for each variable, so that we know where
1213 the variable is actually live. */
1214
1215 static void
1216 mark_def_site_blocks (void)
1217 {
1218 size_t i;
1219 struct dom_walk_data walk_data;
1220 struct mark_def_sites_global_data mark_def_sites_global_data;
1221
1222 /* Allocate memory for the DEF_BLOCKS hash table. */
1223 def_blocks = htab_create (VARRAY_ACTIVE_SIZE (referenced_vars),
1224 def_blocks_hash, def_blocks_eq, def_blocks_free);
1225
1226 for (i = 0; i < num_referenced_vars; i++)
1227 set_current_def (referenced_var (i), NULL_TREE);
1228
1229 /* Ensure that the dominance information is OK. */
1230 calculate_dominance_info (CDI_DOMINATORS);
1231
1232 /* Setup callbacks for the generic dominator tree walker to find and
1233 mark definition sites. */
1234 walk_data.walk_stmts_backward = false;
1235 walk_data.dom_direction = CDI_DOMINATORS;
1236 walk_data.initialize_block_local_data = NULL;
1237 walk_data.before_dom_children_before_stmts = mark_def_sites_initialize_block;
1238 walk_data.before_dom_children_walk_stmts = mark_def_sites;
1239 walk_data.before_dom_children_after_stmts = NULL;
1240 walk_data.after_dom_children_before_stmts = NULL;
1241 walk_data.after_dom_children_walk_stmts = NULL;
1242 walk_data.after_dom_children_after_stmts = NULL;
1243
1244 /* Notice that this bitmap is indexed using variable UIDs, so it must be
1245 large enough to accommodate all the variables referenced in the
1246 function, not just the ones we are renaming. */
1247 mark_def_sites_global_data.kills = BITMAP_ALLOC (NULL);
1248 walk_data.global_data = &mark_def_sites_global_data;
1249
1250 /* We do not have any local data. */
1251 walk_data.block_local_data_size = 0;
1252
1253 /* Initialize the dominator walker. */
1254 init_walk_dominator_tree (&walk_data);
1255
1256 /* Recursively walk the dominator tree. */
1257 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1258
1259 /* Finalize the dominator walker. */
1260 fini_walk_dominator_tree (&walk_data);
1261
1262 /* We no longer need this bitmap, clear and free it. */
1263 BITMAP_FREE (mark_def_sites_global_data.kills);
1264 }
1265
1266
1267 /* Main entry point into the SSA builder. The renaming process
1268 proceeds in five main phases:
1269
1270 1- If VARS_TO_RENAME has any entries, any existing PHI nodes for
1271 those variables are removed from the flow graph so that they can
1272 be computed again.
1273
1274 2- Compute dominance frontier and immediate dominators, needed to
1275 insert PHI nodes and rename the function in dominator tree
1276 order.
1277
1278 3- Find and mark all the blocks that define variables
1279 (mark_def_site_blocks).
1280
1281 4- Insert PHI nodes at dominance frontiers (insert_phi_nodes).
1282
1283 5- Rename all the blocks (rewrite_blocks) and statements in the program.
1284
1285 Steps 3 and 5 are done using the dominator tree walker
1286 (walk_dominator_tree).
1287
1288 ALL is true if all variables should be renamed (otherwise just those
1289 mentioned in vars_to_rename are taken into account). */
1290
1291 void
1292 rewrite_into_ssa (bool all)
1293 {
1294 bitmap *dfs;
1295 basic_block bb;
1296 bitmap old_vars_to_rename = vars_to_rename;
1297
1298 timevar_push (TV_TREE_SSA_OTHER);
1299
1300 if (all)
1301 vars_to_rename = NULL;
1302 else
1303 {
1304 /* Initialize the array of variables to rename. */
1305 gcc_assert (vars_to_rename);
1306
1307 if (bitmap_empty_p (vars_to_rename))
1308 {
1309 timevar_pop (TV_TREE_SSA_OTHER);
1310 return;
1311 }
1312
1313 invalidate_name_tags (vars_to_rename);
1314
1315 /* Now remove all the existing PHI nodes (if any) for the variables
1316 that we are about to rename into SSA. */
1317 remove_all_phi_nodes_for (vars_to_rename);
1318 }
1319
1320 mark_def_site_blocks ();
1321
1322 /* Initialize dominance frontier and immediate dominator bitmaps.
1323 Also count the number of predecessors for each block. Doing so
1324 can save significant time during PHI insertion for large graphs. */
1325 dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
1326 FOR_EACH_BB (bb)
1327 dfs[bb->index] = BITMAP_ALLOC (NULL);
1328
1329 /* Compute dominance frontiers. */
1330 compute_dominance_frontiers (dfs);
1331
1332 /* Insert PHI nodes at dominance frontiers of definition blocks. */
1333 insert_phi_nodes (dfs, NULL);
1334
1335 rewrite_blocks (false);
1336
1337 /* Free allocated memory. */
1338 FOR_EACH_BB (bb)
1339 BITMAP_FREE (dfs[bb->index]);
1340 free (dfs);
1341
1342 vars_to_rename = old_vars_to_rename;
1343 timevar_pop (TV_TREE_SSA_OTHER);
1344 }
1345
1346
1347 /* Rewrites all variables into SSA. */
1348
1349 static void
1350 rewrite_all_into_ssa (void)
1351 {
1352 rewrite_into_ssa (true);
1353 }
1354
1355 struct tree_opt_pass pass_build_ssa =
1356 {
1357 "ssa", /* name */
1358 NULL, /* gate */
1359 rewrite_all_into_ssa, /* execute */
1360 NULL, /* sub */
1361 NULL, /* next */
1362 0, /* static_pass_number */
1363 0, /* tv_id */
1364 PROP_cfg | PROP_referenced_vars, /* properties_required */
1365 PROP_ssa, /* properties_provided */
1366 0, /* properties_destroyed */
1367 0, /* todo_flags_start */
1368 TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
1369 0 /* letter */
1370 };
1371
1372
1373 /* Rewrite the def-def chains of virtual operands so that they have
1374 the correct reaching definitions. */
1375
1376 void
1377 rewrite_def_def_chains (void)
1378 {
1379 /* Ensure that the dominance information is OK. */
1380 calculate_dominance_info (CDI_DOMINATORS);
1381 mark_def_site_blocks ();
1382 rewrite_blocks (true);
1383 }
1384
1385
1386
1387 /*---------------------------------------------------------------------------
1388 Functions to fix a program in invalid SSA form into valid SSA
1389 form. The main entry point here is rewrite_ssa_into_ssa.
1390 ---------------------------------------------------------------------------*/
1391
1392 /* Called after visiting basic block BB. Restore CURRDEFS to its
1393 original value. */
1394
1395 static void
1396 ssa_rewrite_finalize_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
1397 basic_block bb ATTRIBUTE_UNUSED)
1398 {
1399
1400 /* Step 5. Restore the current reaching definition for each variable
1401 referenced in the block (in reverse order). */
1402 while (VEC_length (tree_on_heap, block_defs_stack) > 0)
1403 {
1404 tree var = VEC_pop (tree_on_heap, block_defs_stack);
1405 tree saved_def;
1406
1407 if (var == NULL)
1408 break;
1409
1410 saved_def = VEC_pop (tree_on_heap, block_defs_stack);
1411 set_current_def (var, saved_def);
1412 }
1413 }
1414
1415
1416 /* Register DEF (an SSA_NAME) to be a new definition for the original
1417 ssa name VAR and push VAR's current reaching definition
1418 into the stack pointed by BLOCK_DEFS_P. */
1419
1420 static void
1421 ssa_register_new_def (tree var, tree def)
1422 {
1423 tree currdef;
1424
1425 /* If this variable is set in a single basic block and all uses are
1426 dominated by the set(s) in that single basic block, then there is
1427 nothing to do. TODO we should not be called at all, and just
1428 keep the original name. */
1429 if (get_phi_state (var) == NEED_PHI_STATE_NO)
1430 {
1431 set_current_def (var, def);
1432 return;
1433 }
1434
1435 currdef = get_current_def (var);
1436
1437 /* Push the current reaching definition into *BLOCK_DEFS_P. This stack is
1438 later used by the dominator tree callbacks to restore the reaching
1439 definitions for all the variables defined in the block after a recursive
1440 visit to all its immediately dominated blocks. */
1441 VEC_safe_push (tree_on_heap, block_defs_stack, currdef);
1442 VEC_safe_push (tree_on_heap, block_defs_stack, var);
1443
1444 /* Set the current reaching definition for VAR to be DEF. */
1445 set_current_def (var, def);
1446 }
1447
1448
1449 /* Same as rewrite_stmt, for rewriting ssa names. */
1450
1451 static void
1452 ssa_rewrite_stmt (struct dom_walk_data *walk_data,
1453 basic_block bb ATTRIBUTE_UNUSED,
1454 block_stmt_iterator si)
1455 {
1456 stmt_ann_t ann;
1457 tree stmt, var;
1458 ssa_op_iter iter;
1459 use_operand_p use_p;
1460 def_operand_p def_p;
1461 sbitmap names_to_rename = walk_data->global_data;
1462
1463 stmt = bsi_stmt (si);
1464 ann = stmt_ann (stmt);
1465
1466 if (dump_file && (dump_flags & TDF_DETAILS))
1467 {
1468 fprintf (dump_file, "Renaming statement ");
1469 print_generic_stmt (dump_file, stmt, TDF_SLIM);
1470 fprintf (dump_file, "\n");
1471 }
1472
1473 /* We have just scanned the code for operands. No statement should
1474 be modified. */
1475 gcc_assert (!ann->modified);
1476
1477 /* Step 1. Rewrite USES and VUSES in the statement. */
1478 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES | SSA_OP_ALL_KILLS)
1479 {
1480 if (TEST_BIT (names_to_rename, SSA_NAME_VERSION (USE_FROM_PTR (use_p))))
1481 SET_USE (use_p, get_reaching_def (USE_FROM_PTR (use_p)));
1482 }
1483
1484 /* Step 2. Register the statement's DEF and VDEF operands. */
1485 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
1486 {
1487 var = DEF_FROM_PTR (def_p);
1488
1489 if (!TEST_BIT (names_to_rename, SSA_NAME_VERSION (var)))
1490 continue;
1491
1492 SET_DEF (def_p, duplicate_ssa_name (var, stmt));
1493 ssa_register_new_def (var, DEF_FROM_PTR (def_p));
1494 }
1495 }
1496
1497
1498 /* Ditto, for ssa name rewriting. */
1499
1500 static void
1501 ssa_rewrite_phi_arguments (struct dom_walk_data *walk_data, basic_block bb)
1502 {
1503 edge e;
1504 sbitmap names_to_rename = walk_data->global_data;
1505 use_operand_p op;
1506 edge_iterator ei;
1507
1508 FOR_EACH_EDGE (e, ei, bb->succs)
1509 {
1510 tree phi;
1511
1512 if (e->dest == EXIT_BLOCK_PTR)
1513 continue;
1514
1515 for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
1516 {
1517 op = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
1518 if (TREE_CODE (USE_FROM_PTR (op)) != SSA_NAME)
1519 continue;
1520
1521 if (!TEST_BIT (names_to_rename, SSA_NAME_VERSION (USE_FROM_PTR (op))))
1522 continue;
1523
1524 SET_USE (op, get_reaching_def (USE_FROM_PTR (op)));
1525 if (e->flags & EDGE_ABNORMAL)
1526 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (op)) = 1;
1527 }
1528 }
1529 }
1530
1531 /* Ditto, for rewriting ssa names. */
1532
1533 static void
1534 ssa_rewrite_initialize_block (struct dom_walk_data *walk_data, basic_block bb)
1535 {
1536 tree phi, new_name;
1537 sbitmap names_to_rename = walk_data->global_data;
1538 edge e;
1539 bool abnormal_phi;
1540 edge_iterator ei;
1541
1542 if (dump_file && (dump_flags & TDF_DETAILS))
1543 fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
1544
1545 /* Mark the unwind point for this block. */
1546 VEC_safe_push (tree_on_heap, block_defs_stack, NULL_TREE);
1547
1548 FOR_EACH_EDGE (e, ei, bb->preds)
1549 if (e->flags & EDGE_ABNORMAL)
1550 break;
1551 abnormal_phi = (e != NULL);
1552
1553 /* Step 1. Register new definitions for every PHI node in the block.
1554 Conceptually, all the PHI nodes are executed in parallel and each PHI
1555 node introduces a new version for the associated variable. */
1556 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1557 {
1558 tree result = PHI_RESULT (phi);
1559
1560 if (TEST_BIT (names_to_rename, SSA_NAME_VERSION (result)))
1561 {
1562 new_name = duplicate_ssa_name (result, phi);
1563 SET_PHI_RESULT (phi, new_name);
1564
1565 if (abnormal_phi)
1566 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name) = 1;
1567 ssa_register_new_def (result, new_name);
1568 }
1569 }
1570 }
1571
1572
1573 /* Same as mark_def_sites, but works over SSA names. */
1574
1575 static void
1576 ssa_mark_def_sites (struct dom_walk_data *walk_data,
1577 basic_block bb,
1578 block_stmt_iterator bsi)
1579 {
1580 struct mark_def_sites_global_data *gd = walk_data->global_data;
1581 bitmap kills = gd->kills;
1582 size_t uid, def_uid;
1583 tree stmt, use, def;
1584 ssa_op_iter iter;
1585
1586 /* Mark all the blocks that have definitions for each variable in the
1587 names_to_rename bitmap. */
1588 stmt = bsi_stmt (bsi);
1589 get_stmt_operands (stmt);
1590
1591 /* If a variable is used before being set, then the variable is live
1592 across a block boundary, so mark it live-on-entry to BB. */
1593 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_ALL_USES | SSA_OP_ALL_KILLS)
1594 {
1595 uid = SSA_NAME_VERSION (use);
1596
1597 if (TEST_BIT (gd->names_to_rename, uid)
1598 && !bitmap_bit_p (kills, uid))
1599 set_livein_block (use, bb);
1600 }
1601
1602 /* Now process the definition made by this statement. Mark the
1603 variables in KILLS. */
1604 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
1605 {
1606 def_uid = SSA_NAME_VERSION (def);
1607
1608 if (TEST_BIT (gd->names_to_rename, def_uid))
1609 {
1610 set_def_block (def, bb, false, true);
1611 bitmap_set_bit (kills, def_uid);
1612 }
1613 }
1614 }
1615
1616
1617 /* Block initialization routine for mark_def_sites. Clear the
1618 KILLS bitmap at the start of each block. */
1619
1620 static void
1621 ssa_mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
1622 basic_block bb)
1623 {
1624 struct mark_def_sites_global_data *gd = walk_data->global_data;
1625 bitmap kills = gd->kills;
1626 tree phi, def;
1627 unsigned def_uid;
1628
1629 bitmap_clear (kills);
1630
1631 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1632 {
1633 def = PHI_RESULT (phi);
1634 def_uid = SSA_NAME_VERSION (def);
1635
1636 if (!TEST_BIT (gd->names_to_rename, def_uid))
1637 continue;
1638
1639 set_def_block (def, bb, true, true);
1640 bitmap_set_bit (kills, def_uid);
1641 }
1642 }
1643
1644 /* Marks ssa names used as arguments of phis at the end of BB. */
1645
1646 static void
1647 ssa_mark_phi_uses (struct dom_walk_data *walk_data, basic_block bb)
1648 {
1649 struct mark_def_sites_global_data *gd = walk_data->global_data;
1650 bitmap kills = gd->kills;
1651 edge e;
1652 tree phi, use;
1653 unsigned uid;
1654 edge_iterator ei;
1655
1656 FOR_EACH_EDGE (e, ei, bb->succs)
1657 {
1658 if (e->dest == EXIT_BLOCK_PTR)
1659 continue;
1660
1661 for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
1662 {
1663 use = PHI_ARG_DEF_FROM_EDGE (phi, e);
1664 if (TREE_CODE (use) != SSA_NAME)
1665 continue;
1666
1667 uid = SSA_NAME_VERSION (use);
1668
1669 if (TEST_BIT (gd->names_to_rename, uid)
1670 && !bitmap_bit_p (kills, uid))
1671 set_livein_block (use, bb);
1672 }
1673 }
1674 }
1675
1676
1677 /* The marked ssa names may have more than one definition;
1678 add PHI nodes and rewrite them to fix this. */
1679
1680 void
1681 rewrite_ssa_into_ssa (void)
1682 {
1683 bitmap *dfs;
1684 basic_block bb;
1685 struct dom_walk_data walk_data;
1686 struct mark_def_sites_global_data mark_def_sites_global_data;
1687 unsigned i;
1688 sbitmap snames_to_rename;
1689 bitmap to_rename;
1690 bitmap_iterator bi;
1691
1692 if (!any_marked_for_rewrite_p ())
1693 return;
1694 to_rename = marked_ssa_names ();
1695
1696 timevar_push (TV_TREE_SSA_OTHER);
1697
1698 /* Allocate memory for the DEF_BLOCKS hash table. */
1699 def_blocks = htab_create (num_ssa_names,
1700 def_blocks_hash, def_blocks_eq, def_blocks_free);
1701
1702 /* Initialize dominance frontier and immediate dominator bitmaps.
1703 Also count the number of predecessors for each block. Doing so
1704 can save significant time during PHI insertion for large graphs. */
1705 dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
1706 FOR_EACH_BB (bb)
1707 dfs[bb->index] = BITMAP_ALLOC (NULL);
1708
1709 /* Ensure that the dominance information is OK. */
1710 calculate_dominance_info (CDI_DOMINATORS);
1711
1712 /* Compute dominance frontiers. */
1713 compute_dominance_frontiers (dfs);
1714
1715 /* Setup callbacks for the generic dominator tree walker to find and
1716 mark definition sites. */
1717 walk_data.walk_stmts_backward = false;
1718 walk_data.dom_direction = CDI_DOMINATORS;
1719 walk_data.initialize_block_local_data = NULL;
1720 walk_data.before_dom_children_before_stmts
1721 = ssa_mark_def_sites_initialize_block;
1722 walk_data.before_dom_children_walk_stmts = ssa_mark_def_sites;
1723 walk_data.before_dom_children_after_stmts = ssa_mark_phi_uses;
1724 walk_data.after_dom_children_before_stmts = NULL;
1725 walk_data.after_dom_children_walk_stmts = NULL;
1726 walk_data.after_dom_children_after_stmts = NULL;
1727
1728 snames_to_rename = sbitmap_alloc (num_ssa_names);
1729 sbitmap_zero (snames_to_rename);
1730 EXECUTE_IF_SET_IN_BITMAP (to_rename, 0, i, bi)
1731 {
1732 SET_BIT (snames_to_rename, i);
1733 set_current_def (ssa_name (i), NULL_TREE);
1734 }
1735
1736 mark_def_sites_global_data.kills = BITMAP_ALLOC (NULL);
1737 mark_def_sites_global_data.names_to_rename = snames_to_rename;
1738 walk_data.global_data = &mark_def_sites_global_data;
1739
1740 block_defs_stack = VEC_alloc (tree_on_heap, 10);
1741
1742 /* We do not have any local data. */
1743 walk_data.block_local_data_size = 0;
1744
1745 /* Initialize the dominator walker. */
1746 init_walk_dominator_tree (&walk_data);
1747
1748 /* Recursively walk the dominator tree. */
1749 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1750
1751 /* Finalize the dominator walker. */
1752 fini_walk_dominator_tree (&walk_data);
1753
1754 /* We no longer need this bitmap, clear and free it. */
1755 BITMAP_FREE (mark_def_sites_global_data.kills);
1756
1757 /* Insert PHI nodes at dominance frontiers of definition blocks. */
1758 insert_phi_nodes (dfs, to_rename);
1759
1760 /* Rewrite all the basic blocks in the program. */
1761 timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
1762
1763 /* Setup callbacks for the generic dominator tree walker. */
1764 walk_data.walk_stmts_backward = false;
1765 walk_data.dom_direction = CDI_DOMINATORS;
1766 walk_data.initialize_block_local_data = NULL;
1767 walk_data.before_dom_children_before_stmts = ssa_rewrite_initialize_block;
1768 walk_data.before_dom_children_walk_stmts = ssa_rewrite_stmt;
1769 walk_data.before_dom_children_after_stmts = ssa_rewrite_phi_arguments;
1770 walk_data.after_dom_children_before_stmts = NULL;
1771 walk_data.after_dom_children_walk_stmts = NULL;
1772 walk_data.after_dom_children_after_stmts = ssa_rewrite_finalize_block;
1773 walk_data.global_data = snames_to_rename;
1774 walk_data.block_local_data_size = 0;
1775
1776 /* Initialize the dominator walker. */
1777 init_walk_dominator_tree (&walk_data);
1778
1779 /* Recursively walk the dominator tree rewriting each statement in
1780 each basic block. */
1781 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1782
1783 /* Finalize the dominator walker. */
1784 fini_walk_dominator_tree (&walk_data);
1785
1786 unmark_all_for_rewrite ();
1787
1788 EXECUTE_IF_SET_IN_BITMAP (to_rename, 0, i, bi)
1789 {
1790 /* Free SSA_NAME_AUX. We don't have to zero it because
1791 release_ssa_name will. */
1792 if (SSA_NAME_AUX (ssa_name (i)))
1793 free (SSA_NAME_AUX (ssa_name (i)));
1794
1795 release_ssa_name (ssa_name (i));
1796 }
1797
1798 sbitmap_free (snames_to_rename);
1799
1800 timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS);
1801
1802 /* Debugging dumps. */
1803 if (dump_file && (dump_flags & TDF_STATS))
1804 {
1805 dump_dfa_stats (dump_file);
1806 dump_tree_ssa_stats (dump_file);
1807 }
1808
1809 /* Free allocated memory. */
1810 FOR_EACH_BB (bb)
1811 BITMAP_FREE (dfs[bb->index]);
1812 free (dfs);
1813
1814 htab_delete (def_blocks);
1815
1816 #ifdef ENABLE_CHECKING
1817 for (i = 1; i < num_ssa_names; i++)
1818 {
1819 tree name = ssa_name (i);
1820 if (!name)
1821 continue;
1822
1823 gcc_assert (SSA_NAME_AUX (name) == NULL);
1824 }
1825 #endif
1826
1827 BITMAP_FREE (to_rename);
1828
1829 VEC_free (tree_on_heap, block_defs_stack);
1830 block_defs_stack = NULL;
1831 timevar_pop (TV_TREE_SSA_OTHER);
1832 }
This page took 0.112097 seconds and 4 git commands to generate.