diff options
author | Richard Biener <rguenther@suse.de> | 2020-08-27 10:02:22 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-08-27 10:02:22 +0200 |
commit | ff7463172e564c5dd2432d7af8eaa0124cbd4af7 (patch) | |
tree | d29631ae1d58a73d980abed5c5bc773b4a61fa0d /gcc | |
parent | 989bc4ca2f2978baecff00f6d0532994b82897ef (diff) | |
download | gcc-ff7463172e564c5dd2432d7af8eaa0124cbd4af7.zip gcc-ff7463172e564c5dd2432d7af8eaa0124cbd4af7.tar.gz gcc-ff7463172e564c5dd2432d7af8eaa0124cbd4af7.tar.bz2 |
tree-optimization/96579 - another special-operands fix in reassoc
This makes sure to put special-ops expanded rhs left where
expression rewrite expects it.
2020-08-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/96579
* tree-ssa-reassoc.c (linearize_expr_tree): If we expand
rhs via special ops make sure to swap operands.
* gcc.dg/pr96579.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr96579.c | 4 | ||||
-rw-r--r-- | gcc/tree-ssa-reassoc.c | 13 |
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/pr96579.c b/gcc/testsuite/gcc.dg/pr96579.c new file mode 100644 index 0000000..49fdcb4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr96579.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fno-tree-forwprop -ffast-math -fno-tree-vrp" } */ + +#include "pr96370.c" diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index fed463b..a5f5d52 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -5651,13 +5651,20 @@ linearize_expr_tree (vec<operand_entry *> *ops, gimple *stmt, if (!binrhsisreassoc) { - if (!try_special_add_to_ops (ops, rhscode, binrhs, binrhsdef)) + bool swap = false; + if (try_special_add_to_ops (ops, rhscode, binrhs, binrhsdef)) + /* If we add ops for the rhs we expect to be able to recurse + to it via the lhs during expression rewrite so swap + operands. */ + swap = true; + else add_to_ops_vec (ops, binrhs); if (!try_special_add_to_ops (ops, rhscode, binlhs, binlhsdef)) add_to_ops_vec (ops, binlhs); - return; + if (!swap) + return; } if (dump_file && (dump_flags & TDF_DETAILS)) @@ -5676,6 +5683,8 @@ linearize_expr_tree (vec<operand_entry *> *ops, gimple *stmt, fprintf (dump_file, " is now "); print_gimple_stmt (dump_file, stmt, 0); } + if (!binrhsisreassoc) + return; /* We want to make it so the lhs is always the reassociative op, so swap. */ |