From: aoliva Date: Sat, 21 Nov 2009 05:06:24 +0000 (+0000) Subject: * tree-ssa.c (find_released_ssa_name): Handle NULL wi. X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=43e54ec3e93dd2ef495375ead1f1eac467a727d1;p=pf3gnuchains%2Fgcc-fork.git * tree-ssa.c (find_released_ssa_name): Handle NULL wi. (insert_debug_temp_for_var_def): Handle degenerate PHI nodes. (insert_debug_temps_for_defs): Handle PHI nodes. * tree-ssa-dom.c (degenerate_phi_result): Don't crash on released SSA names. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154402 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1e211c365d4..da2c7a66ddf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2009-11-21 Alexandre Oliva + * tree-ssa.c (find_released_ssa_name): Handle NULL wi. + (insert_debug_temp_for_var_def): Handle degenerate PHI nodes. + (insert_debug_temps_for_defs): Handle PHI nodes. + * tree-ssa-dom.c (degenerate_phi_result): Don't crash on released + SSA names. + +2009-11-21 Alexandre Oliva + * tree-ssa-pre.c (remove_dead_inserted_code): Don't release_defs after remove_phi_node. diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 6e861b15e4c..db21218629e 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -2398,7 +2398,14 @@ degenerate_phi_result (gimple phi) continue; else if (!val) val = arg; - else if (!operand_equal_p (arg, val, 0)) + else if (arg == val) + continue; + /* We bring in some of operand_equal_p not only to speed things + up, but also to avoid crashing when dereferencing the type of + a released SSA name. */ + else if (!arg || TREE_CODE (val) != TREE_CODE (arg) + || TREE_CODE (val) == SSA_NAME + || !operand_equal_p (arg, val, 0)) break; } return (i == gimple_phi_num_args (phi) ? val : NULL); diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 15dddabd97c..4d0ccb066b1 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -279,7 +279,7 @@ find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_) { struct walk_stmt_info *wi = (struct walk_stmt_info *) data_; - if (wi->is_lhs) + if (wi && wi->is_lhs) return NULL_TREE; if (TREE_CODE (*tp) == SSA_NAME) @@ -346,7 +346,13 @@ insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var) /* If we didn't get an insertion point, and the stmt has already been removed, we won't be able to insert the debug bind stmt, so we'll have to drop debug information. */ - if (is_gimple_assign (def_stmt)) + if (gimple_code (def_stmt) == GIMPLE_PHI) + { + value = degenerate_phi_result (def_stmt); + if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL)) + value = NULL; + } + else if (is_gimple_assign (def_stmt)) { bool no_value = false; @@ -408,6 +414,7 @@ insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var) at the expense of duplication of expressions. */ if (CONSTANT_CLASS_P (value) + || gimple_code (def_stmt) == GIMPLE_PHI || (usecount == 1 && (!gimple_assign_single_p (def_stmt) || is_gimple_min_invariant (value))) @@ -478,7 +485,7 @@ insert_debug_temps_for_defs (gimple_stmt_iterator *gsi) stmt = gsi_stmt (*gsi); - FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, op_iter, SSA_OP_DEF) + FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF) { tree var = DEF_FROM_PTR (def_p);