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.
This commit is contained in:
Richard Biener 2022-04-13 14:53:40 +02:00
parent 29c46490de
commit ca145c6306
2 changed files with 18 additions and 1 deletions

View File

@ -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;
}

View 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));