aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-08-27 10:02:22 +0200
committerRichard Biener <rguenther@suse.de>2020-08-27 10:02:22 +0200
commitff7463172e564c5dd2432d7af8eaa0124cbd4af7 (patch)
treed29631ae1d58a73d980abed5c5bc773b4a61fa0d /gcc
parent989bc4ca2f2978baecff00f6d0532994b82897ef (diff)
downloadgcc-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.c4
-rw-r--r--gcc/tree-ssa-reassoc.c13
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. */