OSDN Git Service

* tree-ssa.c (find_released_ssa_name): Handle NULL wi.
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Nov 2009 05:06:24 +0000 (05:06 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Nov 2009 05:06:24 +0000 (05:06 +0000)
(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

gcc/ChangeLog
gcc/tree-ssa-dom.c
gcc/tree-ssa.c

index 1e211c3..da2c7a6 100644 (file)
@@ -1,5 +1,13 @@
 2009-11-21  Alexandre Oliva  <aoliva@redhat.com>
 
+       * 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  <aoliva@redhat.com>
+
        * tree-ssa-pre.c (remove_dead_inserted_code): Don't release_defs
        after remove_phi_node.
 
index 6e861b1..db21218 100644 (file)
@@ -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);
index 15dddab..4d0ccb0 100644 (file)
@@ -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);