tree-optimization/96579 - another special-operands fix in reassoc

This makes sure to put special-ops expanded rhs left where
expression rewrite expects it.

2020-08-27  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/96579
	* tree-ssa-reassoc.c (linearize_expr_tree): If we expand
	rhs via special ops make sure to swap operands.

	* gcc.dg/pr96579.c: New testcase.
This commit is contained in:
Richard Biener 2020-08-27 10:02:22 +02:00
parent 989bc4ca2f
commit ff7463172e
2 changed files with 15 additions and 2 deletions

View File

@ -0,0 +1,4 @@
/* { dg-do compile } */
/* { dg-options "-O -fno-tree-forwprop -ffast-math -fno-tree-vrp" } */
#include "pr96370.c"

View File

@ -5651,13 +5651,20 @@ linearize_expr_tree (vec<operand_entry *> *ops, gimple *stmt,
if (!binrhsisreassoc)
{
if (!try_special_add_to_ops (ops, rhscode, binrhs, binrhsdef))
bool swap = false;
if (try_special_add_to_ops (ops, rhscode, binrhs, binrhsdef))
/* If we add ops for the rhs we expect to be able to recurse
to it via the lhs during expression rewrite so swap
operands. */
swap = true;
else
add_to_ops_vec (ops, binrhs);
if (!try_special_add_to_ops (ops, rhscode, binlhs, binlhsdef))
add_to_ops_vec (ops, binlhs);
return;
if (!swap)
return;
}
if (dump_file && (dump_flags & TDF_DETAILS))
@ -5676,6 +5683,8 @@ linearize_expr_tree (vec<operand_entry *> *ops, gimple *stmt,
fprintf (dump_file, " is now ");
print_gimple_stmt (dump_file, stmt, 0);
}
if (!binrhsisreassoc)
return;
/* We want to make it so the lhs is always the reassociative op,
so swap. */