This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [vta, graphite?] propagate degenerate phi nodes into debug stmts


On Nov 19, 2009, Richard Guenther <richard.guenther@gmail.com> wrote:

> On Thu, Nov 19, 2009 at 5:27 AM, Alexandre Oliva <aoliva@redhat.com> wrote:
>> On Nov 17, 2009, Richard Guenther <richard.guenther@gmail.com> wrote:
>> 
>>> Well, just adjust degenerate_phi_result to do instead of calling
>>> operand_equal_p
>> 
>>> Â else if (TREE_CODE (arg) != TREE_CODE (val)
>>> Â Â Â Â Â Â Â|| (TREE_CODE (arg) == SSA_NAME
>>> Â Â Â Â Â Â Â Â Â&& arg != val)
>>> Â Â Â Â Â Â Â|| !operand_equal_p (arg, val, 0))
>>> Â Â break;
>> 
>>> that should fix it.
>> 
>> Good idea.

>> Here's what I'm testing now.

> Ok if it passes testing.

Thanks, but arg could be NULL, and then TREE_CODE (val) would crash.

The fixed patch below corrects the two regressions I got testing the
patch on x86_64-linux-gnu.  Save for new regressions, I'll check in the
revised version as soon as my current round of testing completes.

for  gcc/ChangeLog
from  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.

Index: gcc/tree-ssa.c
===================================================================
--- gcc/tree-ssa.c.orig	2009-11-19 05:12:30.000000000 -0200
+++ gcc/tree-ssa.c	2009-11-19 05:12:35.000000000 -0200
@@ -279,7 +279,7 @@ find_released_ssa_name (tree *tp, int *w
 {
   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_st
   /* 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_st
 	 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
 
   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);
 
Index: gcc/tree-ssa-dom.c
===================================================================
--- gcc/tree-ssa-dom.c.orig	2009-11-19 05:12:30.000000000 -0200
+++ gcc/tree-ssa-dom.c	2009-11-20 04:30:10.000000000 -0200
@@ -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);
-- 
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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]