diff options
author | Richard Biener <rguenther@suse.de> | 2019-06-25 10:59:48 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-06-25 10:59:48 +0000 |
commit | 332d6c4189218b06a22260beae02fa40d1ec3286 (patch) | |
tree | 4d4d8719b8314ce129b6ca0fc0ad743fbda2a041 /gcc/tree-ssa-reassoc.c | |
parent | 673f01b856e7006194874fef2e70866ec3dd07d9 (diff) | |
download | gcc-332d6c4189218b06a22260beae02fa40d1ec3286.zip gcc-332d6c4189218b06a22260beae02fa40d1ec3286.tar.gz gcc-332d6c4189218b06a22260beae02fa40d1ec3286.tar.bz2 |
re PR tree-optimization/90930 (Excessive memory consumption)
2019-06-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/90930
* tree-ssa-reassoc.c (reassociate_bb): Only rewrite expression
into parallel form in the last pass instance.
* gcc.dg/tree-ssa/reassoc-24.c: Adjust.
* gcc.dg/tree-ssa/reassoc-25.c: Likewise.
From-SVN: r272644
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 7161c4c..6794fbd 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 |