diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2005-04-17 23:40:31 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2005-04-17 23:40:31 +0000 |
commit | ef627cf0213f55ad5b4a37dd23d718ec4c4bf076 (patch) | |
tree | da03d178f58f8578bb0bb2e010cb8201bbc9865c | |
parent | 75ee992952d96876fd54f05d18ab58746ec66b68 (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 55 |
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); |