summaryrefslogtreecommitdiff
path: root/gcc/tree-into-ssa.c
diff options
context:
space:
mode:
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-29 02:13:03 +0000
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-29 02:13:03 +0000
commita80fab694b7bc50864a1e4335223d21ddf07f408 (patch)
treee6be8850c8565c316d2a545e3074c554060f1985 /gcc/tree-into-ssa.c
parentfe80e237e174353df47f1fad8a735c379fbfdb0e (diff)
downloadgcc-a80fab694b7bc50864a1e4335223d21ddf07f408.tar.gz
2004-10-28 Daniel Berlin <dberlin@dberlin.org>
* tree-into-ssa.c (rewrite_virtual_phi_arguments): New function. (rewrite_blocks): Modify argument, and use it to decide which function to call. (rewrite_def_def_chains): Call rewrite_blocks with true here. (rewrite_into_ssa): and call it with false here. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89802 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-into-ssa.c')
-rw-r--r--gcc/tree-into-ssa.c61
1 files changed, 51 insertions, 10 deletions
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index 079065ea62a..e5dc30b33ab 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -799,6 +799,42 @@ rewrite_add_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
}
}
+/* Rewrite existing virtual PHI arguments so that they have the correct
+ reaching definitions. BB is the basic block whose successors contain the
+ phi nodes we want to add arguments for. */
+
+static void
+rewrite_virtual_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
+ basic_block bb)
+{
+ edge e;
+ use_operand_p op;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ {
+ tree phi;
+
+ if (e->dest == EXIT_BLOCK_PTR)
+ continue;
+
+ for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
+ {
+ tree result = PHI_RESULT (phi);
+ op = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
+
+ if (is_gimple_reg (result)
+ || !bitmap_bit_p (vars_to_rename,
+ var_ann (SSA_NAME_VAR (result))->uid))
+ continue;
+
+ SET_USE (op, get_reaching_def (SSA_NAME_VAR (result)));
+ if (e->flags & EDGE_ABNORMAL)
+ SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (op)) = 1;
+ }
+ }
+}
+
/* Ditto, for ssa name rewriting. */
static void
@@ -821,9 +857,9 @@ ssa_rewrite_phi_arguments (struct dom_walk_data *walk_data, basic_block bb)
op = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
if (TREE_CODE (USE_FROM_PTR (op)) != SSA_NAME)
continue;
-
+
if (!TEST_BIT (names_to_rename, SSA_NAME_VERSION (USE_FROM_PTR (op))))
- continue;
+ continue;
SET_USE (op, get_reaching_def (USE_FROM_PTR (op)));
if (e->flags & EDGE_ABNORMAL)
@@ -1383,14 +1419,16 @@ invalidate_name_tags (bitmap vars_to_rename)
}
/* Rewrite the actual blocks, statements, and phi arguments, to be in SSA
- form. ADD_PHI_ARGS is true if we should be adding arguments to phi nodes,
- because they may have been just inserted. */
+ form. FIX_VIRTUAL_PHIS is true if we should only be fixing up virtual
+ phi arguments, instead of adding new phi arguments for just added phi
+ nodes. */
+
static void
-rewrite_blocks (bool add_phi_args)
+rewrite_blocks (bool fix_virtual_phis)
{
struct dom_walk_data walk_data;
-
+
/* Rewrite all the basic blocks in the program. */
timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
@@ -1401,8 +1439,11 @@ rewrite_blocks (bool add_phi_args)
walk_data.before_dom_children_before_stmts = rewrite_initialize_block;
walk_data.before_dom_children_walk_stmts = rewrite_stmt;
walk_data.before_dom_children_after_stmts = NULL;
- if (add_phi_args)
- walk_data.before_dom_children_after_stmts = rewrite_add_phi_arguments;
+ if (!fix_virtual_phis)
+ walk_data.before_dom_children_after_stmts = rewrite_add_phi_arguments;
+ else
+ walk_data.before_dom_children_after_stmts = rewrite_virtual_phi_arguments;
+
walk_data.after_dom_children_before_stmts = NULL;
walk_data.after_dom_children_walk_stmts = NULL;
walk_data.after_dom_children_after_stmts = rewrite_finalize_block;
@@ -1549,7 +1590,7 @@ rewrite_into_ssa (bool all)
/* Insert PHI nodes at dominance frontiers of definition blocks. */
insert_phi_nodes (dfs, NULL);
- rewrite_blocks (true);
+ rewrite_blocks (false);
/* Debugging dumps. */
if (dump_file && (dump_flags & TDF_STATS))
@@ -1576,7 +1617,7 @@ rewrite_def_def_chains (void)
/* Ensure that the dominance information is OK. */
calculate_dominance_info (CDI_DOMINATORS);
mark_def_site_blocks ();
- rewrite_blocks (false);
+ rewrite_blocks (true);
}
/* The marked ssa names may have more than one definition;