From: Jeff Law Date: Wed, 6 Sep 2017 05:20:25 +0000 (-0600) Subject: re PR tree-optimization/64910 (tree reassociation results in poor code) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5aa102aa78e6256fabae6beca698d533e27348ff;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 53637905722..1b3bddbb806 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-09-05 Jeff Law + + 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 PR middle-end/81768 diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 76048196b27..2fb6aef51d7 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -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]);