diff options
author | glisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-03 10:47:04 +0000 |
---|---|---|
committer | glisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-03 10:47:04 +0000 |
commit | 4d8d655b0984c02338352d68cf4df878e7a7b00b (patch) | |
tree | b8fffd826c781877806bce6555060851ee0637bd /gcc/tree-into-ssa.c | |
parent | b028e4915104d979936f511ff1e3f037b95c232f (diff) | |
download | gcc-4d8d655b0984c02338352d68cf4df878e7a7b00b.tar.gz |
2014-11-03 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/60770
gcc/
* tree-into-ssa.c (rewrite_update_stmt): Return whether the
statement should be removed.
(maybe_register_def): Likewise. Replace clobbers with default
definitions.
(rewrite_dom_walker::before_dom_children): Remove statement if
rewrite_update_stmt says so.
* tree-ssa-live.c: Include tree-ssa.h.
(set_var_live_on_entry): Do not mark undefined variables as live.
(verify_live_on_entry): Do not check undefined variables.
* tree-ssa.h (ssa_undefined_value_p): New parameter for the case
of partially undefined variables.
* tree-ssa.c (ssa_undefined_value_p): Likewise.
(execute_update_addresses_taken): Do not drop clobbers.
gcc/testsuite/
* gcc.dg/tree-ssa/pr60770-1.c: New file.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217034 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-into-ssa.c')
-rw-r--r-- | gcc/tree-into-ssa.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c index bf99160deea..d86efe47504 100644 --- a/gcc/tree-into-ssa.c +++ b/gcc/tree-into-ssa.c @@ -1833,14 +1833,15 @@ maybe_replace_use_in_debug_stmt (use_operand_p use_p) /* If the operand pointed to by DEF_P is an SSA name in NEW_SSA_NAMES or OLD_SSA_NAMES, or if it is a symbol marked for renaming, register it as the current definition for the names replaced by - DEF_P. */ + DEF_P. Returns whether the statement should be removed. */ -static inline void +static inline bool maybe_register_def (def_operand_p def_p, gimple stmt, gimple_stmt_iterator gsi) { tree def = DEF_FROM_PTR (def_p); tree sym = DECL_P (def) ? def : SSA_NAME_VAR (def); + bool to_delete = false; /* If DEF is a naked symbol that needs renaming, create a new name for it. */ @@ -1848,12 +1849,21 @@ maybe_register_def (def_operand_p def_p, gimple stmt, { if (DECL_P (def)) { - tree tracked_var; - - def = make_ssa_name (def, stmt); + if (gimple_clobber_p (stmt) && is_gimple_reg (sym)) + { + gcc_checking_assert (TREE_CODE (sym) == VAR_DECL); + /* Replace clobber stmts with a default def. This new use of a + default definition may make it look like SSA_NAMEs have + conflicting lifetimes, so we need special code to let them + coalesce properly. */ + to_delete = true; + def = get_or_create_ssa_default_def (cfun, sym); + } + else + def = make_ssa_name (def, stmt); SET_DEF (def_p, def); - tracked_var = target_for_debug_bind (sym); + tree tracked_var = target_for_debug_bind (sym); if (tracked_var) { gimple note = gimple_build_debug_bind (tracked_var, def, stmt); @@ -1911,6 +1921,8 @@ maybe_register_def (def_operand_p def_p, gimple stmt, if (is_old_name (def)) register_new_update_single (def, def); } + + return to_delete; } @@ -1919,9 +1931,9 @@ maybe_register_def (def_operand_p def_p, gimple stmt, OLD_SSA_NAMES used by SI will be updated to their current reaching definition. Names in OLD_SSA_NAMES or NEW_SSA_NAMES defined by SI will be registered as a new definition for their corresponding name - in OLD_SSA_NAMES. */ + in OLD_SSA_NAMES. Returns whether STMT should be removed. */ -static void +static bool rewrite_update_stmt (gimple stmt, gimple_stmt_iterator gsi) { use_operand_p use_p; @@ -1930,7 +1942,7 @@ rewrite_update_stmt (gimple stmt, gimple_stmt_iterator gsi) /* Only update marked statements. */ if (!rewrite_uses_p (stmt) && !register_defs_p (stmt)) - return; + return false; if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -1981,9 +1993,12 @@ rewrite_update_stmt (gimple stmt, gimple_stmt_iterator gsi) /* Register definitions of names in NEW_SSA_NAMES and OLD_SSA_NAMES. Also register definitions for names whose underlying symbol is marked for renaming. */ + bool to_delete = false; if (register_defs_p (stmt)) FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS) - maybe_register_def (def_p, stmt, gsi); + to_delete |= maybe_register_def (def_p, stmt, gsi); + + return to_delete; } @@ -2149,8 +2164,11 @@ rewrite_update_dom_walker::before_dom_children (basic_block bb) if (bitmap_bit_p (interesting_blocks, bb->index)) { gcc_checking_assert (bitmap_bit_p (blocks_to_update, bb->index)); - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - rewrite_update_stmt (gsi_stmt (gsi), gsi); + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); ) + if (rewrite_update_stmt (gsi_stmt (gsi), gsi)) + gsi_remove (&gsi, true); + else + gsi_next (&gsi); } /* Step 3. Update PHI nodes. */ |