diff options
Diffstat (limited to 'gcc/tree-ssa-reassoc.c')
-rw-r--r-- | gcc/tree-ssa-reassoc.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 7161c4c36c3..6794fbde29e 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -6013,12 +6013,7 @@ reassociate_bb (basic_block bb) { machine_mode mode = TYPE_MODE (TREE_TYPE (lhs)); int ops_num = ops.length (); - int width = get_reassociation_width (ops_num, rhs_code, mode); - - if (dump_file && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, - "Width = %d was chosen for reassociation\n", width); - + int width; /* For binary bit operations, if there are at least 3 operands and the last last operand in OPS is a constant, @@ -6032,10 +6027,21 @@ reassociate_bb (basic_block bb) && TREE_CODE (ops.last ()->op) == INTEGER_CST) std::swap (*ops[0], *ops[ops_num - 1]); - if (width > 1 - && ops.length () > 3) - rewrite_expr_tree_parallel (as_a <gassign *> (stmt), - width, ops); + /* Only rewrite the expression tree to parallel in the + last reassoc pass to avoid useless work back-and-forth + with initial linearization. */ + if (!reassoc_insert_powi_p + && ops.length () > 3 + && (width = get_reassociation_width (ops_num, rhs_code, + mode)) > 1) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "Width = %d was chosen for reassociation\n", + width); + rewrite_expr_tree_parallel (as_a <gassign *> (stmt), + width, ops); + } else { /* When there are three operands left, we want |