diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-06-25 19:20:15 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-06-25 19:20:15 +0200 |
commit | 2a65e70bcfb000b229a2cbf54b06956108443598 (patch) | |
tree | e8e53d72f842bb86f62249822f10a715435f81e8 /gcc/tree-ssa-reassoc.c | |
parent | 7805417a5d2a9a79a3858b82d60169178f59c6f1 (diff) | |
download | gcc-2a65e70bcfb000b229a2cbf54b06956108443598.zip gcc-2a65e70bcfb000b229a2cbf54b06956108443598.tar.gz gcc-2a65e70bcfb000b229a2cbf54b06956108443598.tar.bz2 |
re PR tree-optimization/71631 (Wrong constant folding)
PR tree-optimization/71631
* tree-ssa-reassoc.c (reassociate_bb): Pass true as last argument
to rewrite_expr_tree even if negate_result, move new_lhs var
declaration and initialization earlier, for powi_result set afterwards
new_lhs to lhs. For negate_result, use new_lhs instead of tmp
if new_lhs != lhs, and don't shadow gsi var.
* gcc.c-torture/execute/pr71631.c: New test.
From-SVN: r237782
Diffstat (limited to 'gcc/tree-ssa-reassoc.c')
-rw-r--r-- | gcc/tree-ssa-reassoc.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index cdfe06f..9264e0b 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -5314,6 +5314,7 @@ reassociate_bb (basic_block bb) } } + tree new_lhs = lhs; /* If the operand vector is now empty, all operands were consumed by the __builtin_powi optimization. */ if (ops.length () == 0) @@ -5337,7 +5338,6 @@ reassociate_bb (basic_block bb) machine_mode mode = TYPE_MODE (TREE_TYPE (lhs)); int ops_num = ops.length (); int width = get_reassociation_width (ops_num, rhs_code, mode); - tree new_lhs = lhs; if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, @@ -5357,7 +5357,8 @@ reassociate_bb (basic_block bb) swap_ops_for_binary_stmt (ops, len - 3, stmt); new_lhs = rewrite_expr_tree (stmt, 0, ops, - powi_result != NULL); + powi_result != NULL + || negate_result); } /* If we combined some repeated factors into a @@ -5372,7 +5373,10 @@ reassociate_bb (basic_block bb) gimple_set_lhs (lhs_stmt, target_ssa); update_stmt (lhs_stmt); if (lhs != new_lhs) - target_ssa = new_lhs; + { + target_ssa = new_lhs; + new_lhs = lhs; + } mul_stmt = gimple_build_assign (lhs, MULT_EXPR, powi_result, target_ssa); gimple_set_location (mul_stmt, gimple_location (stmt)); @@ -5386,10 +5390,11 @@ reassociate_bb (basic_block bb) stmt = SSA_NAME_DEF_STMT (lhs); tree tmp = make_ssa_name (TREE_TYPE (lhs)); gimple_set_lhs (stmt, tmp); + if (lhs != new_lhs) + tmp = new_lhs; gassign *neg_stmt = gimple_build_assign (lhs, NEGATE_EXPR, tmp); gimple_set_uid (neg_stmt, gimple_uid (stmt)); - gimple_stmt_iterator gsi = gsi_for_stmt (stmt); gsi_insert_after (&gsi, neg_stmt, GSI_NEW_STMT); update_stmt (stmt); } |