aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-04-13 14:53:40 +0200
committerRichard Biener <rguenther@suse.de>2022-04-13 15:59:14 +0200
commitca145c6306f19272ac8756d88c4eba0bfdf01dfb (patch)
treec5660dd0a8056f52cf7b1ead2effeb4c986d6672
parent29c46490de4616b911fccb34a9479f768fb51e94 (diff)
downloadgcc-ca145c6306f19272ac8756d88c4eba0bfdf01dfb.zip
gcc-ca145c6306f19272ac8756d88c4eba0bfdf01dfb.tar.gz
gcc-ca145c6306f19272ac8756d88c4eba0bfdf01dfb.tar.bz2
tree-optimization/105263 - reassoc and DFP
reassoc has certain tricks which in the end depend on the ability to undo them. For DFP creating a -1. constant is easy but re-identifying is appearantly not - real_minus_onep rejects those outright for DFP. So we have to disable (at least) this one trick. 2022-04-13 Richard Biener <rguenther@suse.de> PR tree-optimization/105263 * tree-ssa-reassoc.cc (try_special_add_to_ops): Do not consume negates in multiplication chains with DFP. * gcc.dg/pr105263.c: New testcase.
-rw-r--r--gcc/testsuite/gcc.dg/pr105263.c15
-rw-r--r--gcc/tree-ssa-reassoc.cc4
2 files changed, 18 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/pr105263.c b/gcc/testsuite/gcc.dg/pr105263.c
new file mode 100644
index 0000000..5cb7fcd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr105263.c
@@ -0,0 +1,15 @@
+/* { dg-do compile { target dfp } } */
+/* { dg-options "-O -ffast-math -w -Wno-psabi" } */
+
+typedef _Decimal64 __attribute__((__vector_size__ (8))) U;
+typedef _Decimal64 __attribute__((__vector_size__ (16))) V;
+
+V v;
+
+U
+foo (U u)
+{
+ u *= u;
+ u *= -(U){ v[1] };
+ return u;
+}
diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
index 4ab3c33..f41b3c9 100644
--- a/gcc/tree-ssa-reassoc.cc
+++ b/gcc/tree-ssa-reassoc.cc
@@ -5857,7 +5857,9 @@ try_special_add_to_ops (vec<operand_entry *> *ops,
&& gimple_assign_rhs_code (def_stmt) == NEGATE_EXPR
&& !HONOR_SNANS (TREE_TYPE (op))
&& (!HONOR_SIGNED_ZEROS (TREE_TYPE (op))
- || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (op))))
+ || !COMPLEX_FLOAT_TYPE_P (TREE_TYPE (op)))
+ && (!FLOAT_TYPE_P (TREE_TYPE (op))
+ || !DECIMAL_FLOAT_MODE_P (element_mode (op))))
{
tree rhs1 = gimple_assign_rhs1 (def_stmt);
tree cst = build_minus_one_cst (TREE_TYPE (op));