diff options
author | Richard Biener <rguenther@suse.de> | 2022-04-13 14:53:40 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-04-13 15:59:14 +0200 |
commit | ca145c6306f19272ac8756d88c4eba0bfdf01dfb (patch) | |
tree | c5660dd0a8056f52cf7b1ead2effeb4c986d6672 | |
parent | 29c46490de4616b911fccb34a9479f768fb51e94 (diff) | |
download | gcc-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.c | 15 | ||||
-rw-r--r-- | gcc/tree-ssa-reassoc.cc | 4 |
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)); |