[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