[PATCH] Fix tree DSE somewhat

Richard Guenther rguenther@suse.de
Wed May 14 14:36:00 GMT 2008


Even though tree level DSE is getting a rewrite the following helps
454.calculix where we fail to remove dead stores in loops because
PHI walking is broken in dse_possible_dead_store_p.  In particular
we forget to record the stmt if the use was a PHI_NODE here:

-      if (SSA_NAME_DEF_STMT (PHI_RESULT (*use_stmt)) == *use_stmt)
-       return false;

and simply adding that there would fix the issue.  But you may note
that the condition evaluates to true always...  so I chose to remove
all this dead code and simply punt for PHI_NODE uses.

Bootstrap / regtest on x86_64-unknown-linux-gnu in progress, I'll apply
this after it succeeded.

Richard.

2008-05-14  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-dse.c (dse_possible_dead_store_p): Remove dead code.
	Make sure to register the store if the use is a PHI_NODE.

Index: tree-ssa-dse.c
===================================================================
--- tree-ssa-dse.c	(revision 135264)
+++ tree-ssa-dse.c	(working copy)
@@ -313,6 +313,14 @@ dse_possible_dead_store_p (tree stmt,
       gcc_assert (*use_p != NULL_USE_OPERAND_P);
       *first_use_p = *use_p;
 
+      /* ???  If we hit a PHI_NODE we could skip to the PHI_RESULT uses.
+	 Don't bother to do that for now.  */
+      if (TREE_CODE (temp) == PHI_NODE)
+	{
+	  fail = true;
+	  break;
+	}
+
       /* In the case of memory partitions, we may get:
 
 	   # MPT.764_162 = VDEF <MPT.764_161(D)>
@@ -360,29 +368,6 @@ dse_possible_dead_store_p (tree stmt,
       return false;
     }
 
-  /* Skip through any PHI nodes we have already seen if the PHI
-     represents the only use of this store.
-
-     Note this does not handle the case where the store has
-     multiple VDEFs which all reach a set of PHI nodes in the same block.  */
-  while (*use_p != NULL_USE_OPERAND_P
-	 && TREE_CODE (*use_stmt) == PHI_NODE
-	 && bitmap_bit_p (dse_gd->stores, get_stmt_uid (*use_stmt)))
-    {
-      /* A PHI node can both define and use the same SSA_NAME if
-	 the PHI is at the top of a loop and the PHI_RESULT is
-	 a loop invariant and copies have not been fully propagated.
-
-	 The safe thing to do is exit assuming no optimization is
-	 possible.  */
-      if (SSA_NAME_DEF_STMT (PHI_RESULT (*use_stmt)) == *use_stmt)
-	return false;
-
-      /* Skip past this PHI and loop again in case we had a PHI
-	 chain.  */
-      single_imm_use (PHI_RESULT (*use_stmt), use_p, use_stmt);
-    }
-
   return true;
 }
 



More information about the Gcc-patches mailing list