tree-optimization/105263 - reassoc and DFP
authorRichard Biener <rguenther@suse.de>
Wed, 13 Apr 2022 12:53:40 +0000 (14:53 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 13 Apr 2022 13:59:14 +0000 (15:59 +0200)
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.

gcc/testsuite/gcc.dg/pr105263.c [new file with mode: 0644]
gcc/tree-ssa-reassoc.cc

diff --git a/gcc/testsuite/gcc.dg/pr105263.c b/gcc/testsuite/gcc.dg/pr105263.c
new file mode 100644 (file)
index 0000000..5cb7fcd
--- /dev/null
@@ -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;
+}
index 4ab3c33..f41b3c9 100644 (file)
@@ -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));