aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-reassoc.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2017-09-05 23:20:25 -0600
committerJeff Law <law@gcc.gnu.org>2017-09-05 23:20:25 -0600
commit5aa102aa78e6256fabae6beca698d533e27348ff (patch)
treedea5ae204ecf512a5da8667c9133f66b5b2ce877 /gcc/tree-ssa-reassoc.c
parent1d441507f7837bbff2c208e731940e6cc460194e (diff)
downloadgcc-5aa102aa78e6256fabae6beca698d533e27348ff.zip
gcc-5aa102aa78e6256fabae6beca698d533e27348ff.tar.gz
gcc-5aa102aa78e6256fabae6beca698d533e27348ff.tar.bz2
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
Diffstat (limited to 'gcc/tree-ssa-reassoc.c')
-rw-r--r--gcc/tree-ssa-reassoc.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index 7604819..2fb6aef 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]);