* gnu/regexp/CharIndexedReader.java: Removed.
[official-gcc.git] / gcc / tree-into-ssa.c
bloba569d0536b1937693989c40071a9ede4b0fac89e
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_operand_for_rename (tree *op_p, size_t *uid_p);
113 static void insert_phi_nodes (bitmap *);
114 static void rewrite_stmt (struct dom_walk_data *, basic_block,
115 block_stmt_iterator);
116 static inline void rewrite_operand (tree *);
117 static void insert_phi_nodes_for (tree, bitmap *, varray_type *);
118 static tree get_reaching_def (tree);
119 static hashval_t def_blocks_hash (const void *);
120 static int def_blocks_eq (const void *, const void *);
121 static void def_blocks_free (void *);
122 static int debug_def_blocks_r (void **, void *);
123 static inline struct def_blocks_d *get_def_blocks_for (tree);
124 static inline struct def_blocks_d *find_def_blocks_for (tree);
125 static void htab_statistics (FILE *, htab_t);
127 /* Compute global livein information given the set of blockx where
128 an object is locally live at the start of the block (LIVEIN)
129 and the set of blocks where the object is defined (DEF_BLOCKS).
131 Note: This routine augments the existing local livein information
132 to include global livein (i.e., it modifies the underlying bitmap
133 for LIVEIN). */
135 static void
136 compute_global_livein (bitmap livein, bitmap def_blocks)
138 basic_block bb, *worklist, *tos;
139 int i;
141 tos = worklist
142 = (basic_block *) xmalloc (sizeof (basic_block) * (last_basic_block + 1));
144 EXECUTE_IF_SET_IN_BITMAP (livein, 0, i,
146 *tos++ = BASIC_BLOCK (i);
149 /* Iterate until the worklist is empty. */
150 while (tos != worklist)
152 edge e;
154 /* Pull a block off the worklist. */
155 bb = *--tos;
157 /* For each predecessor block. */
158 for (e = bb->pred; e; e = e->pred_next)
160 basic_block pred = e->src;
161 int pred_index = pred->index;
163 /* None of this is necessary for the entry block. */
164 if (pred != ENTRY_BLOCK_PTR
165 && ! bitmap_bit_p (livein, pred_index)
166 && ! bitmap_bit_p (def_blocks, pred_index))
168 *tos++ = pred;
169 bitmap_set_bit (livein, pred_index);
174 free (worklist);
178 /* Block initialization routine for mark_def_sites. Clear the
179 KILLS bitmap at the start of each block. */
181 static void
182 mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
183 basic_block bb ATTRIBUTE_UNUSED)
185 struct mark_def_sites_global_data *gd = walk_data->global_data;
186 sbitmap kills = gd->kills;
188 sbitmap_zero (kills);
192 /* Call back for walk_dominator_tree used to collect definition sites
193 for every variable in the function. For every statement S in block
196 1- Variables defined by S in DEF_OPS(S) are marked in the bitmap
197 WALK_DATA->GLOBAL_DATA->KILLS.
199 2- If S uses a variable VAR and there is no preceding kill of VAR,
200 then it is marked in marked in the LIVEIN_BLOCKS bitmap
201 associated with VAR.
203 This information is used to determine which variables are live
204 across block boundaries to reduce the number of PHI nodes
205 we create. */
207 static void
208 mark_def_sites (struct dom_walk_data *walk_data,
209 basic_block bb,
210 block_stmt_iterator bsi)
212 struct mark_def_sites_global_data *gd = walk_data->global_data;
213 sbitmap kills = gd->kills;
214 vdef_optype vdefs;
215 vuse_optype vuses;
216 def_optype defs;
217 use_optype uses;
218 size_t i, uid;
219 tree stmt;
220 stmt_ann_t ann;
222 /* Mark all the blocks that have definitions for each variable in the
223 VARS_TO_RENAME bitmap. */
224 stmt = bsi_stmt (bsi);
225 get_stmt_operands (stmt);
226 ann = stmt_ann (stmt);
228 /* If a variable is used before being set, then the variable is live
229 across a block boundary, so mark it live-on-entry to BB. */
230 uses = USE_OPS (ann);
231 for (i = 0; i < NUM_USES (uses); i++)
233 tree *use_p = USE_OP_PTR (uses, i);
235 if (prepare_operand_for_rename (use_p, &uid)
236 && !TEST_BIT (kills, uid))
237 set_livein_block (*use_p, bb);
240 /* Similarly for virtual uses. */
241 vuses = VUSE_OPS (ann);
242 for (i = 0; i < NUM_VUSES (vuses); i++)
244 tree *use_p = VUSE_OP_PTR (vuses, i);
246 if (prepare_operand_for_rename (use_p, &uid))
247 set_livein_block (*use_p, bb);
250 /* Note that virtual definitions are irrelevant for computing KILLS
251 because a VDEF does not constitute a killing definition of the
252 variable. However, the operand of a virtual definitions is a use
253 of the variable, so it may cause the variable to be considered
254 live-on-entry. */
255 vdefs = VDEF_OPS (ann);
256 for (i = 0; i < NUM_VDEFS (vdefs); i++)
258 size_t dummy;
260 if (prepare_operand_for_rename (VDEF_OP_PTR (vdefs, i), &uid)
261 && prepare_operand_for_rename (VDEF_RESULT_PTR (vdefs, i), &dummy))
263 VDEF_RESULT (vdefs, i) = VDEF_OP (vdefs, i);
265 set_livein_block (VDEF_OP (vdefs, i), bb);
266 set_def_block (VDEF_RESULT (vdefs, i), bb);
270 /* Now process the definition made by this statement. Mark the
271 variables in KILLS. */
272 defs = DEF_OPS (ann);
273 for (i = 0; i < NUM_DEFS (defs); i++)
275 tree *def_p = DEF_OP_PTR (defs, i);
277 if (prepare_operand_for_rename (def_p, &uid))
279 set_def_block (*def_p, bb);
280 SET_BIT (kills, uid);
286 /* Mark block BB as the definition site for variable VAR. */
288 static void
289 set_def_block (tree var, basic_block bb)
291 struct def_blocks_d *db_p;
292 enum need_phi_state state = var_ann (var)->need_phi_state;
294 db_p = get_def_blocks_for (var);
296 /* Set the bit corresponding to the block where VAR is defined. */
297 bitmap_set_bit (db_p->def_blocks, bb->index);
299 /* Keep track of whether or not we may need to insert phi nodes.
301 If we are in the UNKNOWN state, then this is the first definition
302 of VAR. Additionally, we have not seen any uses of VAR yet, so
303 we do not need a phi node for this variable at this time (i.e.,
304 transition to NEED_PHI_STATE_NO).
306 If we are in any other state, then we either have multiple definitions
307 of this variable occurring in different blocks or we saw a use of the
308 variable which was not dominated by the block containing the
309 definition(s). In this case we may need a PHI node, so enter
310 state NEED_PHI_STATE_MAYBE. */
311 if (state == NEED_PHI_STATE_UNKNOWN)
312 var_ann (var)->need_phi_state = NEED_PHI_STATE_NO;
313 else
314 var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
318 /* Mark block BB as having VAR live at the entry to BB. */
320 static void
321 set_livein_block (tree var, basic_block bb)
323 struct def_blocks_d *db_p;
324 enum need_phi_state state = var_ann (var)->need_phi_state;
326 db_p = get_def_blocks_for (var);
328 /* Set the bit corresponding to the block where VAR is live in. */
329 bitmap_set_bit (db_p->livein_blocks, bb->index);
331 /* Keep track of whether or not we may need to insert phi nodes.
333 If we reach here in NEED_PHI_STATE_NO, see if this use is dominated
334 by the single block containing the definition(s) of this variable. If
335 it is, then we remain in NEED_PHI_STATE_NO, otherwise we transition to
336 NEED_PHI_STATE_MAYBE. */
337 if (state == NEED_PHI_STATE_NO)
339 int def_block_index = bitmap_first_set_bit (db_p->def_blocks);
341 if (def_block_index == -1
342 || ! dominated_by_p (CDI_DOMINATORS, bb,
343 BASIC_BLOCK (def_block_index)))
344 var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
346 else
347 var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
351 /* If the operand pointed by OP_P needs to be renamed, strip away SSA_NAME
352 wrappers (if needed) and return true. The unique ID for the operand's
353 variable will be stored in *UID_P. */
355 static bool
356 prepare_operand_for_rename (tree *op_p, size_t *uid_p)
358 tree var = (TREE_CODE (*op_p) != SSA_NAME) ? *op_p : SSA_NAME_VAR (*op_p);
359 *uid_p = var_ann (var)->uid;
361 /* Ignore variables that don't need to be renamed. */
362 if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
363 return false;
365 /* The variable needs to be renamed. If it already had an
366 SSA_NAME, strip it off. This way, the SSA rename pass
367 doesn't need to deal with existing SSA names. */
368 if (TREE_CODE (*op_p) == SSA_NAME)
370 if (default_def (SSA_NAME_VAR (*op_p)) != *op_p)
371 release_ssa_name (*op_p);
372 *op_p = var;
375 return true;
379 /* Helper for insert_phi_nodes. If VAR needs PHI nodes, insert them
380 at the dominance frontier (DFS) of blocks defining VAR. */
382 static inline
383 void insert_phi_nodes_1 (tree var, bitmap *dfs, varray_type *work_stack)
385 var_ann_t ann = var_ann (var);
386 if (ann->need_phi_state != NEED_PHI_STATE_NO)
387 insert_phi_nodes_for (var, dfs, work_stack);
391 /* Insert PHI nodes at the dominance frontier of blocks with variable
392 definitions. DFS contains the dominance frontier information for
393 the flowgraph. PHI nodes will only be inserted at the dominance
394 frontier of definition blocks for variables whose NEED_PHI_STATE
395 annotation is marked as ``maybe'' or ``unknown'' (computed by
396 mark_def_sites). */
398 static void
399 insert_phi_nodes (bitmap *dfs)
401 size_t i;
402 varray_type work_stack;
404 timevar_push (TV_TREE_INSERT_PHI_NODES);
406 /* Array WORK_STACK is a stack of CFG blocks. Each block that contains
407 an assignment or PHI node will be pushed to this stack. */
408 VARRAY_BB_INIT (work_stack, last_basic_block, "work_stack");
410 /* Iterate over all variables in VARS_TO_RENAME. For each variable, add
411 to the work list all the blocks that have a definition for the
412 variable. PHI nodes will be added to the dominance frontier blocks of
413 each definition block. */
414 if (vars_to_rename)
415 EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i,
416 insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack));
417 else
418 for (i = 0; i < num_referenced_vars; i++)
419 insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack);
421 timevar_pop (TV_TREE_INSERT_PHI_NODES);
425 /* Perform a depth-first traversal of the dominator tree looking for
426 variables to rename. BB is the block where to start searching.
427 Renaming is a five step process:
429 1- Every definition made by PHI nodes at the start of the blocks is
430 registered as the current definition for the corresponding variable.
432 2- Every statement in BB is rewritten. USE and VUSE operands are
433 rewritten with their corresponding reaching definition. DEF and
434 VDEF targets are registered as new definitions.
436 3- All the PHI nodes in successor blocks of BB are visited. The
437 argument corresponding to BB is replaced with its current reaching
438 definition.
440 4- Recursively rewrite every dominator child block of BB.
442 5- Restore (in reverse order) the current reaching definition for every
443 new definition introduced in this block. This is done so that when
444 we return from the recursive call, all the current reaching
445 definitions are restored to the names that were valid in the
446 dominator parent of BB. */
448 /* Initialize the local stacks.
450 BLOCK_DEFS is used to save all the existing reaching definitions for
451 the new SSA names introduced in this block. Before registering a
452 new definition for a variable, the existing reaching definition is
453 pushed into this stack so that we can restore it in Step 5. */
455 static void
456 rewrite_initialize_block_local_data (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
457 basic_block bb ATTRIBUTE_UNUSED,
458 bool recycled ATTRIBUTE_UNUSED)
460 #ifdef ENABLE_CHECKING
461 struct rewrite_block_data *bd
462 = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
464 /* We get cleared memory from the allocator, so if the memory is
465 not cleared, then we are re-using a previously allocated entry. In
466 that case, we can also re-use the underlying virtal arrays. Just
467 make sure we clear them before using them! */
468 if (recycled && bd->block_defs && VARRAY_ACTIVE_SIZE (bd->block_defs) > 0)
469 abort ();
470 #endif
474 /* SSA Rewriting Step 1. Initialization, create a block local stack
475 of reaching definitions for new SSA names produced in this block
476 (BLOCK_DEFS). Register new definitions for every PHI node in the
477 block. */
479 static void
480 rewrite_initialize_block (struct dom_walk_data *walk_data, basic_block bb)
482 tree phi;
483 struct rewrite_block_data *bd
484 = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
486 if (dump_file && (dump_flags & TDF_DETAILS))
487 fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
489 /* Step 1. Register new definitions for every PHI node in the block.
490 Conceptually, all the PHI nodes are executed in parallel and each PHI
491 node introduces a new version for the associated variable. */
492 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
494 tree result = PHI_RESULT (phi);
496 register_new_def (result, &bd->block_defs);
501 /* SSA Rewriting Step 3. Visit all the successor blocks of BB looking for
502 PHI nodes. For every PHI node found, add a new argument containing the
503 current reaching definition for the variable and the edge through which
504 that definition is reaching the PHI node. */
506 static void
507 rewrite_add_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
508 basic_block bb)
510 edge e;
512 for (e = bb->succ; e; e = e->succ_next)
514 tree phi;
516 for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
518 tree currdef;
520 /* If this PHI node has already been rewritten, then there is
521 nothing to do for this PHI or any following PHIs since we
522 always add new PHI nodes at the start of the PHI chain. */
523 if (PHI_REWRITTEN (phi))
524 break;
526 currdef = get_reaching_def (SSA_NAME_VAR (PHI_RESULT (phi)));
527 add_phi_arg (&phi, currdef, e);
532 /* SSA Rewriting Step 5. Restore the current reaching definition for each
533 variable referenced in the block (in reverse order). */
535 static void
536 rewrite_finalize_block (struct dom_walk_data *walk_data,
537 basic_block bb ATTRIBUTE_UNUSED)
539 struct rewrite_block_data *bd
540 = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
542 /* Step 5. Restore the current reaching definition for each variable
543 referenced in the block (in reverse order). */
544 while (bd->block_defs && VARRAY_ACTIVE_SIZE (bd->block_defs) > 0)
546 tree tmp = VARRAY_TOP_TREE (bd->block_defs);
547 tree saved_def, var;
549 VARRAY_POP (bd->block_defs);
550 if (TREE_CODE (tmp) == SSA_NAME)
552 saved_def = tmp;
553 var = SSA_NAME_VAR (saved_def);
555 else
557 saved_def = NULL;
558 var = tmp;
561 var_ann (var)->current_def = saved_def;
566 /* Dump SSA information to FILE. */
568 void
569 dump_tree_ssa (FILE *file)
571 basic_block bb;
572 const char *funcname
573 = (*lang_hooks.decl_printable_name) (current_function_decl, 2);
575 fprintf (file, "SSA information for %s\n\n", funcname);
577 FOR_EACH_BB (bb)
579 dump_bb (bb, file, 0);
580 fputs (" ", file);
581 print_generic_stmt (file, phi_nodes (bb), dump_flags);
582 fputs ("\n\n", file);
587 /* Dump SSA information to stderr. */
589 void
590 debug_tree_ssa (void)
592 dump_tree_ssa (stderr);
596 /* Dump SSA statistics on FILE. */
598 void
599 dump_tree_ssa_stats (FILE *file)
601 fprintf (file, "\nHash table statistics:\n");
603 fprintf (file, " def_blocks: ");
604 htab_statistics (file, def_blocks);
606 fprintf (file, "\n");
610 /* Dump SSA statistics on stderr. */
612 void
613 debug_tree_ssa_stats (void)
615 dump_tree_ssa_stats (stderr);
619 /* Dump statistics for the hash table HTAB. */
621 static void
622 htab_statistics (FILE *file, htab_t htab)
624 fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
625 (long) htab_size (htab),
626 (long) htab_elements (htab),
627 htab_collisions (htab));
631 /* Insert PHI nodes for variable VAR using the dominance frontier
632 information given in DFS. */
634 static void
635 insert_phi_nodes_for (tree var, bitmap *dfs, varray_type *work_stack)
637 struct def_blocks_d *def_map;
638 bitmap phi_insertion_points;
639 int bb_index;
641 def_map = find_def_blocks_for (var);
642 if (def_map == NULL)
643 return;
645 phi_insertion_points = BITMAP_XMALLOC ();
647 EXECUTE_IF_SET_IN_BITMAP (def_map->def_blocks, 0, bb_index,
649 VARRAY_PUSH_BB (*work_stack, BASIC_BLOCK (bb_index));
652 /* Pop a block off the worklist, add every block that appears in
653 the original block's dfs that we have not already processed to
654 the worklist. Iterate until the worklist is empty. Blocks
655 which are added to the worklist are potential sites for
656 PHI nodes.
658 The iteration step could be done during PHI insertion just as
659 easily. We do it here for historical reasons -- we used to have
660 a heuristic which used the potential PHI insertion points to
661 determine if fully pruned or semi pruned SSA form was appropriate.
663 We now always use fully pruned SSA form. */
664 while (VARRAY_ACTIVE_SIZE (*work_stack) > 0)
666 basic_block bb = VARRAY_TOP_BB (*work_stack);
667 int bb_index = bb->index;
668 int dfs_index;
670 VARRAY_POP (*work_stack);
672 EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs[bb_index],
673 phi_insertion_points,
674 0, dfs_index,
676 basic_block bb = BASIC_BLOCK (dfs_index);
678 VARRAY_PUSH_BB (*work_stack, bb);
679 bitmap_set_bit (phi_insertion_points, dfs_index);
683 /* Now compute global livein for this variable. Note this modifies
684 def_map->livein_blocks. */
685 compute_global_livein (def_map->livein_blocks, def_map->def_blocks);
687 /* And insert the PHI nodes. */
688 EXECUTE_IF_AND_IN_BITMAP (phi_insertion_points, def_map->livein_blocks,
689 0, bb_index,
691 create_phi_node (var, BASIC_BLOCK (bb_index));
694 BITMAP_XFREE (phi_insertion_points);
697 /* SSA Rewriting Step 2. Rewrite every variable used in each statement in
698 the block with its immediate reaching definitions. Update the current
699 definition of a variable when a new real or virtual definition is found. */
701 static void
702 rewrite_stmt (struct dom_walk_data *walk_data,
703 basic_block bb ATTRIBUTE_UNUSED,
704 block_stmt_iterator si)
706 size_t i;
707 stmt_ann_t ann;
708 tree stmt;
709 vuse_optype vuses;
710 vdef_optype vdefs;
711 def_optype defs;
712 use_optype uses;
713 struct rewrite_block_data *bd;
715 bd = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
717 stmt = bsi_stmt (si);
718 ann = stmt_ann (stmt);
720 if (dump_file && (dump_flags & TDF_DETAILS))
722 fprintf (dump_file, "Renaming statement ");
723 print_generic_stmt (dump_file, stmt, TDF_SLIM);
724 fprintf (dump_file, "\n");
727 #if defined ENABLE_CHECKING
728 /* We have just scanned the code for operands. No statement should
729 be modified. */
730 if (ann->modified)
731 abort ();
732 #endif
734 defs = DEF_OPS (ann);
735 uses = USE_OPS (ann);
736 vuses = VUSE_OPS (ann);
737 vdefs = VDEF_OPS (ann);
739 /* Step 1. Rewrite USES and VUSES in the statement. */
740 for (i = 0; i < NUM_USES (uses); i++)
741 rewrite_operand (USE_OP_PTR (uses, i));
743 /* Rewrite virtual uses in the statement. */
744 for (i = 0; i < NUM_VUSES (vuses); i++)
745 rewrite_operand (VUSE_OP_PTR (vuses, i));
747 /* Step 2. Register the statement's DEF and VDEF operands. */
748 for (i = 0; i < NUM_DEFS (defs); i++)
750 tree *def_p = DEF_OP_PTR (defs, i);
752 if (TREE_CODE (*def_p) != SSA_NAME)
753 *def_p = make_ssa_name (*def_p, stmt);
755 /* FIXME: We shouldn't be registering new defs if the variable
756 doesn't need to be renamed. */
757 register_new_def (*def_p, &bd->block_defs);
760 /* Register new virtual definitions made by the statement. */
761 for (i = 0; i < NUM_VDEFS (vdefs); i++)
763 rewrite_operand (VDEF_OP_PTR (vdefs, i));
765 if (TREE_CODE (VDEF_RESULT (vdefs, i)) != SSA_NAME)
766 *VDEF_RESULT_PTR (vdefs, i)
767 = make_ssa_name (VDEF_RESULT (vdefs, i), stmt);
769 /* FIXME: We shouldn't be registering new defs if the variable
770 doesn't need to be renamed. */
771 register_new_def (VDEF_RESULT (vdefs, i), &bd->block_defs);
776 /* Replace the operand pointed by OP_P with its immediate reaching
777 definition. */
779 static inline void
780 rewrite_operand (tree *op_p)
782 if (TREE_CODE (*op_p) != SSA_NAME)
783 *op_p = get_reaching_def (*op_p);
787 /* Register DEF (an SSA_NAME) to be a new definition for its underlying
788 variable (SSA_NAME_VAR (DEF)) and push VAR's current reaching definition
789 into the stack pointed by BLOCK_DEFS_P. */
791 void
792 register_new_def (tree def, varray_type *block_defs_p)
794 tree var = SSA_NAME_VAR (def);
795 tree currdef;
797 /* If this variable is set in a single basic block and all uses are
798 dominated by the set(s) in that single basic block, then there is
799 no reason to record anything for this variable in the block local
800 definition stacks. Doing so just wastes time and memory.
802 This is the same test to prune the set of variables which may
803 need PHI nodes. So we just use that information since it's already
804 computed and available for us to use. */
805 if (var_ann (var)->need_phi_state == NEED_PHI_STATE_NO)
807 var_ann (var)->current_def = def;
808 return;
811 currdef = var_ann (var)->current_def;
812 if (! *block_defs_p)
813 VARRAY_TREE_INIT (*block_defs_p, 20, "block_defs");
815 /* Push the current reaching definition into *BLOCK_DEFS_P. This stack is
816 later used by the dominator tree callbacks to restore the reaching
817 definitions for all the variables defined in the block after a recursive
818 visit to all its immediately dominated blocks. If there is no current
819 reaching definition, then just record the underlying _DECL node. */
820 VARRAY_PUSH_TREE (*block_defs_p, currdef ? currdef : var);
822 /* Set the current reaching definition for VAR to be DEF. */
823 var_ann (var)->current_def = def;
827 /* Return the current definition for variable VAR. If none is found,
828 create a new SSA name to act as the zeroth definition for VAR. If VAR
829 is call clobbered and there exists a more recent definition of
830 GLOBAL_VAR, return the definition for GLOBAL_VAR. This means that VAR
831 has been clobbered by a function call since its last assignment. */
833 static tree
834 get_reaching_def (tree var)
836 tree default_d, currdef_var;
838 /* Lookup the current reaching definition for VAR. */
839 default_d = NULL_TREE;
840 currdef_var = var_ann (var)->current_def;
842 /* If there is no reaching definition for VAR, create and register a
843 default definition for it (if needed). */
844 if (currdef_var == NULL_TREE)
846 default_d = default_def (var);
847 if (default_d == NULL_TREE)
849 default_d = make_ssa_name (var, build_empty_stmt ());
850 set_default_def (var, default_d);
852 var_ann (var)->current_def = default_d;
855 /* Return the current reaching definition for VAR, or the default
856 definition, if we had to create one. */
857 return (currdef_var) ? currdef_var : default_d;
861 /* Hashing and equality functions for DEF_BLOCKS. */
863 static hashval_t
864 def_blocks_hash (const void *p)
866 return htab_hash_pointer
867 ((const void *)((const struct def_blocks_d *)p)->var);
870 static int
871 def_blocks_eq (const void *p1, const void *p2)
873 return ((const struct def_blocks_d *)p1)->var
874 == ((const struct def_blocks_d *)p2)->var;
877 /* Free memory allocated by one entry in DEF_BLOCKS. */
879 static void
880 def_blocks_free (void *p)
882 struct def_blocks_d *entry = p;
883 BITMAP_XFREE (entry->def_blocks);
884 BITMAP_XFREE (entry->livein_blocks);
885 free (entry);
889 /* Dump the DEF_BLOCKS hash table on stderr. */
891 void
892 debug_def_blocks (void)
894 htab_traverse (def_blocks, debug_def_blocks_r, NULL);
897 /* Callback for htab_traverse to dump the DEF_BLOCKS hash table. */
899 static int
900 debug_def_blocks_r (void **slot, void *data ATTRIBUTE_UNUSED)
902 unsigned long i;
903 struct def_blocks_d *db_p = (struct def_blocks_d *) *slot;
905 fprintf (stderr, "VAR: ");
906 print_generic_expr (stderr, db_p->var, dump_flags);
907 fprintf (stderr, ", DEF_BLOCKS: { ");
908 EXECUTE_IF_SET_IN_BITMAP (db_p->def_blocks, 0, i,
909 fprintf (stderr, "%ld ", i));
910 fprintf (stderr, "}");
911 fprintf (stderr, ", LIVEIN_BLOCKS: { ");
912 EXECUTE_IF_SET_IN_BITMAP (db_p->livein_blocks, 0, i,
913 fprintf (stderr, "%ld ", i));
914 fprintf (stderr, "}\n");
916 return 1;
920 /* Return the set of blocks where variable VAR is defined and the blocks
921 where VAR is live on entry (livein). Return NULL, if no entry is
922 found in DEF_BLOCKS. */
924 static inline struct def_blocks_d *
925 find_def_blocks_for (tree var)
927 struct def_blocks_d dm;
928 dm.var = var;
929 return (struct def_blocks_d *) htab_find (def_blocks, &dm);
933 /* Return the set of blocks where variable VAR is defined and the blocks
934 where VAR is live on entry (livein). If no entry is found in
935 DEF_BLOCKS, a new one is created and returned. */
937 static inline struct def_blocks_d *
938 get_def_blocks_for (tree var)
940 struct def_blocks_d db, *db_p;
941 void **slot;
943 db.var = var;
944 slot = htab_find_slot (def_blocks, (void *) &db, INSERT);
945 if (*slot == NULL)
947 db_p = xmalloc (sizeof (*db_p));
948 db_p->var = var;
949 db_p->def_blocks = BITMAP_XMALLOC ();
950 db_p->livein_blocks = BITMAP_XMALLOC ();
951 *slot = (void *) db_p;
953 else
954 db_p = (struct def_blocks_d *) *slot;
956 return db_p;
959 /* If a variable V in VARS_TO_RENAME is a pointer, the renaming
960 process will cause us to lose the name memory tags that may have
961 been associated with the various SSA_NAMEs of V. This means that
962 the variables aliased to those name tags also need to be renamed
963 again.
965 FIXME 1- We should either have a better scheme for renaming
966 pointers that doesn't lose name tags or re-run alias
967 analysis to recover points-to information.
969 2- Currently we just invalidate *all* the name tags. This
970 should be more selective. */
972 static void
973 invalidate_name_tags (bitmap vars_to_rename)
975 size_t i;
976 bool rename_name_tags_p;
978 rename_name_tags_p = false;
979 EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i,
980 if (POINTER_TYPE_P (TREE_TYPE (referenced_var (i))))
982 rename_name_tags_p = true;
983 break;
986 if (rename_name_tags_p)
987 for (i = 0; i < num_referenced_vars; i++)
989 var_ann_t ann = var_ann (referenced_var (i));
991 if (ann->mem_tag_kind == NAME_TAG)
993 size_t j;
994 varray_type may_aliases = ann->may_aliases;
996 bitmap_set_bit (vars_to_rename, ann->uid);
997 if (ann->may_aliases)
998 for (j = 0; j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
1000 tree var = VARRAY_TREE (may_aliases, j);
1001 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1008 /* Main entry point into the SSA builder. The renaming process
1009 proceeds in five main phases:
1011 1- If VARS_TO_RENAME has any entries, any existing PHI nodes for
1012 those variables are removed from the flow graph so that they can
1013 be computed again.
1015 2- Compute dominance frontier and immediate dominators, needed to
1016 insert PHI nodes and rename the function in dominator tree
1017 order.
1019 3- Find and mark all the blocks that define variables
1020 (mark_def_sites).
1022 4- Insert PHI nodes at dominance frontiers (insert_phi_nodes).
1024 5- Rename all the blocks (rewrite_initialize_block,
1025 rewrite_add_phi_arguments) and statements in the program
1026 (rewrite_stmt).
1028 Steps 3 and 5 are done using the dominator tree walker
1029 (walk_dominator_tree). */
1031 void
1032 rewrite_into_ssa (void)
1034 bitmap *dfs;
1035 basic_block bb;
1036 struct dom_walk_data walk_data;
1037 struct mark_def_sites_global_data mark_def_sites_global_data;
1038 unsigned int i;
1040 timevar_push (TV_TREE_SSA_OTHER);
1042 /* Initialize the array of variables to rename. */
1043 if (vars_to_rename != NULL)
1045 invalidate_name_tags (vars_to_rename);
1047 /* Now remove all the existing PHI nodes (if any) for the variables
1048 that we are about to rename into SSA. */
1049 remove_all_phi_nodes_for (vars_to_rename);
1052 /* Allocate memory for the DEF_BLOCKS hash table. */
1053 def_blocks = htab_create (VARRAY_ACTIVE_SIZE (referenced_vars),
1054 def_blocks_hash, def_blocks_eq, def_blocks_free);
1056 /* Initialize dominance frontier and immediate dominator bitmaps.
1057 Also count the number of predecessors for each block. Doing so
1058 can save significant time during PHI insertion for large graphs. */
1059 dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
1060 FOR_EACH_BB (bb)
1062 edge e;
1063 int count = 0;
1065 for (e = bb->pred; e; e = e->pred_next)
1066 count++;
1068 bb_ann (bb)->num_preds = count;
1069 dfs[bb->index] = BITMAP_XMALLOC ();
1072 for (i = 0; i < num_referenced_vars; i++)
1073 var_ann (referenced_var (i))->current_def = NULL;
1075 /* Ensure that the dominance information is OK. */
1076 calculate_dominance_info (CDI_DOMINATORS);
1078 /* Compute dominance frontiers. */
1079 compute_dominance_frontiers (dfs);
1081 /* Setup callbacks for the generic dominator tree walker to find and
1082 mark definition sites. */
1083 walk_data.walk_stmts_backward = false;
1084 walk_data.dom_direction = CDI_DOMINATORS;
1085 walk_data.initialize_block_local_data = NULL;
1086 walk_data.before_dom_children_before_stmts = mark_def_sites_initialize_block;
1087 walk_data.before_dom_children_walk_stmts = mark_def_sites;
1088 walk_data.before_dom_children_after_stmts = NULL;
1089 walk_data.after_dom_children_before_stmts = NULL;
1090 walk_data.after_dom_children_walk_stmts = NULL;
1091 walk_data.after_dom_children_after_stmts = NULL;
1093 /* Notice that this bitmap is indexed using variable UIDs, so it must be
1094 large enough to accommodate all the variables referenced in the
1095 function, not just the ones we are renaming. */
1096 mark_def_sites_global_data.kills = sbitmap_alloc (num_referenced_vars);
1097 walk_data.global_data = &mark_def_sites_global_data;
1099 /* We do not have any local data. */
1100 walk_data.block_local_data_size = 0;
1102 /* Initialize the dominator walker. */
1103 init_walk_dominator_tree (&walk_data);
1105 /* Recursively walk the dominator tree. */
1106 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1108 /* Finalize the dominator walker. */
1109 fini_walk_dominator_tree (&walk_data);
1111 /* We no longer need this bitmap, clear and free it. */
1112 sbitmap_free (mark_def_sites_global_data.kills);
1114 /* Insert PHI nodes at dominance frontiers of definition blocks. */
1115 insert_phi_nodes (dfs);
1117 /* Rewrite all the basic blocks in the program. */
1118 timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
1120 /* Setup callbacks for the generic dominator tree walker. */
1121 walk_data.walk_stmts_backward = false;
1122 walk_data.dom_direction = CDI_DOMINATORS;
1123 walk_data.initialize_block_local_data = rewrite_initialize_block_local_data;
1124 walk_data.before_dom_children_before_stmts = rewrite_initialize_block;
1125 walk_data.before_dom_children_walk_stmts = rewrite_stmt;
1126 walk_data.before_dom_children_after_stmts = rewrite_add_phi_arguments;
1127 walk_data.after_dom_children_before_stmts = NULL;
1128 walk_data.after_dom_children_walk_stmts = NULL;
1129 walk_data.after_dom_children_after_stmts = rewrite_finalize_block;
1130 walk_data.global_data = NULL;
1131 walk_data.block_local_data_size = sizeof (struct rewrite_block_data);
1133 /* Initialize the dominator walker. */
1134 init_walk_dominator_tree (&walk_data);
1136 /* Recursively walk the dominator tree rewriting each statement in
1137 each basic block. */
1138 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1140 /* Finalize the dominator walker. */
1141 fini_walk_dominator_tree (&walk_data);
1143 timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS);
1145 /* Debugging dumps. */
1146 if (dump_file && (dump_flags & TDF_STATS))
1148 dump_dfa_stats (dump_file);
1149 dump_tree_ssa_stats (dump_file);
1152 /* Free allocated memory. */
1153 FOR_EACH_BB (bb)
1154 BITMAP_XFREE (dfs[bb->index]);
1155 free (dfs);
1157 htab_delete (def_blocks);
1159 timevar_pop (TV_TREE_SSA_OTHER);
1162 struct tree_opt_pass pass_build_ssa =
1164 "ssa", /* name */
1165 NULL, /* gate */
1166 rewrite_into_ssa, /* execute */
1167 NULL, /* sub */
1168 NULL, /* next */
1169 0, /* static_pass_number */
1170 0, /* tv_id */
1171 PROP_cfg | PROP_referenced_vars, /* properties_required */
1172 PROP_ssa, /* properties_provided */
1173 0, /* properties_destroyed */
1174 0, /* todo_flags_start */
1175 TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */