summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2005-04-17 23:40:31 +0000
committerDaniel Berlin <dberlin@gcc.gnu.org>2005-04-17 23:40:31 +0000
commitef627cf0213f55ad5b4a37dd23d718ec4c4bf076 (patch)
treeda03d178f58f8578bb0bb2e010cb8201bbc9865c
parent75ee992952d96876fd54f05d18ab58746ec66b68 (diff)
downloadgcc-ef627cf0213f55ad5b4a37dd23d718ec4c4bf076.tar.gz
Fix PR tree-optimization/20490 Fix PR tree-optimization/20929
2005-04-17 Daniel Berlin <dberlin@dberlin.org> Fix PR tree-optimization/20490 Fix PR tree-optimization/20929 * tree-ssa-pre.c (create_expression_by_pieces): Use force_gimple_operand on result of fold, value number gimple_operand result. From-SVN: r98304
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-ssa-pre.c55
2 files changed, 60 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0fa055f31d3..d60e23ee21d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2005-04-17 Daniel Berlin <dberlin@dberlin.org>
+
+ Fix PR tree-optimization/20490
+ Fix PR tree-optimization/20929
+
+ * tree-ssa-pre.c (create_expression_by_pieces): Use
+ force_gimple_operand on result of fold, value number
+ gimple_operand result.
+
2005-04-17 Joseph S. Myers <joseph@codesourcery.com>
Merge from mainline:
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 3a3064d0aee..b50c138fd47 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -1317,16 +1317,37 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
case tcc_binary:
{
tree_stmt_iterator tsi;
+ tree forced_stmts;
tree genop1, genop2;
tree temp;
+ tree folded;
tree op1 = TREE_OPERAND (expr, 0);
tree op2 = TREE_OPERAND (expr, 1);
genop1 = find_or_generate_expression (block, op1, stmts);
genop2 = find_or_generate_expression (block, op2, stmts);
temp = create_tmp_var (TREE_TYPE (expr), "pretmp");
add_referenced_tmp_var (temp);
- newexpr = fold (build (TREE_CODE (expr), TREE_TYPE (expr),
- genop1, genop2));
+
+ folded = fold (build (TREE_CODE (expr), TREE_TYPE (expr),
+ genop1, genop2));
+ 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);
+ }
newexpr = build (MODIFY_EXPR, TREE_TYPE (expr),
temp, newexpr);
NECESSARY (newexpr) = 0;
@@ -1341,14 +1362,40 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
case tcc_unary:
{
tree_stmt_iterator tsi;
+ tree forced_stmts = NULL;
tree genop1;
tree temp;
+ tree folded;
tree op1 = TREE_OPERAND (expr, 0);
genop1 = find_or_generate_expression (block, op1, stmts);
temp = create_tmp_var (TREE_TYPE (expr), "pretmp");
add_referenced_tmp_var (temp);
- newexpr = fold (build (TREE_CODE (expr), TREE_TYPE (expr),
- genop1));
+ folded = fold (build (TREE_CODE (expr), TREE_TYPE (expr),
+ genop1));
+ /* If the generated operand is already GIMPLE min_invariant
+ just use it instead of calling force_gimple_operand on it,
+ since that may make it not invariant by copying it into an
+ assignment. */
+ if (!is_gimple_min_invariant (genop1))
+ newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL);
+ else
+ newexpr = genop1;
+ 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);
+ }
newexpr = build (MODIFY_EXPR, TREE_TYPE (expr),
temp, newexpr);
name = make_ssa_name (temp, newexpr);