PR other/16240
[official-gcc.git] / gcc / tree-into-ssa.c
blob0a20d2d8a43ff51829bfa819c5e93be8af3b3b32
1 /* Rewrite a program in Normal form into SSA.
2 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
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.
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.
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. */
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 "tree-alias-common.h"
45 #include "hashtab.h"
46 #include "tree-dump.h"
47 #include "tree-pass.h"
48 #include "cfgloop.h"
49 #include "domwalk.h"
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. */
58 /* Structure to map a variable VAR to the set of blocks that contain
59 definitions for VAR. */
60 struct def_blocks_d
62 /* The variable. */
63 tree var;
65 /* Blocks that contain definitions of VAR. Bit I will be set if the
66 Ith block contains a definition of VAR. */
67 bitmap def_blocks;
69 /* Blocks where VAR is live-on-entry. Similar semantics as
70 DEF_BLOCKS. */
71 bitmap livein_blocks;
74 /* Each entry in DEF_BLOCKS contains an element of type STRUCT
75 DEF_BLOCKS_D, mapping a variable VAR to a bitmap describing all the
76 basic blocks where VAR is defined (assigned a new value). It also
77 contains a bitmap of all the blocks where VAR is live-on-entry
78 (i.e., there is a use of VAR in block B without a preceding
79 definition in B). The live-on-entry information is used when
80 computing PHI pruning heuristics. */
81 static htab_t def_blocks;
83 /* Global data to attach to the main dominator walk structure. */
84 struct mark_def_sites_global_data
86 /* This sbitmap contains the variables which are set before they
87 are used in a basic block. We keep it as a global variable
88 solely to avoid the overhead of allocating and deallocating
89 the bitmap. */
90 sbitmap kills;
93 struct rewrite_block_data
95 varray_type block_defs;
99 /* Local functions. */
100 static void rewrite_finalize_block (struct dom_walk_data *, basic_block);
101 static void rewrite_initialize_block_local_data (struct dom_walk_data *,
102 basic_block, bool);
103 static void rewrite_initialize_block (struct dom_walk_data *, basic_block);
104 static void rewrite_add_phi_arguments (struct dom_walk_data *, basic_block);
105 static void mark_def_sites (struct dom_walk_data *walk_data,
106 basic_block bb, block_stmt_iterator);
107 static void mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
108 basic_block bb);
109 static void compute_global_livein (bitmap, bitmap);
110 static void set_def_block (tree, basic_block);
111 static void set_livein_block (tree, basic_block);
112 static bool prepare_use_operand_for_rename (use_operand_p op_p, size_t *uid_p);
113 static bool prepare_def_operand_for_rename (tree def, size_t *uid_p);
114 static void insert_phi_nodes (bitmap *);
115 static void rewrite_stmt (struct dom_walk_data *, basic_block,
116 block_stmt_iterator);
117 static inline void rewrite_operand (use_operand_p);
118 static void insert_phi_nodes_for (tree, bitmap *, varray_type *);
119 static tree get_reaching_def (tree);
120 static hashval_t def_blocks_hash (const void *);
121 static int def_blocks_eq (const void *, const void *);
122 static void def_blocks_free (void *);
123 static int debug_def_blocks_r (void **, void *);
124 static inline struct def_blocks_d *get_def_blocks_for (tree);
125 static inline struct def_blocks_d *find_def_blocks_for (tree);
126 static void htab_statistics (FILE *, htab_t);
128 /* Compute global livein information given the set of blockx where
129 an object is locally live at the start of the block (LIVEIN)
130 and the set of blocks where the object is defined (DEF_BLOCKS).
132 Note: This routine augments the existing local livein information
133 to include global livein (i.e., it modifies the underlying bitmap
134 for LIVEIN). */
136 static void
137 compute_global_livein (bitmap livein, bitmap def_blocks)
139 basic_block bb, *worklist, *tos;
140 int i;
142 tos = worklist
143 = (basic_block *) xmalloc (sizeof (basic_block) * (last_basic_block + 1));
145 EXECUTE_IF_SET_IN_BITMAP (livein, 0, i,
147 *tos++ = BASIC_BLOCK (i);
150 /* Iterate until the worklist is empty. */
151 while (tos != worklist)
153 edge e;
155 /* Pull a block off the worklist. */
156 bb = *--tos;
158 /* For each predecessor block. */
159 for (e = bb->pred; e; e = e->pred_next)
161 basic_block pred = e->src;
162 int pred_index = pred->index;
164 /* None of this is necessary for the entry block. */
165 if (pred != ENTRY_BLOCK_PTR
166 && ! bitmap_bit_p (livein, pred_index)
167 && ! bitmap_bit_p (def_blocks, pred_index))
169 *tos++ = pred;
170 bitmap_set_bit (livein, pred_index);
175 free (worklist);
179 /* Block initialization routine for mark_def_sites. Clear the
180 KILLS bitmap at the start of each block. */
182 static void
183 mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
184 basic_block bb ATTRIBUTE_UNUSED)
186 struct mark_def_sites_global_data *gd = walk_data->global_data;
187 sbitmap kills = gd->kills;
189 sbitmap_zero (kills);
193 /* Call back for walk_dominator_tree used to collect definition sites
194 for every variable in the function. For every statement S in block
197 1- Variables defined by S in DEF_OPS(S) are marked in the bitmap
198 WALK_DATA->GLOBAL_DATA->KILLS.
200 2- If S uses a variable VAR and there is no preceding kill of VAR,
201 then it is marked in marked in the LIVEIN_BLOCKS bitmap
202 associated with VAR.
204 This information is used to determine which variables are live
205 across block boundaries to reduce the number of PHI nodes
206 we create. */
208 static void
209 mark_def_sites (struct dom_walk_data *walk_data,
210 basic_block bb,
211 block_stmt_iterator bsi)
213 struct mark_def_sites_global_data *gd = walk_data->global_data;
214 sbitmap kills = gd->kills;
215 v_may_def_optype v_may_defs;
216 v_must_def_optype v_must_defs;
217 vuse_optype vuses;
218 def_optype defs;
219 use_optype uses;
220 size_t i, uid;
221 tree stmt;
222 stmt_ann_t ann;
224 /* Mark all the blocks that have definitions for each variable in the
225 VARS_TO_RENAME bitmap. */
226 stmt = bsi_stmt (bsi);
227 get_stmt_operands (stmt);
228 ann = stmt_ann (stmt);
230 /* If a variable is used before being set, then the variable is live
231 across a block boundary, so mark it live-on-entry to BB. */
232 uses = USE_OPS (ann);
233 for (i = 0; i < NUM_USES (uses); i++)
235 use_operand_p use_p = USE_OP_PTR (uses, i);
237 if (prepare_use_operand_for_rename (use_p, &uid)
238 && !TEST_BIT (kills, uid))
239 set_livein_block (USE_FROM_PTR (use_p), bb);
242 /* Similarly for virtual uses. */
243 vuses = VUSE_OPS (ann);
244 for (i = 0; i < NUM_VUSES (vuses); i++)
246 use_operand_p use_p = VUSE_OP_PTR (vuses, i);
248 if (prepare_use_operand_for_rename (use_p, &uid))
249 set_livein_block (USE_FROM_PTR (use_p), bb);
252 /* Note that virtual definitions are irrelevant for computing KILLS
253 because a V_MAY_DEF does not constitute a killing definition of the
254 variable. However, the operand of a virtual definitions is a use
255 of the variable, so it may cause the variable to be considered
256 live-on-entry. */
257 v_may_defs = V_MAY_DEF_OPS (ann);
258 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
260 use_operand_p use_p = V_MAY_DEF_OP_PTR (v_may_defs, i);
261 if (prepare_use_operand_for_rename (use_p, &uid))
263 /* If we do not already have an SSA_NAME for our destination,
264 then set the destination to the source. */
265 if (TREE_CODE (V_MAY_DEF_RESULT (v_may_defs, i)) != SSA_NAME)
266 SET_V_MAY_DEF_RESULT (v_may_defs, i, USE_FROM_PTR (use_p));
268 set_livein_block (USE_FROM_PTR (use_p), bb);
269 set_def_block (V_MAY_DEF_RESULT (v_may_defs, i), bb);
273 /* Now process the virtual must-defs made by this statement. */
274 v_must_defs = V_MUST_DEF_OPS (ann);
275 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
277 tree def = V_MUST_DEF_OP (v_must_defs, i);
279 if (prepare_def_operand_for_rename (def, &uid))
281 set_def_block (def, bb);
282 SET_BIT (kills, uid);
286 /* Now process the definition made by this statement. Mark the
287 variables in KILLS. */
288 defs = DEF_OPS (ann);
289 for (i = 0; i < NUM_DEFS (defs); i++)
291 tree def = DEF_OP (defs, i);
293 if (prepare_def_operand_for_rename (def, &uid))
295 set_def_block (def, bb);
296 SET_BIT (kills, uid);
302 /* Mark block BB as the definition site for variable VAR. */
304 static void
305 set_def_block (tree var, basic_block bb)
307 struct def_blocks_d *db_p;
308 enum need_phi_state state;
310 if (TREE_CODE (var) == SSA_NAME)
311 var = SSA_NAME_VAR (var);
313 state = var_ann (var)->need_phi_state;
314 db_p = get_def_blocks_for (var);
316 /* Set the bit corresponding to the block where VAR is defined. */
317 bitmap_set_bit (db_p->def_blocks, bb->index);
319 /* Keep track of whether or not we may need to insert phi nodes.
321 If we are in the UNKNOWN state, then this is the first definition
322 of VAR. Additionally, we have not seen any uses of VAR yet, so
323 we do not need a phi node for this variable at this time (i.e.,
324 transition to NEED_PHI_STATE_NO).
326 If we are in any other state, then we either have multiple definitions
327 of this variable occurring in different blocks or we saw a use of the
328 variable which was not dominated by the block containing the
329 definition(s). In this case we may need a PHI node, so enter
330 state NEED_PHI_STATE_MAYBE. */
331 if (state == NEED_PHI_STATE_UNKNOWN)
332 var_ann (var)->need_phi_state = NEED_PHI_STATE_NO;
333 else
334 var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
338 /* Mark block BB as having VAR live at the entry to BB. */
340 static void
341 set_livein_block (tree var, basic_block bb)
343 struct def_blocks_d *db_p;
344 enum need_phi_state state = var_ann (var)->need_phi_state;
346 db_p = get_def_blocks_for (var);
348 /* Set the bit corresponding to the block where VAR is live in. */
349 bitmap_set_bit (db_p->livein_blocks, bb->index);
351 /* Keep track of whether or not we may need to insert phi nodes.
353 If we reach here in NEED_PHI_STATE_NO, see if this use is dominated
354 by the single block containing the definition(s) of this variable. If
355 it is, then we remain in NEED_PHI_STATE_NO, otherwise we transition to
356 NEED_PHI_STATE_MAYBE. */
357 if (state == NEED_PHI_STATE_NO)
359 int def_block_index = bitmap_first_set_bit (db_p->def_blocks);
361 if (def_block_index == -1
362 || ! dominated_by_p (CDI_DOMINATORS, bb,
363 BASIC_BLOCK (def_block_index)))
364 var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
366 else
367 var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
371 /* If the use operand pointed to by OP_P needs to be renamed, then strip away
372 any SSA_NAME wrapping the operand, set *UID_P to the underlying variable's
373 uid, and return true. Otherwise return false. If the operand was an
374 SSA_NAME, change it to the stipped name. */
376 static bool
377 prepare_use_operand_for_rename (use_operand_p op_p, size_t *uid_p)
379 tree use = USE_FROM_PTR (op_p);
380 tree var = (TREE_CODE (use) != SSA_NAME) ? use : SSA_NAME_VAR (use);
381 *uid_p = var_ann (var)->uid;
383 /* Ignore variables that don't need to be renamed. */
384 if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
385 return false;
387 /* The variable needs to be renamed. If this is a use which already
388 has an SSA_NAME, then strip it off.
390 By not throwing away SSA_NAMEs on assignments, we avoid a lot of
391 useless churn of SSA_NAMEs without having to overly complicate the
392 renamer. */
393 if (TREE_CODE (use) == SSA_NAME)
394 SET_USE (op_p, var);
396 return true;
399 /* If the def variable DEF needs to be renamed, then strip away any SSA_NAME
400 wrapping the operand, set *UID_P to the underlying variable's uid and return
401 true. Otherwise return false. */
403 static bool
404 prepare_def_operand_for_rename (tree def, size_t *uid_p)
406 tree var = (TREE_CODE (def) != SSA_NAME) ? def : SSA_NAME_VAR (def);
407 *uid_p = var_ann (var)->uid;
409 /* Ignore variables that don't need to be renamed. */
410 if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
411 return false;
413 return true;
416 /* Helper for insert_phi_nodes. If VAR needs PHI nodes, insert them
417 at the dominance frontier (DFS) of blocks defining VAR. */
419 static inline
420 void insert_phi_nodes_1 (tree var, bitmap *dfs, varray_type *work_stack)
422 var_ann_t ann = var_ann (var);
423 if (ann->need_phi_state != NEED_PHI_STATE_NO)
424 insert_phi_nodes_for (var, dfs, work_stack);
428 /* Insert PHI nodes at the dominance frontier of blocks with variable
429 definitions. DFS contains the dominance frontier information for
430 the flowgraph. PHI nodes will only be inserted at the dominance
431 frontier of definition blocks for variables whose NEED_PHI_STATE
432 annotation is marked as ``maybe'' or ``unknown'' (computed by
433 mark_def_sites). */
435 static void
436 insert_phi_nodes (bitmap *dfs)
438 size_t i;
439 varray_type work_stack;
441 timevar_push (TV_TREE_INSERT_PHI_NODES);
443 /* Array WORK_STACK is a stack of CFG blocks. Each block that contains
444 an assignment or PHI node will be pushed to this stack. */
445 VARRAY_BB_INIT (work_stack, last_basic_block, "work_stack");
447 /* Iterate over all variables in VARS_TO_RENAME. For each variable, add
448 to the work list all the blocks that have a definition for the
449 variable. PHI nodes will be added to the dominance frontier blocks of
450 each definition block. */
451 if (vars_to_rename)
452 EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i,
453 insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack));
454 else
455 for (i = 0; i < num_referenced_vars; i++)
456 insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack);
458 timevar_pop (TV_TREE_INSERT_PHI_NODES);
462 /* Perform a depth-first traversal of the dominator tree looking for
463 variables to rename. BB is the block where to start searching.
464 Renaming is a five step process:
466 1- Every definition made by PHI nodes at the start of the blocks is
467 registered as the current definition for the corresponding variable.
469 2- Every statement in BB is rewritten. USE and VUSE operands are
470 rewritten with their corresponding reaching definition. DEF and
471 VDEF targets are registered as new definitions.
473 3- All the PHI nodes in successor blocks of BB are visited. The
474 argument corresponding to BB is replaced with its current reaching
475 definition.
477 4- Recursively rewrite every dominator child block of BB.
479 5- Restore (in reverse order) the current reaching definition for every
480 new definition introduced in this block. This is done so that when
481 we return from the recursive call, all the current reaching
482 definitions are restored to the names that were valid in the
483 dominator parent of BB. */
485 /* Initialize the local stacks.
487 BLOCK_DEFS is used to save all the existing reaching definitions for
488 the new SSA names introduced in this block. Before registering a
489 new definition for a variable, the existing reaching definition is
490 pushed into this stack so that we can restore it in Step 5. */
492 static void
493 rewrite_initialize_block_local_data (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
494 basic_block bb ATTRIBUTE_UNUSED,
495 bool recycled ATTRIBUTE_UNUSED)
497 #ifdef ENABLE_CHECKING
498 struct rewrite_block_data *bd
499 = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
501 /* We get cleared memory from the allocator, so if the memory is
502 not cleared, then we are re-using a previously allocated entry. In
503 that case, we can also re-use the underlying virtual arrays. Just
504 make sure we clear them before using them! */
505 if (recycled && bd->block_defs && VARRAY_ACTIVE_SIZE (bd->block_defs) > 0)
506 abort ();
507 #endif
511 /* SSA Rewriting Step 1. Initialization, create a block local stack
512 of reaching definitions for new SSA names produced in this block
513 (BLOCK_DEFS). Register new definitions for every PHI node in the
514 block. */
516 static void
517 rewrite_initialize_block (struct dom_walk_data *walk_data, basic_block bb)
519 tree phi;
520 struct rewrite_block_data *bd
521 = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
523 if (dump_file && (dump_flags & TDF_DETAILS))
524 fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
526 /* Step 1. Register new definitions for every PHI node in the block.
527 Conceptually, all the PHI nodes are executed in parallel and each PHI
528 node introduces a new version for the associated variable. */
529 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
531 tree result = PHI_RESULT (phi);
533 register_new_def (result, &bd->block_defs);
538 /* SSA Rewriting Step 3. Visit all the successor blocks of BB looking for
539 PHI nodes. For every PHI node found, add a new argument containing the
540 current reaching definition for the variable and the edge through which
541 that definition is reaching the PHI node. */
543 static void
544 rewrite_add_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
545 basic_block bb)
547 edge e;
549 for (e = bb->succ; e; e = e->succ_next)
551 tree phi;
553 for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
555 tree currdef;
557 /* If this PHI node has already been rewritten, then there is
558 nothing to do for this PHI or any following PHIs since we
559 always add new PHI nodes at the start of the PHI chain. */
560 if (PHI_REWRITTEN (phi))
561 break;
563 currdef = get_reaching_def (SSA_NAME_VAR (PHI_RESULT (phi)));
564 add_phi_arg (&phi, currdef, e);
569 /* SSA Rewriting Step 5. Restore the current reaching definition for each
570 variable referenced in the block (in reverse order). */
572 static void
573 rewrite_finalize_block (struct dom_walk_data *walk_data,
574 basic_block bb ATTRIBUTE_UNUSED)
576 struct rewrite_block_data *bd
577 = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
579 /* Step 5. Restore the current reaching definition for each variable
580 referenced in the block (in reverse order). */
581 while (bd->block_defs && VARRAY_ACTIVE_SIZE (bd->block_defs) > 0)
583 tree tmp = VARRAY_TOP_TREE (bd->block_defs);
584 tree saved_def, var;
586 VARRAY_POP (bd->block_defs);
587 if (TREE_CODE (tmp) == SSA_NAME)
589 saved_def = tmp;
590 var = SSA_NAME_VAR (saved_def);
592 else
594 saved_def = NULL;
595 var = tmp;
598 var_ann (var)->current_def = saved_def;
603 /* Dump SSA information to FILE. */
605 void
606 dump_tree_ssa (FILE *file)
608 basic_block bb;
609 const char *funcname
610 = lang_hooks.decl_printable_name (current_function_decl, 2);
612 fprintf (file, "SSA information for %s\n\n", funcname);
614 FOR_EACH_BB (bb)
616 dump_bb (bb, file, 0);
617 fputs (" ", file);
618 print_generic_stmt (file, phi_nodes (bb), dump_flags);
619 fputs ("\n\n", file);
624 /* Dump SSA information to stderr. */
626 void
627 debug_tree_ssa (void)
629 dump_tree_ssa (stderr);
633 /* Dump SSA statistics on FILE. */
635 void
636 dump_tree_ssa_stats (FILE *file)
638 fprintf (file, "\nHash table statistics:\n");
640 fprintf (file, " def_blocks: ");
641 htab_statistics (file, def_blocks);
643 fprintf (file, "\n");
647 /* Dump SSA statistics on stderr. */
649 void
650 debug_tree_ssa_stats (void)
652 dump_tree_ssa_stats (stderr);
656 /* Dump statistics for the hash table HTAB. */
658 static void
659 htab_statistics (FILE *file, htab_t htab)
661 fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
662 (long) htab_size (htab),
663 (long) htab_elements (htab),
664 htab_collisions (htab));
668 /* Insert PHI nodes for variable VAR using the dominance frontier
669 information given in DFS. */
671 static void
672 insert_phi_nodes_for (tree var, bitmap *dfs, varray_type *work_stack)
674 struct def_blocks_d *def_map;
675 bitmap phi_insertion_points;
676 int bb_index;
678 def_map = find_def_blocks_for (var);
679 if (def_map == NULL)
680 return;
682 phi_insertion_points = BITMAP_XMALLOC ();
684 EXECUTE_IF_SET_IN_BITMAP (def_map->def_blocks, 0, bb_index,
686 VARRAY_PUSH_BB (*work_stack, BASIC_BLOCK (bb_index));
689 /* Pop a block off the worklist, add every block that appears in
690 the original block's dfs that we have not already processed to
691 the worklist. Iterate until the worklist is empty. Blocks
692 which are added to the worklist are potential sites for
693 PHI nodes.
695 The iteration step could be done during PHI insertion just as
696 easily. We do it here for historical reasons -- we used to have
697 a heuristic which used the potential PHI insertion points to
698 determine if fully pruned or semi pruned SSA form was appropriate.
700 We now always use fully pruned SSA form. */
701 while (VARRAY_ACTIVE_SIZE (*work_stack) > 0)
703 basic_block bb = VARRAY_TOP_BB (*work_stack);
704 int bb_index = bb->index;
705 int dfs_index;
707 VARRAY_POP (*work_stack);
709 EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs[bb_index],
710 phi_insertion_points,
711 0, dfs_index,
713 basic_block bb = BASIC_BLOCK (dfs_index);
715 VARRAY_PUSH_BB (*work_stack, bb);
716 bitmap_set_bit (phi_insertion_points, dfs_index);
720 /* Now compute global livein for this variable. Note this modifies
721 def_map->livein_blocks. */
722 compute_global_livein (def_map->livein_blocks, def_map->def_blocks);
724 /* And insert the PHI nodes. */
725 EXECUTE_IF_AND_IN_BITMAP (phi_insertion_points, def_map->livein_blocks,
726 0, bb_index,
728 create_phi_node (var, BASIC_BLOCK (bb_index));
731 BITMAP_XFREE (phi_insertion_points);
734 /* SSA Rewriting Step 2. Rewrite every variable used in each statement in
735 the block with its immediate reaching definitions. Update the current
736 definition of a variable when a new real or virtual definition is found. */
738 static void
739 rewrite_stmt (struct dom_walk_data *walk_data,
740 basic_block bb ATTRIBUTE_UNUSED,
741 block_stmt_iterator si)
743 size_t i;
744 stmt_ann_t ann;
745 tree stmt;
746 vuse_optype vuses;
747 v_may_def_optype v_may_defs;
748 v_must_def_optype v_must_defs;
749 def_optype defs;
750 use_optype uses;
751 struct rewrite_block_data *bd;
753 bd = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
755 stmt = bsi_stmt (si);
756 ann = stmt_ann (stmt);
758 if (dump_file && (dump_flags & TDF_DETAILS))
760 fprintf (dump_file, "Renaming statement ");
761 print_generic_stmt (dump_file, stmt, TDF_SLIM);
762 fprintf (dump_file, "\n");
765 #if defined ENABLE_CHECKING
766 /* We have just scanned the code for operands. No statement should
767 be modified. */
768 if (ann->modified)
769 abort ();
770 #endif
772 defs = DEF_OPS (ann);
773 uses = USE_OPS (ann);
774 vuses = VUSE_OPS (ann);
775 v_may_defs = V_MAY_DEF_OPS (ann);
776 v_must_defs = V_MUST_DEF_OPS (ann);
778 /* Step 1. Rewrite USES and VUSES in the statement. */
779 for (i = 0; i < NUM_USES (uses); i++)
780 rewrite_operand (USE_OP_PTR (uses, i));
782 /* Rewrite virtual uses in the statement. */
783 for (i = 0; i < NUM_VUSES (vuses); i++)
784 rewrite_operand (VUSE_OP_PTR (vuses, i));
786 /* Step 2. Register the statement's DEF and VDEF operands. */
787 for (i = 0; i < NUM_DEFS (defs); i++)
789 def_operand_p def_p = DEF_OP_PTR (defs, i);
791 if (TREE_CODE (DEF_FROM_PTR (def_p)) != SSA_NAME)
792 SET_DEF (def_p, make_ssa_name (DEF_FROM_PTR (def_p), stmt));
794 /* FIXME: We shouldn't be registering new defs if the variable
795 doesn't need to be renamed. */
796 register_new_def (DEF_FROM_PTR (def_p), &bd->block_defs);
799 /* Register new virtual definitions made by the statement. */
800 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
802 rewrite_operand (V_MAY_DEF_OP_PTR (v_may_defs, i));
804 if (TREE_CODE (V_MAY_DEF_RESULT (v_may_defs, i)) != SSA_NAME)
805 SET_V_MAY_DEF_RESULT (v_may_defs, i,
806 make_ssa_name (V_MAY_DEF_RESULT (v_may_defs, i),
807 stmt));
809 /* FIXME: We shouldn't be registering new defs if the variable
810 doesn't need to be renamed. */
811 register_new_def (V_MAY_DEF_RESULT (v_may_defs, i), &bd->block_defs);
814 /* Register new virtual mustdefs made by the statement. */
815 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
817 def_operand_p v_must_def_p = V_MUST_DEF_OP_PTR (v_must_defs, i);
819 if (TREE_CODE (DEF_FROM_PTR (v_must_def_p)) != SSA_NAME)
820 SET_DEF (v_must_def_p,
821 make_ssa_name (DEF_FROM_PTR (v_must_def_p), stmt));
823 /* FIXME: We shouldn't be registering new mustdefs if the variable
824 doesn't need to be renamed. */
825 register_new_def (DEF_FROM_PTR (v_must_def_p), &bd->block_defs);
831 /* Replace the use operand pointed by OP_P with its immediate reaching
832 definition. */
834 static inline void
835 rewrite_operand (use_operand_p op_p)
837 if (TREE_CODE (USE_FROM_PTR (op_p)) != SSA_NAME)
838 SET_USE (op_p, get_reaching_def (USE_FROM_PTR (op_p)));
842 /* Register DEF (an SSA_NAME) to be a new definition for its underlying
843 variable (SSA_NAME_VAR (DEF)) and push VAR's current reaching definition
844 into the stack pointed by BLOCK_DEFS_P. */
846 void
847 register_new_def (tree def, varray_type *block_defs_p)
849 tree var = SSA_NAME_VAR (def);
850 tree currdef;
852 /* If this variable is set in a single basic block and all uses are
853 dominated by the set(s) in that single basic block, then there is
854 no reason to record anything for this variable in the block local
855 definition stacks. Doing so just wastes time and memory.
857 This is the same test to prune the set of variables which may
858 need PHI nodes. So we just use that information since it's already
859 computed and available for us to use. */
860 if (var_ann (var)->need_phi_state == NEED_PHI_STATE_NO)
862 var_ann (var)->current_def = def;
863 return;
866 currdef = var_ann (var)->current_def;
867 if (! *block_defs_p)
868 VARRAY_TREE_INIT (*block_defs_p, 20, "block_defs");
870 /* Push the current reaching definition into *BLOCK_DEFS_P. This stack is
871 later used by the dominator tree callbacks to restore the reaching
872 definitions for all the variables defined in the block after a recursive
873 visit to all its immediately dominated blocks. If there is no current
874 reaching definition, then just record the underlying _DECL node. */
875 VARRAY_PUSH_TREE (*block_defs_p, currdef ? currdef : var);
877 /* Set the current reaching definition for VAR to be DEF. */
878 var_ann (var)->current_def = def;
882 /* Return the current definition for variable VAR. If none is found,
883 create a new SSA name to act as the zeroth definition for VAR. If VAR
884 is call clobbered and there exists a more recent definition of
885 GLOBAL_VAR, return the definition for GLOBAL_VAR. This means that VAR
886 has been clobbered by a function call since its last assignment. */
888 static tree
889 get_reaching_def (tree var)
891 tree default_d, currdef_var;
893 /* Lookup the current reaching definition for VAR. */
894 default_d = NULL_TREE;
895 currdef_var = var_ann (var)->current_def;
897 /* If there is no reaching definition for VAR, create and register a
898 default definition for it (if needed). */
899 if (currdef_var == NULL_TREE)
901 default_d = default_def (var);
902 if (default_d == NULL_TREE)
904 default_d = make_ssa_name (var, build_empty_stmt ());
905 set_default_def (var, default_d);
907 var_ann (var)->current_def = default_d;
910 /* Return the current reaching definition for VAR, or the default
911 definition, if we had to create one. */
912 return (currdef_var) ? currdef_var : default_d;
916 /* Hashing and equality functions for DEF_BLOCKS. */
918 static hashval_t
919 def_blocks_hash (const void *p)
921 return htab_hash_pointer
922 ((const void *)((const struct def_blocks_d *)p)->var);
925 static int
926 def_blocks_eq (const void *p1, const void *p2)
928 return ((const struct def_blocks_d *)p1)->var
929 == ((const struct def_blocks_d *)p2)->var;
932 /* Free memory allocated by one entry in DEF_BLOCKS. */
934 static void
935 def_blocks_free (void *p)
937 struct def_blocks_d *entry = p;
938 BITMAP_XFREE (entry->def_blocks);
939 BITMAP_XFREE (entry->livein_blocks);
940 free (entry);
944 /* Dump the DEF_BLOCKS hash table on stderr. */
946 void
947 debug_def_blocks (void)
949 htab_traverse (def_blocks, debug_def_blocks_r, NULL);
952 /* Callback for htab_traverse to dump the DEF_BLOCKS hash table. */
954 static int
955 debug_def_blocks_r (void **slot, void *data ATTRIBUTE_UNUSED)
957 unsigned long i;
958 struct def_blocks_d *db_p = (struct def_blocks_d *) *slot;
960 fprintf (stderr, "VAR: ");
961 print_generic_expr (stderr, db_p->var, dump_flags);
962 fprintf (stderr, ", DEF_BLOCKS: { ");
963 EXECUTE_IF_SET_IN_BITMAP (db_p->def_blocks, 0, i,
964 fprintf (stderr, "%ld ", i));
965 fprintf (stderr, "}");
966 fprintf (stderr, ", LIVEIN_BLOCKS: { ");
967 EXECUTE_IF_SET_IN_BITMAP (db_p->livein_blocks, 0, i,
968 fprintf (stderr, "%ld ", i));
969 fprintf (stderr, "}\n");
971 return 1;
975 /* Return the set of blocks where variable VAR is defined and the blocks
976 where VAR is live on entry (livein). Return NULL, if no entry is
977 found in DEF_BLOCKS. */
979 static inline struct def_blocks_d *
980 find_def_blocks_for (tree var)
982 struct def_blocks_d dm;
983 dm.var = var;
984 return (struct def_blocks_d *) htab_find (def_blocks, &dm);
988 /* Return the set of blocks where variable VAR is defined and the blocks
989 where VAR is live on entry (livein). If no entry is found in
990 DEF_BLOCKS, a new one is created and returned. */
992 static inline struct def_blocks_d *
993 get_def_blocks_for (tree var)
995 struct def_blocks_d db, *db_p;
996 void **slot;
998 db.var = var;
999 slot = htab_find_slot (def_blocks, (void *) &db, INSERT);
1000 if (*slot == NULL)
1002 db_p = xmalloc (sizeof (*db_p));
1003 db_p->var = var;
1004 db_p->def_blocks = BITMAP_XMALLOC ();
1005 db_p->livein_blocks = BITMAP_XMALLOC ();
1006 *slot = (void *) db_p;
1008 else
1009 db_p = (struct def_blocks_d *) *slot;
1011 return db_p;
1014 /* If a variable V in VARS_TO_RENAME is a pointer, the renaming
1015 process will cause us to lose the name memory tags that may have
1016 been associated with the various SSA_NAMEs of V. This means that
1017 the variables aliased to those name tags also need to be renamed
1018 again.
1020 FIXME 1- We should either have a better scheme for renaming
1021 pointers that doesn't lose name tags or re-run alias
1022 analysis to recover points-to information.
1024 2- Currently we just invalidate *all* the name tags. This
1025 should be more selective. */
1027 static void
1028 invalidate_name_tags (bitmap vars_to_rename)
1030 size_t i;
1031 bool rename_name_tags_p;
1033 rename_name_tags_p = false;
1034 EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i,
1035 if (POINTER_TYPE_P (TREE_TYPE (referenced_var (i))))
1037 rename_name_tags_p = true;
1038 break;
1041 if (rename_name_tags_p)
1042 for (i = 0; i < num_referenced_vars; i++)
1044 var_ann_t ann = var_ann (referenced_var (i));
1046 if (ann->mem_tag_kind == NAME_TAG)
1048 size_t j;
1049 varray_type may_aliases = ann->may_aliases;
1051 bitmap_set_bit (vars_to_rename, ann->uid);
1052 if (ann->may_aliases)
1053 for (j = 0; j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
1055 tree var = VARRAY_TREE (may_aliases, j);
1056 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1063 /* Main entry point into the SSA builder. The renaming process
1064 proceeds in five main phases:
1066 1- If VARS_TO_RENAME has any entries, any existing PHI nodes for
1067 those variables are removed from the flow graph so that they can
1068 be computed again.
1070 2- Compute dominance frontier and immediate dominators, needed to
1071 insert PHI nodes and rename the function in dominator tree
1072 order.
1074 3- Find and mark all the blocks that define variables
1075 (mark_def_sites).
1077 4- Insert PHI nodes at dominance frontiers (insert_phi_nodes).
1079 5- Rename all the blocks (rewrite_initialize_block,
1080 rewrite_add_phi_arguments) and statements in the program
1081 (rewrite_stmt).
1083 Steps 3 and 5 are done using the dominator tree walker
1084 (walk_dominator_tree). */
1086 void
1087 rewrite_into_ssa (void)
1089 bitmap *dfs;
1090 basic_block bb;
1091 struct dom_walk_data walk_data;
1092 struct mark_def_sites_global_data mark_def_sites_global_data;
1093 unsigned int i;
1095 timevar_push (TV_TREE_SSA_OTHER);
1097 /* Initialize the array of variables to rename. */
1098 if (vars_to_rename != NULL)
1100 invalidate_name_tags (vars_to_rename);
1102 /* Now remove all the existing PHI nodes (if any) for the variables
1103 that we are about to rename into SSA. */
1104 remove_all_phi_nodes_for (vars_to_rename);
1107 /* Allocate memory for the DEF_BLOCKS hash table. */
1108 def_blocks = htab_create (VARRAY_ACTIVE_SIZE (referenced_vars),
1109 def_blocks_hash, def_blocks_eq, def_blocks_free);
1111 /* Initialize dominance frontier and immediate dominator bitmaps.
1112 Also count the number of predecessors for each block. Doing so
1113 can save significant time during PHI insertion for large graphs. */
1114 dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
1115 FOR_EACH_BB (bb)
1117 edge e;
1118 int count = 0;
1120 for (e = bb->pred; e; e = e->pred_next)
1121 count++;
1123 bb_ann (bb)->num_preds = count;
1124 dfs[bb->index] = BITMAP_XMALLOC ();
1127 for (i = 0; i < num_referenced_vars; i++)
1128 var_ann (referenced_var (i))->current_def = NULL;
1130 /* Ensure that the dominance information is OK. */
1131 calculate_dominance_info (CDI_DOMINATORS);
1133 /* Compute dominance frontiers. */
1134 compute_dominance_frontiers (dfs);
1136 /* Setup callbacks for the generic dominator tree walker to find and
1137 mark definition sites. */
1138 walk_data.walk_stmts_backward = false;
1139 walk_data.dom_direction = CDI_DOMINATORS;
1140 walk_data.initialize_block_local_data = NULL;
1141 walk_data.before_dom_children_before_stmts = mark_def_sites_initialize_block;
1142 walk_data.before_dom_children_walk_stmts = mark_def_sites;
1143 walk_data.before_dom_children_after_stmts = NULL;
1144 walk_data.after_dom_children_before_stmts = NULL;
1145 walk_data.after_dom_children_walk_stmts = NULL;
1146 walk_data.after_dom_children_after_stmts = NULL;
1148 /* Notice that this bitmap is indexed using variable UIDs, so it must be
1149 large enough to accommodate all the variables referenced in the
1150 function, not just the ones we are renaming. */
1151 mark_def_sites_global_data.kills = sbitmap_alloc (num_referenced_vars);
1152 walk_data.global_data = &mark_def_sites_global_data;
1154 /* We do not have any local data. */
1155 walk_data.block_local_data_size = 0;
1157 /* Initialize the dominator walker. */
1158 init_walk_dominator_tree (&walk_data);
1160 /* Recursively walk the dominator tree. */
1161 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1163 /* Finalize the dominator walker. */
1164 fini_walk_dominator_tree (&walk_data);
1166 /* We no longer need this bitmap, clear and free it. */
1167 sbitmap_free (mark_def_sites_global_data.kills);
1169 /* Insert PHI nodes at dominance frontiers of definition blocks. */
1170 insert_phi_nodes (dfs);
1172 /* Rewrite all the basic blocks in the program. */
1173 timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
1175 /* Setup callbacks for the generic dominator tree walker. */
1176 walk_data.walk_stmts_backward = false;
1177 walk_data.dom_direction = CDI_DOMINATORS;
1178 walk_data.initialize_block_local_data = rewrite_initialize_block_local_data;
1179 walk_data.before_dom_children_before_stmts = rewrite_initialize_block;
1180 walk_data.before_dom_children_walk_stmts = rewrite_stmt;
1181 walk_data.before_dom_children_after_stmts = rewrite_add_phi_arguments;
1182 walk_data.after_dom_children_before_stmts = NULL;
1183 walk_data.after_dom_children_walk_stmts = NULL;
1184 walk_data.after_dom_children_after_stmts = rewrite_finalize_block;
1185 walk_data.global_data = NULL;
1186 walk_data.block_local_data_size = sizeof (struct rewrite_block_data);
1188 /* Initialize the dominator walker. */
1189 init_walk_dominator_tree (&walk_data);
1191 /* Recursively walk the dominator tree rewriting each statement in
1192 each basic block. */
1193 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1195 /* Finalize the dominator walker. */
1196 fini_walk_dominator_tree (&walk_data);
1198 timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS);
1200 /* Debugging dumps. */
1201 if (dump_file && (dump_flags & TDF_STATS))
1203 dump_dfa_stats (dump_file);
1204 dump_tree_ssa_stats (dump_file);
1207 /* Free allocated memory. */
1208 FOR_EACH_BB (bb)
1209 BITMAP_XFREE (dfs[bb->index]);
1210 free (dfs);
1212 htab_delete (def_blocks);
1214 timevar_pop (TV_TREE_SSA_OTHER);
1217 struct tree_opt_pass pass_build_ssa =
1219 "ssa", /* name */
1220 NULL, /* gate */
1221 rewrite_into_ssa, /* execute */
1222 NULL, /* sub */
1223 NULL, /* next */
1224 0, /* static_pass_number */
1225 0, /* tv_id */
1226 PROP_cfg | PROP_referenced_vars, /* properties_required */
1227 PROP_ssa, /* properties_provided */
1228 0, /* properties_destroyed */
1229 0, /* todo_flags_start */
1230 TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */