summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-14 15:24:53 +0000
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-14 15:24:53 +0000
commitd16ec1f336d23b7c189c4a0ba8f2878d7e352770 (patch)
tree0a3f8402618ba8b92aebacc11c89ddf884965ea4 /gcc/tree-ssa-pre.c
parent44a09e170eec6926d0288e401643bdb9a32673f4 (diff)
downloadgcc-d16ec1f336d23b7c189c4a0ba8f2878d7e352770.tar.gz
2005-04-14 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/20963 * tree-ssa-pre.c (compute_avail): Remove special case for TREE_INVARIANT. (create_expression_by_pieces): Add value numbers for forced out statements. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98136 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 34b759cb880..409ce835044 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -1341,6 +1341,18 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL);
if (forced_stmts)
{
+ tsi = tsi_start (forced_stmts);
+ for (; !tsi_end_p (tsi); tsi_next (&tsi))
+ {
+ tree stmt = tsi_stmt (tsi);
+ tree forcedname = TREE_OPERAND (stmt, 0);
+ tree forcedexpr = TREE_OPERAND (stmt, 1);
+ tree val = vn_lookup_or_add (forcedexpr, NULL);
+ vn_add (forcedname, val, NULL);
+ bitmap_value_replace_in_set (NEW_SETS (block), forcedname);
+ bitmap_value_replace_in_set (AVAIL_OUT (block), forcedname);
+ }
+
tsi = tsi_last (stmts);
tsi_link_after (&tsi, forced_stmts, TSI_CONTINUE_LINKING);
}
@@ -1371,6 +1383,17 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL);
if (forced_stmts)
{
+ tsi = tsi_start (forced_stmts);
+ for (; !tsi_end_p (tsi); tsi_next (&tsi))
+ {
+ tree stmt = tsi_stmt (tsi);
+ tree forcedname = TREE_OPERAND (stmt, 0);
+ tree forcedexpr = TREE_OPERAND (stmt, 1);
+ tree val = vn_lookup_or_add (forcedexpr, NULL);
+ vn_add (forcedname, val, NULL);
+ bitmap_value_replace_in_set (NEW_SETS (block), forcedname);
+ bitmap_value_replace_in_set (AVAIL_OUT (block), forcedname);
+ }
tsi = tsi_last (stmts);
tsi_link_after (&tsi, forced_stmts, TSI_CONTINUE_LINKING);
}
@@ -1960,7 +1983,6 @@ compute_avail (void)
}
else if (TREE_CODE (rhs) == SSA_NAME
|| is_gimple_min_invariant (rhs)
- || TREE_INVARIANT (rhs)
|| TREE_CODE (rhs) == ADDR_EXPR
|| DECL_P (rhs))
{