re PR tree-optimization/65216 (wrong code at -O3 on x86_64-linux-gnu)

PR tree-optimization/65216
	* tree-ssa-reassoc.c (rewrite_expr_tree): Force creation of
	new stmt and new SSA_NAME for lhs whenever the arguments have
	changed and weren't just swapped.  Fix comment typo.

	* gcc.c-torture/execute/pr65216.c: New test.

From-SVN: r221034
This commit is contained in:
Jakub Jelinek 2015-02-26 22:03:14 +01:00 committed by Jakub Jelinek
parent 5c2766c1a7
commit d288c0abe6
4 changed files with 34 additions and 2 deletions

View File

@ -1,5 +1,10 @@
2015-02-26 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/65216
* tree-ssa-reassoc.c (rewrite_expr_tree): Force creation of
new stmt and new SSA_NAME for lhs whenever the arguments have
changed and weren't just swapped. Fix comment typo.
PR tree-optimization/65215
* tree-ssa-math-opts.c (find_bswap_or_nop_load): Return false
for PDP endian targets.

View File

@ -1,5 +1,8 @@
2015-02-26 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/65216
* gcc.c-torture/execute/pr65216.c: New test.
PR tree-optimization/65215
* gcc.c-torture/execute/pr65215-1.c: New test.
* gcc.c-torture/execute/pr65215-2.c: New test.

View File

@ -0,0 +1,20 @@
/* PR tree-optimization/65216 */
int a, b = 62, e;
volatile int c, d;
int
main ()
{
int f = 0;
for (a = 0; a < 2; a++)
{
b &= (8 ^ f) & 1;
for (e = 0; e < 6; e++)
if (c)
f = d;
}
if (b != 0)
__builtin_abort ();
return 0;
}

View File

@ -3532,7 +3532,7 @@ rewrite_expr_tree (gimple stmt, unsigned int opindex,
/* The final recursion case for this function is that you have
exactly two operations left.
If we had one exactly one op in the entire list to start with, we
If we had exactly one op in the entire list to start with, we
would have never called this function, and the tail recursion
rewrites them one at a time. */
if (opindex + 2 == ops.length ())
@ -3553,7 +3553,11 @@ rewrite_expr_tree (gimple stmt, unsigned int opindex,
print_gimple_stmt (dump_file, stmt, 0, 0);
}
if (changed)
/* Even when changed is false, reassociation could have e.g. removed
some redundant operations, so unless we are just swapping the
arguments or unless there is no change at all (then we just
return lhs), force creation of a new SSA_NAME. */
if (changed || ((rhs1 != oe2->op || rhs2 != oe1->op) && opindex))
{
gimple insert_point = find_insert_point (stmt, oe1->op, oe2->op);
lhs = make_ssa_name (TREE_TYPE (lhs));