This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PR debug/46931] don't crash propagating removed DEFs into debug stmts
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 18 Dec 2010 05:34:28 -0200
- Subject: [PR debug/46931] don't crash propagating removed DEFs into debug stmts
The tree vectorizer sometimes creates DEFs and removes them before the
end of the pass. By the time of the removal, the SSA name is still
marked as needing updates, so we skip the code that might introduce a
debug temp before the DEF.
By the time we actually release the DEF, calling that code again, the
DEF is no longer in the stmt seq, so we can't tell where to insert the
debug temp.
We could just drop the debug info on the floor, but if the value is
unchanging, we can still propagate it to debug stmts that use that SSA
name. This is what this patch does, also avoiding the ICE we got trying
to figure out where to insert the debug temp.
Regstrapped on x86_64-linux-gnu. Ok to install?
for gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
PR debug/46931
* tree-ssa.c (insert_debug_temp_for_var_def): Handle removed
assignments.
Index: gcc/tree-ssa.c
===================================================================
--- gcc/tree-ssa.c.orig 2010-12-17 01:07:57.818499387 -0200
+++ gcc/tree-ssa.c 2010-12-17 04:01:43.577493644 -0200
@@ -305,6 +305,8 @@ insert_debug_temp_for_var_def (gimple_st
gimple def_stmt = NULL;
int usecount = 0;
tree value = NULL;
+ tree value_unshare = NULL;
+ tree temp_value = NULL;
if (!MAY_HAVE_DEBUG_STMTS)
return;
@@ -421,6 +423,12 @@ insert_debug_temp_for_var_def (gimple_st
|| is_gimple_min_invariant (value)))
|| is_gimple_reg (value))
value = unshare_expr (value);
+ else if (!gsi && !gimple_bb (def_stmt))
+ {
+ if (is_gimple_min_invariant (value))
+ value_unshare = value;
+ value = NULL;
+ }
else
{
gimple def_temp;
@@ -454,13 +462,48 @@ insert_debug_temp_for_var_def (gimple_st
if (!gimple_debug_bind_p (stmt))
continue;
+ /* If we have a value that needs unsharing, unshare it. Then,
+ if the debug stmt binds to VAR, we can replace it, otherwise
+ we'll create a debug temp, bind it to the unshared value
+ right before STMT, and replace uses of VAR with the debug
+ temp. We reuse the same temp for multiple uses, but we don't
+ attempt to avoid emitting debug temps that would be dominated
+ by identical debug bind stmts. */
+ if (value_unshare)
+ {
+ value = unshare_expr (value_unshare);
+ if (gimple_debug_bind_get_value (stmt) != var)
+ {
+ gimple def_temp;
+ gimple_stmt_iterator ngsi = gsi_for_stmt (stmt);
+
+ if (!temp_value)
+ {
+ temp_value = make_node (DEBUG_EXPR_DECL);
+
+ DECL_ARTIFICIAL (temp_value) = 1;
+ TREE_TYPE (temp_value) = TREE_TYPE (value);
+ if (DECL_P (value))
+ DECL_MODE (temp_value) = DECL_MODE (value);
+ else
+ DECL_MODE (temp_value) = TYPE_MODE (TREE_TYPE (value));
+ }
+
+ def_temp = gimple_build_debug_bind (temp_value, value,
+ def_stmt);
+
+ gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
+
+ value = temp_value;
+ }
+ }
+
if (value)
FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
- /* unshare_expr is not needed here. vexpr is either a
+ /* unshare_expr is not needed here. value is either a
SINGLE_RHS, that can be safely shared, some other RHS
that was unshared when we found it had a single debug
- use, or a DEBUG_EXPR_DECL, that can be safely
- shared. */
+ use, or a DEBUG_EXPR_DECL, that can be safely shared. */
SET_USE (use_p, value);
else
gimple_debug_bind_reset_value (stmt);
--
Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/ FSF Latin America board member
Free Software Evangelist Red Hat Brazil Compiler Engineer