2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-26 07:40:26 +08:00

re PR tree-optimization/64910 (tree reassociation results in poor code)

PR tree-optimization/64910
	* tree-ssa-reassoc.c (reassociate_bb): Restrict last change to
	cases where we have 3 or more operands.

From-SVN: r251751
This commit is contained in:
Jeff Law 2017-09-05 23:20:25 -06:00 committed by Jeff Law
parent 1d441507f7
commit 5aa102aa78
2 changed files with 15 additions and 8 deletions

@ -1,3 +1,9 @@
2017-09-05 Jeff Law <law@redhat.com>
PR tree-optimization/64910
* tree-ssa-reassoc.c (reassociate_bb): Restrict last change to
cases where we have 3 or more operands.
2017-09-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/81768

@ -5763,14 +5763,15 @@ reassociate_bb (basic_block bb)
"Width = %d was chosen for reassociation\n", width);
/* For binary bit operations, if the last operand in
OPS is a constant, move it to the front. This
helps ensure that we generate (X & Y) & C rather
than (X & C) & Y. The former will often match
a canonical bit test when we get to RTL. */
if ((rhs_code == BIT_AND_EXPR
|| rhs_code == BIT_IOR_EXPR
|| rhs_code == BIT_XOR_EXPR)
/* For binary bit operations, if there are at least 3
operands and the last last operand in OPS is a constant,
move it to the front. This helps ensure that we generate
(X & Y) & C rather than (X & C) & Y. The former will
often match a canonical bit test when we get to RTL. */
if (ops.length () != 2
&& (rhs_code == BIT_AND_EXPR
|| rhs_code == BIT_IOR_EXPR
|| rhs_code == BIT_XOR_EXPR)
&& TREE_CODE (ops.last ()->op) == INTEGER_CST)
std::swap (*ops[0], *ops[ops_num - 1]);