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)
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. */
24 #include "coretypes.h"
30 #include "langhooks.h"
31 #include "hard-reg-set.h"
32 #include "basic-block.h"
37 #include "diagnostic.h"
39 #include "tree-flow.h"
40 #include "tree-gimple.h"
41 #include "tree-inline.h"
44 #include "tree-alias-common.h"
46 #include "tree-dump.h"
47 #include "tree-pass.h"
52 /* This file builds the SSA form for a function as described in:
53 R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and K. Zadeck. Efficiently
54 Computing Static Single Assignment Form and the Control Dependence
55 Graph. ACM Transactions on Programming Languages and Systems,
56 13(4):451-490, October 1991. */
59 /* Structure to map a variable VAR to the set of blocks that contain
60 definitions for VAR. */
66 /* Blocks that contain definitions of VAR. Bit I will be set if the
67 Ith block contains a definition of VAR. */
70 /* Blocks that contain a phi node for VAR. */
73 /* Blocks where VAR is live-on-entry. Similar semantics as
78 /* Each entry in DEF_BLOCKS contains an element of type STRUCT
79 DEF_BLOCKS_D, mapping a variable VAR to a bitmap describing all the
80 basic blocks where VAR is defined (assigned a new value). It also
81 contains a bitmap of all the blocks where VAR is live-on-entry
82 (i.e., there is a use of VAR in block B without a preceding
83 definition in B). The live-on-entry information is used when
84 computing PHI pruning heuristics. */
85 static htab_t def_blocks
;
87 /* Global data to attach to the main dominator walk structure. */
88 struct mark_def_sites_global_data
90 /* This sbitmap contains the variables which are set before they
91 are used in a basic block. We keep it as a global variable
92 solely to avoid the overhead of allocating and deallocating
96 /* Bitmap of names to rename. */
97 sbitmap names_to_rename
;
100 struct rewrite_block_data
102 varray_type block_defs
;
105 /* Information stored for ssa names. */
109 /* This field indicates whether or not the variable may need PHI nodes.
110 See the enum's definition for more detailed information about the
112 ENUM_BITFIELD (need_phi_state
) need_phi_state
: 2;
114 /* The actual definition of the ssa name. */
118 /* Local functions. */
119 static void rewrite_finalize_block (struct dom_walk_data
*, basic_block
);
120 static void rewrite_initialize_block_local_data (struct dom_walk_data
*,
122 static void rewrite_initialize_block (struct dom_walk_data
*, basic_block
);
123 static void rewrite_add_phi_arguments (struct dom_walk_data
*, basic_block
);
124 static void mark_def_sites (struct dom_walk_data
*walk_data
,
125 basic_block bb
, block_stmt_iterator
);
126 static void mark_def_sites_initialize_block (struct dom_walk_data
*walk_data
,
128 static void set_def_block (tree
, basic_block
, bool, bool);
129 static void set_livein_block (tree
, basic_block
);
130 static bool prepare_use_operand_for_rename (use_operand_p
, size_t *uid_p
);
131 static bool prepare_def_operand_for_rename (tree def
, size_t *uid_p
);
132 static void insert_phi_nodes (bitmap
*, bitmap
);
133 static void rewrite_stmt (struct dom_walk_data
*, basic_block
,
134 block_stmt_iterator
);
135 static inline void rewrite_operand (use_operand_p
);
136 static void insert_phi_nodes_for (tree
, bitmap
*, varray_type
*);
137 static tree
get_reaching_def (tree
);
138 static hashval_t
def_blocks_hash (const void *);
139 static int def_blocks_eq (const void *, const void *);
140 static void def_blocks_free (void *);
141 static int debug_def_blocks_r (void **, void *);
142 static inline struct def_blocks_d
*get_def_blocks_for (tree
);
143 static inline struct def_blocks_d
*find_def_blocks_for (tree
);
144 static void htab_statistics (FILE *, htab_t
);
146 /* Get the information associated with NAME. */
148 static inline struct ssa_name_info
*
149 get_ssa_name_ann (tree name
)
151 if (!SSA_NAME_AUX (name
))
152 SSA_NAME_AUX (name
) = xcalloc (1, sizeof (struct ssa_name_info
));
154 return SSA_NAME_AUX (name
);
157 /* Gets phi_state field for VAR. */
159 static inline enum need_phi_state
160 get_phi_state (tree var
)
162 if (TREE_CODE (var
) == SSA_NAME
)
163 return get_ssa_name_ann (var
)->need_phi_state
;
165 return var_ann (var
)->need_phi_state
;
168 /* Sets phi_state field for VAR to STATE. */
171 set_phi_state (tree var
, enum need_phi_state state
)
173 if (TREE_CODE (var
) == SSA_NAME
)
174 get_ssa_name_ann (var
)->need_phi_state
= state
;
176 var_ann (var
)->need_phi_state
= state
;
179 /* Return the current definition for VAR. */
182 get_current_def (tree var
)
184 if (TREE_CODE (var
) == SSA_NAME
)
185 return get_ssa_name_ann (var
)->current_def
;
187 return var_ann (var
)->current_def
;
190 /* Sets current definition of VAR to DEF. */
193 set_current_def (tree var
, tree def
)
195 if (TREE_CODE (var
) == SSA_NAME
)
196 get_ssa_name_ann (var
)->current_def
= def
;
198 var_ann (var
)->current_def
= def
;
201 /* Compute global livein information given the set of blockx where
202 an object is locally live at the start of the block (LIVEIN)
203 and the set of blocks where the object is defined (DEF_BLOCKS).
205 Note: This routine augments the existing local livein information
206 to include global livein (i.e., it modifies the underlying bitmap
210 compute_global_livein (bitmap livein
, bitmap def_blocks
)
212 basic_block bb
, *worklist
, *tos
;
216 = (basic_block
*) xmalloc (sizeof (basic_block
) * (n_basic_blocks
+ 1));
218 EXECUTE_IF_SET_IN_BITMAP (livein
, 0, i
,
220 *tos
++ = BASIC_BLOCK (i
);
223 /* Iterate until the worklist is empty. */
224 while (tos
!= worklist
)
228 /* Pull a block off the worklist. */
231 /* For each predecessor block. */
232 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
234 basic_block pred
= e
->src
;
235 int pred_index
= pred
->index
;
237 /* None of this is necessary for the entry block. */
238 if (pred
!= ENTRY_BLOCK_PTR
239 && ! bitmap_bit_p (livein
, pred_index
)
240 && ! bitmap_bit_p (def_blocks
, pred_index
))
243 bitmap_set_bit (livein
, pred_index
);
252 /* Block initialization routine for mark_def_sites. Clear the
253 KILLS bitmap at the start of each block. */
256 mark_def_sites_initialize_block (struct dom_walk_data
*walk_data
,
257 basic_block bb ATTRIBUTE_UNUSED
)
259 struct mark_def_sites_global_data
*gd
= walk_data
->global_data
;
260 sbitmap kills
= gd
->kills
;
262 sbitmap_zero (kills
);
265 /* Block initialization routine for mark_def_sites. Clear the
266 KILLS bitmap at the start of each block. */
269 ssa_mark_def_sites_initialize_block (struct dom_walk_data
*walk_data
,
272 struct mark_def_sites_global_data
*gd
= walk_data
->global_data
;
273 sbitmap kills
= gd
->kills
;
277 sbitmap_zero (kills
);
279 for (phi
= phi_nodes (bb
); phi
; phi
= TREE_CHAIN (phi
))
281 def
= PHI_RESULT (phi
);
282 def_uid
= SSA_NAME_VERSION (def
);
284 if (!TEST_BIT (gd
->names_to_rename
, def_uid
))
287 set_def_block (def
, bb
, true, true);
288 SET_BIT (kills
, def_uid
);
292 /* Marks ssa names used as arguments of phis at the end of BB. */
295 ssa_mark_phi_uses (struct dom_walk_data
*walk_data
, basic_block bb
)
297 struct mark_def_sites_global_data
*gd
= walk_data
->global_data
;
298 sbitmap kills
= gd
->kills
;
303 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
305 if (e
->dest
== EXIT_BLOCK_PTR
)
308 for (phi
= phi_nodes (e
->dest
); phi
; phi
= TREE_CHAIN (phi
))
310 use
= PHI_ARG_DEF_FROM_EDGE (phi
, e
);
311 if (TREE_CODE (use
) != SSA_NAME
)
314 uid
= SSA_NAME_VERSION (use
);
316 if (TEST_BIT (gd
->names_to_rename
, uid
)
317 && !TEST_BIT (kills
, uid
))
318 set_livein_block (use
, bb
);
323 /* Call back for walk_dominator_tree used to collect definition sites
324 for every variable in the function. For every statement S in block
327 1- Variables defined by S in DEF_OPS(S) are marked in the bitmap
328 WALK_DATA->GLOBAL_DATA->KILLS.
330 2- If S uses a variable VAR and there is no preceding kill of VAR,
331 then it is marked in marked in the LIVEIN_BLOCKS bitmap
334 This information is used to determine which variables are live
335 across block boundaries to reduce the number of PHI nodes
339 mark_def_sites (struct dom_walk_data
*walk_data
,
341 block_stmt_iterator bsi
)
343 struct mark_def_sites_global_data
*gd
= walk_data
->global_data
;
344 sbitmap kills
= gd
->kills
;
345 v_may_def_optype v_may_defs
;
346 v_must_def_optype v_must_defs
;
354 /* Mark all the blocks that have definitions for each variable in the
355 VARS_TO_RENAME bitmap. */
356 stmt
= bsi_stmt (bsi
);
357 get_stmt_operands (stmt
);
358 ann
= stmt_ann (stmt
);
360 /* If a variable is used before being set, then the variable is live
361 across a block boundary, so mark it live-on-entry to BB. */
362 uses
= USE_OPS (ann
);
363 for (i
= 0; i
< NUM_USES (uses
); i
++)
365 use_operand_p use_p
= USE_OP_PTR (uses
, i
);
367 if (prepare_use_operand_for_rename (use_p
, &uid
)
368 && !TEST_BIT (kills
, uid
))
369 set_livein_block (USE_FROM_PTR (use_p
), bb
);
372 /* Similarly for virtual uses. */
373 vuses
= VUSE_OPS (ann
);
374 for (i
= 0; i
< NUM_VUSES (vuses
); i
++)
376 use_operand_p use_p
= VUSE_OP_PTR (vuses
, i
);
378 if (prepare_use_operand_for_rename (use_p
, &uid
)
379 && !TEST_BIT (kills
, uid
))
380 set_livein_block (USE_FROM_PTR (use_p
), bb
);
383 /* Note that virtual definitions are irrelevant for computing KILLS
384 because a V_MAY_DEF does not constitute a killing definition of the
385 variable. However, the operand of a virtual definitions is a use
386 of the variable, so it may cause the variable to be considered
388 v_may_defs
= V_MAY_DEF_OPS (ann
);
389 for (i
= 0; i
< NUM_V_MAY_DEFS (v_may_defs
); i
++)
391 use_operand_p use_p
= V_MAY_DEF_OP_PTR (v_may_defs
, i
);
392 if (prepare_use_operand_for_rename (use_p
, &uid
))
394 /* If we do not already have an SSA_NAME for our destination,
395 then set the destination to the source. */
396 if (TREE_CODE (V_MAY_DEF_RESULT (v_may_defs
, i
)) != SSA_NAME
)
397 SET_V_MAY_DEF_RESULT (v_may_defs
, i
, USE_FROM_PTR (use_p
));
399 set_livein_block (USE_FROM_PTR (use_p
), bb
);
400 set_def_block (V_MAY_DEF_RESULT (v_may_defs
, i
), bb
, false, false);
404 /* Now process the virtual must-defs made by this statement. */
405 v_must_defs
= V_MUST_DEF_OPS (ann
);
406 for (i
= 0; i
< NUM_V_MUST_DEFS (v_must_defs
); i
++)
408 tree def
= V_MUST_DEF_OP (v_must_defs
, i
);
410 if (prepare_def_operand_for_rename (def
, &uid
))
412 set_def_block (def
, bb
, false, false);
413 SET_BIT (kills
, uid
);
417 /* Now process the definition made by this statement. Mark the
418 variables in KILLS. */
419 defs
= DEF_OPS (ann
);
420 for (i
= 0; i
< NUM_DEFS (defs
); i
++)
422 tree def
= DEF_OP (defs
, i
);
424 if (prepare_def_operand_for_rename (def
, &uid
))
426 set_def_block (def
, bb
, false, false);
427 SET_BIT (kills
, uid
);
432 /* Ditto, but works over ssa names. */
435 ssa_mark_def_sites (struct dom_walk_data
*walk_data
,
437 block_stmt_iterator bsi
)
439 struct mark_def_sites_global_data
*gd
= walk_data
->global_data
;
440 sbitmap kills
= gd
->kills
;
441 v_may_def_optype v_may_defs
;
442 v_must_def_optype v_must_defs
;
446 size_t i
, uid
, def_uid
;
450 /* Mark all the blocks that have definitions for each variable in the
451 names_to_rename bitmap. */
452 stmt
= bsi_stmt (bsi
);
453 get_stmt_operands (stmt
);
454 ann
= stmt_ann (stmt
);
456 /* If a variable is used before being set, then the variable is live
457 across a block boundary, so mark it live-on-entry to BB. */
458 uses
= USE_OPS (ann
);
459 for (i
= 0; i
< NUM_USES (uses
); i
++)
461 use
= USE_OP (uses
, i
);
462 uid
= SSA_NAME_VERSION (use
);
464 if (TEST_BIT (gd
->names_to_rename
, uid
)
465 && !TEST_BIT (kills
, uid
))
466 set_livein_block (use
, bb
);
469 /* Similarly for virtual uses. */
470 vuses
= VUSE_OPS (ann
);
471 for (i
= 0; i
< NUM_VUSES (vuses
); i
++)
473 use
= VUSE_OP (vuses
, i
);
474 uid
= SSA_NAME_VERSION (use
);
476 if (TEST_BIT (gd
->names_to_rename
, uid
)
477 && !TEST_BIT (kills
, uid
))
478 set_livein_block (use
, bb
);
481 v_may_defs
= V_MAY_DEF_OPS (ann
);
482 for (i
= 0; i
< NUM_V_MAY_DEFS (v_may_defs
); i
++)
484 use
= V_MAY_DEF_OP (v_may_defs
, i
);
485 uid
= SSA_NAME_VERSION (use
);
487 if (TEST_BIT (gd
->names_to_rename
, uid
)
488 && !TEST_BIT (kills
, uid
))
489 set_livein_block (use
, bb
);
492 /* Now process the definition made by this statement. Mark the
493 variables in KILLS. */
494 defs
= DEF_OPS (ann
);
495 for (i
= 0; i
< NUM_DEFS (defs
); i
++)
497 def
= DEF_OP (defs
, i
);
498 def_uid
= SSA_NAME_VERSION (def
);
500 if (TEST_BIT (gd
->names_to_rename
, def_uid
))
502 set_def_block (def
, bb
, false, true);
503 SET_BIT (kills
, def_uid
);
507 v_may_defs
= V_MAY_DEF_OPS (ann
);
508 for (i
= 0; i
< NUM_V_MAY_DEFS (v_may_defs
); i
++)
510 def
= V_MAY_DEF_RESULT (v_may_defs
, i
);
511 def_uid
= SSA_NAME_VERSION (def
);
513 if (TEST_BIT (gd
->names_to_rename
, def_uid
))
515 set_def_block (def
, bb
, false, true);
516 SET_BIT (kills
, def_uid
);
520 v_must_defs
= V_MUST_DEF_OPS (ann
);
521 for (i
= 0; i
< NUM_V_MUST_DEFS (v_must_defs
); i
++)
523 def
= V_MUST_DEF_OP (v_must_defs
, i
);
524 def_uid
= SSA_NAME_VERSION (def
);
526 if (TEST_BIT (gd
->names_to_rename
, def_uid
))
528 set_def_block (def
, bb
, false, true);
529 SET_BIT (kills
, def_uid
);
534 /* Mark block BB as the definition site for variable VAR. PHI_P is true if
535 VAR is defined by a phi node. SSA_P is true if we are called from
536 rewrite_ssa_into_ssa. */
539 set_def_block (tree var
, basic_block bb
, bool phi_p
, bool ssa_p
)
541 struct def_blocks_d
*db_p
;
542 enum need_phi_state state
;
545 && TREE_CODE (var
) == SSA_NAME
)
546 var
= SSA_NAME_VAR (var
);
548 state
= get_phi_state (var
);
549 db_p
= get_def_blocks_for (var
);
551 /* Set the bit corresponding to the block where VAR is defined. */
552 bitmap_set_bit (db_p
->def_blocks
, bb
->index
);
554 bitmap_set_bit (db_p
->phi_blocks
, bb
->index
);
556 /* Keep track of whether or not we may need to insert phi nodes.
558 If we are in the UNKNOWN state, then this is the first definition
559 of VAR. Additionally, we have not seen any uses of VAR yet, so
560 we do not need a phi node for this variable at this time (i.e.,
561 transition to NEED_PHI_STATE_NO).
563 If we are in any other state, then we either have multiple definitions
564 of this variable occurring in different blocks or we saw a use of the
565 variable which was not dominated by the block containing the
566 definition(s). In this case we may need a PHI node, so enter
567 state NEED_PHI_STATE_MAYBE. */
568 if (state
== NEED_PHI_STATE_UNKNOWN
)
569 set_phi_state (var
, NEED_PHI_STATE_NO
);
571 set_phi_state (var
, NEED_PHI_STATE_MAYBE
);
575 /* Mark block BB as having VAR live at the entry to BB. */
578 set_livein_block (tree var
, basic_block bb
)
580 struct def_blocks_d
*db_p
;
581 enum need_phi_state state
= get_phi_state (var
);
583 db_p
= get_def_blocks_for (var
);
585 /* Set the bit corresponding to the block where VAR is live in. */
586 bitmap_set_bit (db_p
->livein_blocks
, bb
->index
);
588 /* Keep track of whether or not we may need to insert phi nodes.
590 If we reach here in NEED_PHI_STATE_NO, see if this use is dominated
591 by the single block containing the definition(s) of this variable. If
592 it is, then we remain in NEED_PHI_STATE_NO, otherwise we transition to
593 NEED_PHI_STATE_MAYBE. */
594 if (state
== NEED_PHI_STATE_NO
)
596 int def_block_index
= bitmap_first_set_bit (db_p
->def_blocks
);
598 if (def_block_index
== -1
599 || ! dominated_by_p (CDI_DOMINATORS
, bb
,
600 BASIC_BLOCK (def_block_index
)))
601 set_phi_state (var
, NEED_PHI_STATE_MAYBE
);
604 set_phi_state (var
, NEED_PHI_STATE_MAYBE
);
608 /* If the use operand pointed to by OP_P needs to be renamed, then strip away
609 any SSA_NAME wrapping the operand, set *UID_P to the underlying variable's
610 uid, and return true. Otherwise return false. If the operand was an
611 SSA_NAME, change it to the stipped name. */
614 prepare_use_operand_for_rename (use_operand_p op_p
, size_t *uid_p
)
616 tree use
= USE_FROM_PTR (op_p
);
617 tree var
= (TREE_CODE (use
) != SSA_NAME
) ? use
: SSA_NAME_VAR (use
);
618 *uid_p
= var_ann (var
)->uid
;
620 /* Ignore variables that don't need to be renamed. */
621 if (vars_to_rename
&& !bitmap_bit_p (vars_to_rename
, *uid_p
))
624 /* The variable needs to be renamed. If this is a use which already
625 has an SSA_NAME, then strip it off.
627 By not throwing away SSA_NAMEs on assignments, we avoid a lot of
628 useless churn of SSA_NAMEs without having to overly complicate the
630 if (TREE_CODE (use
) == SSA_NAME
)
636 /* If the def variable DEF needs to be renamed, then strip away any SSA_NAME
637 wrapping the operand, set *UID_P to the underlying variable's uid and return
638 true. Otherwise return false. */
641 prepare_def_operand_for_rename (tree def
, size_t *uid_p
)
643 tree var
= (TREE_CODE (def
) != SSA_NAME
) ? def
: SSA_NAME_VAR (def
);
644 *uid_p
= var_ann (var
)->uid
;
646 /* Ignore variables that don't need to be renamed. */
647 if (vars_to_rename
&& !bitmap_bit_p (vars_to_rename
, *uid_p
))
653 /* Helper for insert_phi_nodes. If VAR needs PHI nodes, insert them
654 at the dominance frontier (DFS) of blocks defining VAR.
655 WORK_STACK is the varray used to implement the worklist of basic
659 void insert_phi_nodes_1 (tree var
, bitmap
*dfs
, varray_type
*work_stack
)
661 if (get_phi_state (var
) != NEED_PHI_STATE_NO
)
662 insert_phi_nodes_for (var
, dfs
, work_stack
);
665 /* Insert PHI nodes at the dominance frontier of blocks with variable
666 definitions. DFS contains the dominance frontier information for
667 the flowgraph. PHI nodes will only be inserted at the dominance
668 frontier of definition blocks for variables whose NEED_PHI_STATE
669 annotation is marked as ``maybe'' or ``unknown'' (computed by
670 mark_def_sites). If NAMES_TO_RENAME is not NULL, do the same but
671 for ssa name rewriting. */
674 insert_phi_nodes (bitmap
*dfs
, bitmap names_to_rename
)
677 varray_type work_stack
;
679 timevar_push (TV_TREE_INSERT_PHI_NODES
);
681 /* Array WORK_STACK is a stack of CFG blocks. Each block that contains
682 an assignment or PHI node will be pushed to this stack. */
683 VARRAY_GENERIC_PTR_NOGC_INIT (work_stack
, last_basic_block
, "work_stack");
685 /* Iterate over all variables in VARS_TO_RENAME. For each variable, add
686 to the work list all the blocks that have a definition for the
687 variable. PHI nodes will be added to the dominance frontier blocks of
688 each definition block. */
691 EXECUTE_IF_SET_IN_BITMAP (names_to_rename
, 0, i
,
694 insert_phi_nodes_1 (ssa_name (i
), dfs
, &work_stack
);
697 else if (vars_to_rename
)
698 EXECUTE_IF_SET_IN_BITMAP (vars_to_rename
, 0, i
,
699 insert_phi_nodes_1 (referenced_var (i
), dfs
, &work_stack
));
701 for (i
= 0; i
< num_referenced_vars
; i
++)
702 insert_phi_nodes_1 (referenced_var (i
), dfs
, &work_stack
);
704 VARRAY_FREE (work_stack
);
706 timevar_pop (TV_TREE_INSERT_PHI_NODES
);
710 /* Perform a depth-first traversal of the dominator tree looking for
711 variables to rename. BB is the block where to start searching.
712 Renaming is a five step process:
714 1- Every definition made by PHI nodes at the start of the blocks is
715 registered as the current definition for the corresponding variable.
717 2- Every statement in BB is rewritten. USE and VUSE operands are
718 rewritten with their corresponding reaching definition. DEF and
719 VDEF targets are registered as new definitions.
721 3- All the PHI nodes in successor blocks of BB are visited. The
722 argument corresponding to BB is replaced with its current reaching
725 4- Recursively rewrite every dominator child block of BB.
727 5- Restore (in reverse order) the current reaching definition for every
728 new definition introduced in this block. This is done so that when
729 we return from the recursive call, all the current reaching
730 definitions are restored to the names that were valid in the
731 dominator parent of BB. */
733 /* Initialize the local stacks.
735 BLOCK_DEFS is used to save all the existing reaching definitions for
736 the new SSA names introduced in this block. Before registering a
737 new definition for a variable, the existing reaching definition is
738 pushed into this stack so that we can restore it in Step 5. */
741 rewrite_initialize_block_local_data (struct dom_walk_data
*walk_data ATTRIBUTE_UNUSED
,
742 basic_block bb ATTRIBUTE_UNUSED
,
743 bool recycled ATTRIBUTE_UNUSED
)
745 #ifdef ENABLE_CHECKING
746 struct rewrite_block_data
*bd
747 = (struct rewrite_block_data
*)VARRAY_TOP_GENERIC_PTR (walk_data
->block_data_stack
);
749 /* We get cleared memory from the allocator, so if the memory is
750 not cleared, then we are re-using a previously allocated entry. In
751 that case, we can also re-use the underlying virtual arrays. Just
752 make sure we clear them before using them! */
753 if (recycled
&& bd
->block_defs
&& VARRAY_ACTIVE_SIZE (bd
->block_defs
) > 0)
759 /* SSA Rewriting Step 1. Initialization, create a block local stack
760 of reaching definitions for new SSA names produced in this block
761 (BLOCK_DEFS). Register new definitions for every PHI node in the
765 rewrite_initialize_block (struct dom_walk_data
*walk_data
, basic_block bb
)
768 struct rewrite_block_data
*bd
769 = (struct rewrite_block_data
*)VARRAY_TOP_GENERIC_PTR (walk_data
->block_data_stack
);
771 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
772 fprintf (dump_file
, "\n\nRenaming block #%d\n\n", bb
->index
);
774 /* Step 1. Register new definitions for every PHI node in the block.
775 Conceptually, all the PHI nodes are executed in parallel and each PHI
776 node introduces a new version for the associated variable. */
777 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
779 tree result
= PHI_RESULT (phi
);
781 register_new_def (result
, &bd
->block_defs
);
785 /* Register DEF (an SSA_NAME) to be a new definition for the original
786 ssa name VAR and push VAR's current reaching definition
787 into the stack pointed by BLOCK_DEFS_P. */
790 ssa_register_new_def (tree var
, tree def
, varray_type
*block_defs_p
)
794 /* If this variable is set in a single basic block and all uses are
795 dominated by the set(s) in that single basic block, then there is
796 nothing to do. TODO we should not be called at all, and just
797 keep the original name. */
798 if (get_phi_state (var
) == NEED_PHI_STATE_NO
)
800 set_current_def (var
, def
);
804 currdef
= get_current_def (var
);
806 VARRAY_TREE_INIT (*block_defs_p
, 20, "block_defs");
808 /* Push the current reaching definition into *BLOCK_DEFS_P. This stack is
809 later used by the dominator tree callbacks to restore the reaching
810 definitions for all the variables defined in the block after a recursive
811 visit to all its immediately dominated blocks. */
812 VARRAY_PUSH_TREE (*block_defs_p
, var
);
813 VARRAY_PUSH_TREE (*block_defs_p
, currdef
);
815 /* Set the current reaching definition for VAR to be DEF. */
816 set_current_def (var
, def
);
819 /* Ditto, for rewriting ssa names. */
822 ssa_rewrite_initialize_block (struct dom_walk_data
*walk_data
, basic_block bb
)
825 struct rewrite_block_data
*bd
826 = (struct rewrite_block_data
*)VARRAY_TOP_GENERIC_PTR (walk_data
->block_data_stack
);
827 sbitmap names_to_rename
= walk_data
->global_data
;
831 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
832 fprintf (dump_file
, "\n\nRenaming block #%d\n\n", bb
->index
);
834 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
835 if (e
->flags
& EDGE_ABNORMAL
)
837 abnormal_phi
= (e
!= NULL
);
839 /* Step 1. Register new definitions for every PHI node in the block.
840 Conceptually, all the PHI nodes are executed in parallel and each PHI
841 node introduces a new version for the associated variable. */
842 for (phi
= phi_nodes (bb
); phi
; phi
= TREE_CHAIN (phi
))
844 tree result
= PHI_RESULT (phi
);
846 if (TEST_BIT (names_to_rename
, SSA_NAME_VERSION (result
)))
848 new_name
= duplicate_ssa_name (result
, phi
);
849 SET_PHI_RESULT (phi
, new_name
);
852 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name
) = 1;
857 ssa_register_new_def (result
, new_name
, &bd
->block_defs
);
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. */
867 rewrite_add_phi_arguments (struct dom_walk_data
*walk_data ATTRIBUTE_UNUSED
,
872 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
876 for (phi
= phi_nodes (e
->dest
); phi
; phi
= TREE_CHAIN (phi
))
880 /* If this PHI node has already been rewritten, then there is
881 nothing to do for this PHI or any following PHIs since we
882 always add new PHI nodes at the start of the PHI chain. */
883 if (PHI_REWRITTEN (phi
))
886 currdef
= get_reaching_def (SSA_NAME_VAR (PHI_RESULT (phi
)));
887 add_phi_arg (&phi
, currdef
, e
);
892 /* Ditto, for ssa name rewriting. */
895 ssa_rewrite_phi_arguments (struct dom_walk_data
*walk_data
, basic_block bb
)
898 sbitmap names_to_rename
= walk_data
->global_data
;
901 for (e
= bb
->succ
; e
; e
= e
->succ_next
)
905 if (e
->dest
== EXIT_BLOCK_PTR
)
908 for (phi
= phi_nodes (e
->dest
); phi
; phi
= TREE_CHAIN (phi
))
910 op
= PHI_ARG_DEF_PTR_FROM_EDGE (phi
, e
);
911 if (TREE_CODE (USE_FROM_PTR (op
)) != SSA_NAME
)
914 if (!TEST_BIT (names_to_rename
, SSA_NAME_VERSION (USE_FROM_PTR (op
))))
917 SET_USE (op
, get_reaching_def (USE_FROM_PTR (op
)));
918 if (e
->flags
& EDGE_ABNORMAL
)
919 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (op
)) = 1;
924 /* SSA Rewriting Step 5. Restore the current reaching definition for each
925 variable referenced in the block (in reverse order). */
928 rewrite_finalize_block (struct dom_walk_data
*walk_data
,
929 basic_block bb ATTRIBUTE_UNUSED
)
931 struct rewrite_block_data
*bd
932 = (struct rewrite_block_data
*)VARRAY_TOP_GENERIC_PTR (walk_data
->block_data_stack
);
934 /* Step 5. Restore the current reaching definition for each variable
935 referenced in the block (in reverse order). */
936 while (bd
->block_defs
&& VARRAY_ACTIVE_SIZE (bd
->block_defs
) > 0)
938 tree tmp
= VARRAY_TOP_TREE (bd
->block_defs
);
941 VARRAY_POP (bd
->block_defs
);
942 if (TREE_CODE (tmp
) == SSA_NAME
)
945 var
= SSA_NAME_VAR (saved_def
);
953 set_current_def (var
, saved_def
);
957 /* Ditto, for rewriting ssa names. */
960 ssa_rewrite_finalize_block (struct dom_walk_data
*walk_data
,
961 basic_block bb ATTRIBUTE_UNUSED
)
963 struct rewrite_block_data
*bd
964 = (struct rewrite_block_data
*)VARRAY_TOP_GENERIC_PTR (walk_data
->block_data_stack
);
966 /* Step 5. Restore the current reaching definition for each variable
967 referenced in the block (in reverse order). */
968 while (bd
->block_defs
&& VARRAY_ACTIVE_SIZE (bd
->block_defs
) > 0)
971 tree saved_def
= VARRAY_TOP_TREE (bd
->block_defs
);
972 VARRAY_POP (bd
->block_defs
);
974 var
= VARRAY_TOP_TREE (bd
->block_defs
);
975 VARRAY_POP (bd
->block_defs
);
977 set_current_def (var
, saved_def
);
981 /* Dump SSA information to FILE. */
984 dump_tree_ssa (FILE *file
)
988 = lang_hooks
.decl_printable_name (current_function_decl
, 2);
990 fprintf (file
, "SSA information for %s\n\n", funcname
);
994 dump_bb (bb
, file
, 0);
996 print_generic_stmt (file
, phi_nodes (bb
), dump_flags
);
997 fputs ("\n\n", file
);
1002 /* Dump SSA information to stderr. */
1005 debug_tree_ssa (void)
1007 dump_tree_ssa (stderr
);
1011 /* Dump SSA statistics on FILE. */
1014 dump_tree_ssa_stats (FILE *file
)
1016 fprintf (file
, "\nHash table statistics:\n");
1018 fprintf (file
, " def_blocks: ");
1019 htab_statistics (file
, def_blocks
);
1021 fprintf (file
, "\n");
1025 /* Dump SSA statistics on stderr. */
1028 debug_tree_ssa_stats (void)
1030 dump_tree_ssa_stats (stderr
);
1034 /* Dump statistics for the hash table HTAB. */
1037 htab_statistics (FILE *file
, htab_t htab
)
1039 fprintf (file
, "size %ld, %ld elements, %f collision/search ratio\n",
1040 (long) htab_size (htab
),
1041 (long) htab_elements (htab
),
1042 htab_collisions (htab
));
1046 /* Insert PHI nodes for variable VAR using the dominance frontier
1047 information given in DFS. WORK_STACK is the varray used to
1048 implement the worklist of basic blocks. */
1051 insert_phi_nodes_for (tree var
, bitmap
*dfs
, varray_type
*work_stack
)
1053 struct def_blocks_d
*def_map
;
1054 bitmap phi_insertion_points
;
1060 def_map
= find_def_blocks_for (var
);
1061 if (def_map
== NULL
)
1064 phi_insertion_points
= BITMAP_XMALLOC ();
1066 EXECUTE_IF_SET_IN_BITMAP (def_map
->def_blocks
, 0, bb_index
,
1068 VARRAY_PUSH_GENERIC_PTR_NOGC (*work_stack
, BASIC_BLOCK (bb_index
));
1071 /* Pop a block off the worklist, add every block that appears in
1072 the original block's dfs that we have not already processed to
1073 the worklist. Iterate until the worklist is empty. Blocks
1074 which are added to the worklist are potential sites for
1077 The iteration step could be done during PHI insertion just as
1078 easily. We do it here for historical reasons -- we used to have
1079 a heuristic which used the potential PHI insertion points to
1080 determine if fully pruned or semi pruned SSA form was appropriate.
1082 We now always use fully pruned SSA form. */
1083 while (VARRAY_ACTIVE_SIZE (*work_stack
) > 0)
1087 bb
= VARRAY_TOP_GENERIC_PTR_NOGC (*work_stack
);
1088 bb_index
= bb
->index
;
1090 VARRAY_POP (*work_stack
);
1092 EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs
[bb_index
],
1093 phi_insertion_points
,
1096 basic_block bb
= BASIC_BLOCK (dfs_index
);
1098 VARRAY_PUSH_GENERIC_PTR_NOGC (*work_stack
, bb
);
1099 bitmap_set_bit (phi_insertion_points
, dfs_index
);
1103 /* Remove the blocks where we already have the phis. */
1104 bitmap_operation (phi_insertion_points
, phi_insertion_points
,
1105 def_map
->phi_blocks
, BITMAP_AND_COMPL
);
1107 /* Now compute global livein for this variable. Note this modifies
1108 def_map->livein_blocks. */
1109 compute_global_livein (def_map
->livein_blocks
, def_map
->def_blocks
);
1111 /* And insert the PHI nodes. */
1112 EXECUTE_IF_AND_IN_BITMAP (phi_insertion_points
, def_map
->livein_blocks
,
1116 bb
= BASIC_BLOCK (bb_index
);
1118 phi
= create_phi_node (var
, bb
);
1120 /* If we are rewriting ssa names, add also the phi arguments. */
1121 if (TREE_CODE (var
) == SSA_NAME
)
1123 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
1124 add_phi_arg (&phi
, var
, e
);
1129 BITMAP_XFREE (phi_insertion_points
);
1132 /* SSA Rewriting Step 2. Rewrite every variable used in each statement in
1133 the block with its immediate reaching definitions. Update the current
1134 definition of a variable when a new real or virtual definition is found. */
1137 rewrite_stmt (struct dom_walk_data
*walk_data
,
1138 basic_block bb ATTRIBUTE_UNUSED
,
1139 block_stmt_iterator si
)
1145 v_may_def_optype v_may_defs
;
1146 v_must_def_optype v_must_defs
;
1149 struct rewrite_block_data
*bd
;
1151 bd
= VARRAY_TOP_GENERIC_PTR (walk_data
->block_data_stack
);
1153 stmt
= bsi_stmt (si
);
1154 ann
= stmt_ann (stmt
);
1156 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1158 fprintf (dump_file
, "Renaming statement ");
1159 print_generic_stmt (dump_file
, stmt
, TDF_SLIM
);
1160 fprintf (dump_file
, "\n");
1163 #if defined ENABLE_CHECKING
1164 /* We have just scanned the code for operands. No statement should
1170 defs
= DEF_OPS (ann
);
1171 uses
= USE_OPS (ann
);
1172 vuses
= VUSE_OPS (ann
);
1173 v_may_defs
= V_MAY_DEF_OPS (ann
);
1174 v_must_defs
= V_MUST_DEF_OPS (ann
);
1176 /* Step 1. Rewrite USES and VUSES in the statement. */
1177 for (i
= 0; i
< NUM_USES (uses
); i
++)
1178 rewrite_operand (USE_OP_PTR (uses
, i
));
1180 /* Rewrite virtual uses in the statement. */
1181 for (i
= 0; i
< NUM_VUSES (vuses
); i
++)
1182 rewrite_operand (VUSE_OP_PTR (vuses
, i
));
1184 /* Step 2. Register the statement's DEF and VDEF operands. */
1185 for (i
= 0; i
< NUM_DEFS (defs
); i
++)
1187 def_operand_p def_p
= DEF_OP_PTR (defs
, i
);
1189 if (TREE_CODE (DEF_FROM_PTR (def_p
)) != SSA_NAME
)
1190 SET_DEF (def_p
, make_ssa_name (DEF_FROM_PTR (def_p
), stmt
));
1192 /* FIXME: We shouldn't be registering new defs if the variable
1193 doesn't need to be renamed. */
1194 register_new_def (DEF_FROM_PTR (def_p
), &bd
->block_defs
);
1197 /* Register new virtual definitions made by the statement. */
1198 for (i
= 0; i
< NUM_V_MAY_DEFS (v_may_defs
); i
++)
1200 rewrite_operand (V_MAY_DEF_OP_PTR (v_may_defs
, i
));
1202 if (TREE_CODE (V_MAY_DEF_RESULT (v_may_defs
, i
)) != SSA_NAME
)
1203 SET_V_MAY_DEF_RESULT (v_may_defs
, i
,
1204 make_ssa_name (V_MAY_DEF_RESULT (v_may_defs
, i
),
1207 /* FIXME: We shouldn't be registering new defs if the variable
1208 doesn't need to be renamed. */
1209 register_new_def (V_MAY_DEF_RESULT (v_may_defs
, i
), &bd
->block_defs
);
1212 /* Register new virtual mustdefs made by the statement. */
1213 for (i
= 0; i
< NUM_V_MUST_DEFS (v_must_defs
); i
++)
1215 def_operand_p v_must_def_p
= V_MUST_DEF_OP_PTR (v_must_defs
, i
);
1217 if (TREE_CODE (DEF_FROM_PTR (v_must_def_p
)) != SSA_NAME
)
1218 SET_DEF (v_must_def_p
,
1219 make_ssa_name (DEF_FROM_PTR (v_must_def_p
), stmt
));
1221 /* FIXME: We shouldn't be registering new mustdefs if the variable
1222 doesn't need to be renamed. */
1223 register_new_def (DEF_FROM_PTR (v_must_def_p
), &bd
->block_defs
);
1228 /* Ditto, for rewriting ssa names. */
1231 ssa_rewrite_stmt (struct dom_walk_data
*walk_data
,
1232 basic_block bb ATTRIBUTE_UNUSED
,
1233 block_stmt_iterator si
)
1238 use_operand_p use_p
;
1239 def_operand_p def_p
;
1241 v_may_def_optype v_may_defs
;
1242 v_must_def_optype v_must_defs
;
1245 struct rewrite_block_data
*bd
;
1246 sbitmap names_to_rename
= walk_data
->global_data
;
1248 bd
= VARRAY_TOP_GENERIC_PTR (walk_data
->block_data_stack
);
1250 stmt
= bsi_stmt (si
);
1251 ann
= stmt_ann (stmt
);
1253 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1255 fprintf (dump_file
, "Renaming statement ");
1256 print_generic_stmt (dump_file
, stmt
, TDF_SLIM
);
1257 fprintf (dump_file
, "\n");
1260 #if defined ENABLE_CHECKING
1261 /* We have just scanned the code for operands. No statement should
1267 defs
= DEF_OPS (ann
);
1268 uses
= USE_OPS (ann
);
1269 vuses
= VUSE_OPS (ann
);
1270 v_may_defs
= V_MAY_DEF_OPS (ann
);
1271 v_must_defs
= V_MUST_DEF_OPS (ann
);
1273 /* Step 1. Rewrite USES and VUSES in the statement. */
1274 for (i
= 0; i
< NUM_USES (uses
); i
++)
1276 use_p
= USE_OP_PTR (uses
, i
);
1277 if (TEST_BIT (names_to_rename
, SSA_NAME_VERSION (USE_FROM_PTR (use_p
))))
1278 SET_USE (use_p
, get_reaching_def (USE_FROM_PTR (use_p
)));
1281 /* Rewrite virtual uses in the statement. */
1282 for (i
= 0; i
< NUM_VUSES (vuses
); i
++)
1284 use_p
= VUSE_OP_PTR (vuses
, i
);
1285 if (TEST_BIT (names_to_rename
, SSA_NAME_VERSION (USE_FROM_PTR (use_p
))))
1286 SET_USE (use_p
, get_reaching_def (USE_FROM_PTR (use_p
)));
1289 for (i
= 0; i
< NUM_V_MAY_DEFS (v_may_defs
); i
++)
1291 use_p
= V_MAY_DEF_OP_PTR (v_may_defs
, i
);
1292 if (TEST_BIT (names_to_rename
, SSA_NAME_VERSION (USE_FROM_PTR (use_p
))))
1293 SET_USE (use_p
, get_reaching_def (USE_FROM_PTR (use_p
)));
1296 /* Step 2. Register the statement's DEF and VDEF operands. */
1297 for (i
= 0; i
< NUM_DEFS (defs
); i
++)
1299 def_p
= DEF_OP_PTR (defs
, i
);
1300 var
= DEF_FROM_PTR (def_p
);
1302 if (!TEST_BIT (names_to_rename
, SSA_NAME_VERSION (var
)))
1305 SET_DEF (def_p
, duplicate_ssa_name (var
, stmt
));
1306 ssa_register_new_def (var
, DEF_FROM_PTR (def_p
), &bd
->block_defs
);
1309 /* Register new virtual definitions made by the statement. */
1310 for (i
= 0; i
< NUM_V_MAY_DEFS (v_may_defs
); i
++)
1312 def_p
= V_MAY_DEF_RESULT_PTR (v_may_defs
, i
);
1313 var
= DEF_FROM_PTR (def_p
);
1315 if (!TEST_BIT (names_to_rename
, SSA_NAME_VERSION (var
)))
1318 SET_DEF (def_p
, duplicate_ssa_name (var
, stmt
));
1319 ssa_register_new_def (var
, DEF_FROM_PTR (def_p
), &bd
->block_defs
);
1322 for (i
= 0; i
< NUM_V_MUST_DEFS (v_must_defs
); i
++)
1324 def_p
= V_MUST_DEF_OP_PTR (v_must_defs
, i
);
1325 var
= DEF_FROM_PTR (def_p
);
1327 if (!TEST_BIT (names_to_rename
, SSA_NAME_VERSION (var
)))
1330 SET_DEF (def_p
, duplicate_ssa_name (var
, stmt
));
1331 ssa_register_new_def (var
, DEF_FROM_PTR (def_p
), &bd
->block_defs
);
1335 /* Replace the operand pointed by OP_P with its immediate reaching
1339 rewrite_operand (use_operand_p op_p
)
1341 if (TREE_CODE (USE_FROM_PTR (op_p
)) != SSA_NAME
)
1342 SET_USE (op_p
, get_reaching_def (USE_FROM_PTR (op_p
)));
1345 /* Register DEF (an SSA_NAME) to be a new definition for its underlying
1346 variable (SSA_NAME_VAR (DEF)) and push VAR's current reaching definition
1347 into the stack pointed by BLOCK_DEFS_P. */
1350 register_new_def (tree def
, varray_type
*block_defs_p
)
1352 tree var
= SSA_NAME_VAR (def
);
1355 /* If this variable is set in a single basic block and all uses are
1356 dominated by the set(s) in that single basic block, then there is
1357 no reason to record anything for this variable in the block local
1358 definition stacks. Doing so just wastes time and memory.
1360 This is the same test to prune the set of variables which may
1361 need PHI nodes. So we just use that information since it's already
1362 computed and available for us to use. */
1363 if (get_phi_state (var
) == NEED_PHI_STATE_NO
)
1365 set_current_def (var
, def
);
1369 currdef
= get_current_def (var
);
1370 if (! *block_defs_p
)
1371 VARRAY_TREE_INIT (*block_defs_p
, 20, "block_defs");
1373 /* Push the current reaching definition into *BLOCK_DEFS_P. This stack is
1374 later used by the dominator tree callbacks to restore the reaching
1375 definitions for all the variables defined in the block after a recursive
1376 visit to all its immediately dominated blocks. If there is no current
1377 reaching definition, then just record the underlying _DECL node. */
1378 VARRAY_PUSH_TREE (*block_defs_p
, currdef
? currdef
: var
);
1380 /* Set the current reaching definition for VAR to be DEF. */
1381 set_current_def (var
, def
);
1384 /* Return the current definition for variable VAR. If none is found,
1385 create a new SSA name to act as the zeroth definition for VAR. If VAR
1386 is call clobbered and there exists a more recent definition of
1387 GLOBAL_VAR, return the definition for GLOBAL_VAR. This means that VAR
1388 has been clobbered by a function call since its last assignment. */
1391 get_reaching_def (tree var
)
1393 tree default_d
, currdef_var
, avar
;
1395 /* Lookup the current reaching definition for VAR. */
1396 default_d
= NULL_TREE
;
1397 currdef_var
= get_current_def (var
);
1399 /* If there is no reaching definition for VAR, create and register a
1400 default definition for it (if needed). */
1401 if (currdef_var
== NULL_TREE
)
1403 if (TREE_CODE (var
) == SSA_NAME
)
1404 avar
= SSA_NAME_VAR (var
);
1408 default_d
= default_def (avar
);
1409 if (default_d
== NULL_TREE
)
1411 default_d
= make_ssa_name (avar
, build_empty_stmt ());
1412 set_default_def (avar
, default_d
);
1414 set_current_def (var
, default_d
);
1417 /* Return the current reaching definition for VAR, or the default
1418 definition, if we had to create one. */
1419 return (currdef_var
) ? currdef_var
: default_d
;
1423 /* Hashing and equality functions for DEF_BLOCKS. */
1426 def_blocks_hash (const void *p
)
1428 return htab_hash_pointer
1429 ((const void *)((const struct def_blocks_d
*)p
)->var
);
1433 def_blocks_eq (const void *p1
, const void *p2
)
1435 return ((const struct def_blocks_d
*)p1
)->var
1436 == ((const struct def_blocks_d
*)p2
)->var
;
1439 /* Free memory allocated by one entry in DEF_BLOCKS. */
1442 def_blocks_free (void *p
)
1444 struct def_blocks_d
*entry
= p
;
1445 BITMAP_XFREE (entry
->def_blocks
);
1446 BITMAP_XFREE (entry
->phi_blocks
);
1447 BITMAP_XFREE (entry
->livein_blocks
);
1452 /* Dump the DEF_BLOCKS hash table on stderr. */
1455 debug_def_blocks (void)
1457 htab_traverse (def_blocks
, debug_def_blocks_r
, NULL
);
1460 /* Callback for htab_traverse to dump the DEF_BLOCKS hash table. */
1463 debug_def_blocks_r (void **slot
, void *data ATTRIBUTE_UNUSED
)
1466 struct def_blocks_d
*db_p
= (struct def_blocks_d
*) *slot
;
1468 fprintf (stderr
, "VAR: ");
1469 print_generic_expr (stderr
, db_p
->var
, dump_flags
);
1470 fprintf (stderr
, ", DEF_BLOCKS: { ");
1471 EXECUTE_IF_SET_IN_BITMAP (db_p
->def_blocks
, 0, i
,
1472 fprintf (stderr
, "%ld ", i
));
1473 fprintf (stderr
, "}");
1474 fprintf (stderr
, ", LIVEIN_BLOCKS: { ");
1475 EXECUTE_IF_SET_IN_BITMAP (db_p
->livein_blocks
, 0, i
,
1476 fprintf (stderr
, "%ld ", i
));
1477 fprintf (stderr
, "}\n");
1483 /* Return the set of blocks where variable VAR is defined and the blocks
1484 where VAR is live on entry (livein). Return NULL, if no entry is
1485 found in DEF_BLOCKS. */
1487 static inline struct def_blocks_d
*
1488 find_def_blocks_for (tree var
)
1490 struct def_blocks_d dm
;
1492 return (struct def_blocks_d
*) htab_find (def_blocks
, &dm
);
1496 /* Return the set of blocks where variable VAR is defined and the blocks
1497 where VAR is live on entry (livein). If no entry is found in
1498 DEF_BLOCKS, a new one is created and returned. */
1500 static inline struct def_blocks_d
*
1501 get_def_blocks_for (tree var
)
1503 struct def_blocks_d db
, *db_p
;
1507 slot
= htab_find_slot (def_blocks
, (void *) &db
, INSERT
);
1510 db_p
= xmalloc (sizeof (*db_p
));
1512 db_p
->def_blocks
= BITMAP_XMALLOC ();
1513 db_p
->phi_blocks
= BITMAP_XMALLOC ();
1514 db_p
->livein_blocks
= BITMAP_XMALLOC ();
1515 *slot
= (void *) db_p
;
1518 db_p
= (struct def_blocks_d
*) *slot
;
1523 /* If a variable V in VARS_TO_RENAME is a pointer, the renaming
1524 process will cause us to lose the name memory tags that may have
1525 been associated with the various SSA_NAMEs of V. This means that
1526 the variables aliased to those name tags also need to be renamed
1529 FIXME 1- We should either have a better scheme for renaming
1530 pointers that doesn't lose name tags or re-run alias
1531 analysis to recover points-to information.
1533 2- Currently we just invalidate *all* the name tags. This
1534 should be more selective. */
1537 invalidate_name_tags (bitmap vars_to_rename
)
1540 bool rename_name_tags_p
;
1542 rename_name_tags_p
= false;
1543 EXECUTE_IF_SET_IN_BITMAP (vars_to_rename
, 0, i
,
1544 if (POINTER_TYPE_P (TREE_TYPE (referenced_var (i
))))
1546 rename_name_tags_p
= true;
1550 if (rename_name_tags_p
)
1551 for (i
= 0; i
< num_referenced_vars
; i
++)
1553 var_ann_t ann
= var_ann (referenced_var (i
));
1555 if (ann
->mem_tag_kind
== NAME_TAG
)
1558 varray_type may_aliases
= ann
->may_aliases
;
1560 bitmap_set_bit (vars_to_rename
, ann
->uid
);
1561 if (ann
->may_aliases
)
1562 for (j
= 0; j
< VARRAY_ACTIVE_SIZE (may_aliases
); j
++)
1564 tree var
= VARRAY_TREE (may_aliases
, j
);
1565 bitmap_set_bit (vars_to_rename
, var_ann (var
)->uid
);
1572 /* Main entry point into the SSA builder. The renaming process
1573 proceeds in five main phases:
1575 1- If VARS_TO_RENAME has any entries, any existing PHI nodes for
1576 those variables are removed from the flow graph so that they can
1579 2- Compute dominance frontier and immediate dominators, needed to
1580 insert PHI nodes and rename the function in dominator tree
1583 3- Find and mark all the blocks that define variables
1586 4- Insert PHI nodes at dominance frontiers (insert_phi_nodes).
1588 5- Rename all the blocks (rewrite_initialize_block,
1589 rewrite_add_phi_arguments) and statements in the program
1592 Steps 3 and 5 are done using the dominator tree walker
1593 (walk_dominator_tree).
1595 ALL is true if all variables should be renamed (otherwise just those
1596 mentioned in vars_to_rename are taken into account). */
1599 rewrite_into_ssa (bool all
)
1603 struct dom_walk_data walk_data
;
1604 struct mark_def_sites_global_data mark_def_sites_global_data
;
1605 bitmap old_vars_to_rename
= vars_to_rename
;
1608 timevar_push (TV_TREE_SSA_OTHER
);
1611 vars_to_rename
= NULL
;
1614 /* Initialize the array of variables to rename. */
1616 if (vars_to_rename
== NULL
)
1619 if (bitmap_first_set_bit (vars_to_rename
) < 0)
1621 timevar_pop (TV_TREE_SSA_OTHER
);
1625 invalidate_name_tags (vars_to_rename
);
1627 /* Now remove all the existing PHI nodes (if any) for the variables
1628 that we are about to rename into SSA. */
1629 remove_all_phi_nodes_for (vars_to_rename
);
1632 /* Allocate memory for the DEF_BLOCKS hash table. */
1633 def_blocks
= htab_create (VARRAY_ACTIVE_SIZE (referenced_vars
),
1634 def_blocks_hash
, def_blocks_eq
, def_blocks_free
);
1636 /* Initialize dominance frontier and immediate dominator bitmaps.
1637 Also count the number of predecessors for each block. Doing so
1638 can save significant time during PHI insertion for large graphs. */
1639 dfs
= (bitmap
*) xmalloc (last_basic_block
* sizeof (bitmap
*));
1645 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
1648 bb_ann (bb
)->num_preds
= count
;
1649 dfs
[bb
->index
] = BITMAP_XMALLOC ();
1652 for (i
= 0; i
< num_referenced_vars
; i
++)
1653 set_current_def (referenced_var (i
), NULL_TREE
);
1655 /* Ensure that the dominance information is OK. */
1656 calculate_dominance_info (CDI_DOMINATORS
);
1658 /* Compute dominance frontiers. */
1659 compute_dominance_frontiers (dfs
);
1661 /* Setup callbacks for the generic dominator tree walker to find and
1662 mark definition sites. */
1663 walk_data
.walk_stmts_backward
= false;
1664 walk_data
.dom_direction
= CDI_DOMINATORS
;
1665 walk_data
.initialize_block_local_data
= NULL
;
1666 walk_data
.before_dom_children_before_stmts
= mark_def_sites_initialize_block
;
1667 walk_data
.before_dom_children_walk_stmts
= mark_def_sites
;
1668 walk_data
.before_dom_children_after_stmts
= NULL
;
1669 walk_data
.after_dom_children_before_stmts
= NULL
;
1670 walk_data
.after_dom_children_walk_stmts
= NULL
;
1671 walk_data
.after_dom_children_after_stmts
= NULL
;
1673 /* Notice that this bitmap is indexed using variable UIDs, so it must be
1674 large enough to accommodate all the variables referenced in the
1675 function, not just the ones we are renaming. */
1676 mark_def_sites_global_data
.kills
= sbitmap_alloc (num_referenced_vars
);
1677 walk_data
.global_data
= &mark_def_sites_global_data
;
1679 /* We do not have any local data. */
1680 walk_data
.block_local_data_size
= 0;
1682 /* Initialize the dominator walker. */
1683 init_walk_dominator_tree (&walk_data
);
1685 /* Recursively walk the dominator tree. */
1686 walk_dominator_tree (&walk_data
, ENTRY_BLOCK_PTR
);
1688 /* Finalize the dominator walker. */
1689 fini_walk_dominator_tree (&walk_data
);
1691 /* We no longer need this bitmap, clear and free it. */
1692 sbitmap_free (mark_def_sites_global_data
.kills
);
1694 /* Insert PHI nodes at dominance frontiers of definition blocks. */
1695 insert_phi_nodes (dfs
, NULL
);
1697 /* Rewrite all the basic blocks in the program. */
1698 timevar_push (TV_TREE_SSA_REWRITE_BLOCKS
);
1700 /* Setup callbacks for the generic dominator tree walker. */
1701 walk_data
.walk_stmts_backward
= false;
1702 walk_data
.dom_direction
= CDI_DOMINATORS
;
1703 walk_data
.initialize_block_local_data
= rewrite_initialize_block_local_data
;
1704 walk_data
.before_dom_children_before_stmts
= rewrite_initialize_block
;
1705 walk_data
.before_dom_children_walk_stmts
= rewrite_stmt
;
1706 walk_data
.before_dom_children_after_stmts
= rewrite_add_phi_arguments
;
1707 walk_data
.after_dom_children_before_stmts
= NULL
;
1708 walk_data
.after_dom_children_walk_stmts
= NULL
;
1709 walk_data
.after_dom_children_after_stmts
= rewrite_finalize_block
;
1710 walk_data
.global_data
= NULL
;
1711 walk_data
.block_local_data_size
= sizeof (struct rewrite_block_data
);
1713 /* Initialize the dominator walker. */
1714 init_walk_dominator_tree (&walk_data
);
1716 /* Recursively walk the dominator tree rewriting each statement in
1717 each basic block. */
1718 walk_dominator_tree (&walk_data
, ENTRY_BLOCK_PTR
);
1720 /* Finalize the dominator walker. */
1721 fini_walk_dominator_tree (&walk_data
);
1723 timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS
);
1725 /* Debugging dumps. */
1726 if (dump_file
&& (dump_flags
& TDF_STATS
))
1728 dump_dfa_stats (dump_file
);
1729 dump_tree_ssa_stats (dump_file
);
1732 /* Free allocated memory. */
1734 BITMAP_XFREE (dfs
[bb
->index
]);
1737 htab_delete (def_blocks
);
1739 vars_to_rename
= old_vars_to_rename
;
1740 timevar_pop (TV_TREE_SSA_OTHER
);
1743 /* The ssa names in NAMES_TO_RENAME may have more than one definition;
1744 add phi nodes and rewrite them to fix this. */
1747 rewrite_ssa_into_ssa (bitmap names_to_rename
)
1751 struct dom_walk_data walk_data
;
1752 struct mark_def_sites_global_data mark_def_sites_global_data
;
1754 sbitmap snames_to_rename
;
1757 if (bitmap_first_set_bit (names_to_rename
) < 0)
1760 timevar_push (TV_TREE_SSA_OTHER
);
1762 /* Allocate memory for the DEF_BLOCKS hash table. */
1763 def_blocks
= htab_create (num_ssa_names
,
1764 def_blocks_hash
, def_blocks_eq
, def_blocks_free
);
1766 /* Initialize dominance frontier and immediate dominator bitmaps.
1767 Also count the number of predecessors for each block. Doing so
1768 can save significant time during PHI insertion for large graphs. */
1769 dfs
= (bitmap
*) xmalloc (last_basic_block
* sizeof (bitmap
*));
1775 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
1778 bb_ann (bb
)->num_preds
= count
;
1779 dfs
[bb
->index
] = BITMAP_XMALLOC ();
1782 /* Ensure that the dominance information is OK. */
1783 calculate_dominance_info (CDI_DOMINATORS
);
1785 /* Compute dominance frontiers. */
1786 compute_dominance_frontiers (dfs
);
1788 /* Setup callbacks for the generic dominator tree walker to find and
1789 mark definition sites. */
1790 walk_data
.walk_stmts_backward
= false;
1791 walk_data
.dom_direction
= CDI_DOMINATORS
;
1792 walk_data
.initialize_block_local_data
= NULL
;
1793 walk_data
.before_dom_children_before_stmts
1794 = ssa_mark_def_sites_initialize_block
;
1795 walk_data
.before_dom_children_walk_stmts
= ssa_mark_def_sites
;
1796 walk_data
.before_dom_children_after_stmts
= ssa_mark_phi_uses
;
1797 walk_data
.after_dom_children_before_stmts
= NULL
;
1798 walk_data
.after_dom_children_walk_stmts
= NULL
;
1799 walk_data
.after_dom_children_after_stmts
= NULL
;
1801 snames_to_rename
= sbitmap_alloc (num_ssa_names
);
1802 sbitmap_zero (snames_to_rename
);
1803 EXECUTE_IF_SET_IN_BITMAP (names_to_rename
, 0, i
,
1804 SET_BIT (snames_to_rename
, i
));
1806 mark_def_sites_global_data
.kills
= sbitmap_alloc (num_ssa_names
);
1807 mark_def_sites_global_data
.names_to_rename
= snames_to_rename
;
1808 walk_data
.global_data
= &mark_def_sites_global_data
;
1810 /* We do not have any local data. */
1811 walk_data
.block_local_data_size
= 0;
1813 /* Initialize the dominator walker. */
1814 init_walk_dominator_tree (&walk_data
);
1816 /* Recursively walk the dominator tree. */
1817 walk_dominator_tree (&walk_data
, ENTRY_BLOCK_PTR
);
1819 /* Finalize the dominator walker. */
1820 fini_walk_dominator_tree (&walk_data
);
1822 /* We no longer need this bitmap, clear and free it. */
1823 sbitmap_free (mark_def_sites_global_data
.kills
);
1825 for (i
= 0; i
< num_ssa_names
; i
++)
1827 set_current_def (ssa_name (i
), NULL_TREE
);
1829 /* Insert PHI nodes at dominance frontiers of definition blocks. */
1830 insert_phi_nodes (dfs
, names_to_rename
);
1832 /* Rewrite all the basic blocks in the program. */
1833 timevar_push (TV_TREE_SSA_REWRITE_BLOCKS
);
1835 /* Setup callbacks for the generic dominator tree walker. */
1836 walk_data
.walk_stmts_backward
= false;
1837 walk_data
.dom_direction
= CDI_DOMINATORS
;
1838 walk_data
.initialize_block_local_data
1839 = rewrite_initialize_block_local_data
;
1840 walk_data
.before_dom_children_before_stmts
= ssa_rewrite_initialize_block
;
1841 walk_data
.before_dom_children_walk_stmts
= ssa_rewrite_stmt
;
1842 walk_data
.before_dom_children_after_stmts
= ssa_rewrite_phi_arguments
;
1843 walk_data
.after_dom_children_before_stmts
= NULL
;
1844 walk_data
.after_dom_children_walk_stmts
= NULL
;
1845 walk_data
.after_dom_children_after_stmts
= ssa_rewrite_finalize_block
;
1846 walk_data
.global_data
= snames_to_rename
;
1847 walk_data
.block_local_data_size
= sizeof (struct rewrite_block_data
);
1849 /* Initialize the dominator walker. */
1850 init_walk_dominator_tree (&walk_data
);
1852 /* Recursively walk the dominator tree rewriting each statement in
1853 each basic block. */
1854 walk_dominator_tree (&walk_data
, ENTRY_BLOCK_PTR
);
1856 /* Finalize the dominator walker. */
1857 fini_walk_dominator_tree (&walk_data
);
1859 sbitmap_free (snames_to_rename
);
1861 timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS
);
1863 /* Debugging dumps. */
1864 if (dump_file
&& (dump_flags
& TDF_STATS
))
1866 dump_dfa_stats (dump_file
);
1867 dump_tree_ssa_stats (dump_file
);
1870 /* Free allocated memory. */
1872 BITMAP_XFREE (dfs
[bb
->index
]);
1875 htab_delete (def_blocks
);
1877 for (i
= 0; i
< num_ssa_names
; i
++)
1879 name
= ssa_name (i
);
1881 || !SSA_NAME_AUX (name
))
1884 free (SSA_NAME_AUX (name
));
1885 SSA_NAME_AUX (name
) = NULL
;
1887 timevar_pop (TV_TREE_SSA_OTHER
);
1890 /* Rewrites all variables into ssa. */
1893 rewrite_all_into_ssa (void)
1895 rewrite_into_ssa (true);
1898 struct tree_opt_pass pass_build_ssa
=
1902 rewrite_all_into_ssa
, /* execute */
1905 0, /* static_pass_number */
1907 PROP_cfg
| PROP_referenced_vars
, /* properties_required */
1908 PROP_ssa
, /* properties_provided */
1909 0, /* properties_destroyed */
1910 0, /* todo_flags_start */
1911 TODO_dump_func
| TODO_verify_ssa
/* todo_flags_finish */