tree-optimization/104511 - avoid FP to DFP conversion for VEC_PACK_TRUNC

This avoids forwprop from matching DFP <-> FP vector conversions
using VEC_[UN]PACK{_TRUNC,_LO,_HI}.  Maybe DFP vectors shouldn't be
a thing, but they appearantly are.  Re-using CONVERT/NOP_EXPR for
DFP <-> FP conversions was probably a mistake.

2022-02-14  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/104511
	* tree-ssa-forwprop.cc (simplify_vector_constructor): Avoid
	touching DFP <-> FP conversions.

	* gcc.dg/pr104511.c: New testcase.
This commit is contained in:
Richard Biener 2022-02-14 10:09:10 +01:00
parent f7e2691318
commit f320197c8b
2 changed files with 25 additions and 0 deletions

View File

@ -0,0 +1,16 @@
/* { dg-do compile { target dfp } } */
/* { dg-options "-O -Wno-psabi" } */
typedef _Float64 __attribute__((__vector_size__ (32))) F;
typedef _Decimal32 __attribute__((__vector_size__ (16))) D;
extern void bar (void);
D g;
void
foo (F f)
{
D d = __builtin_convertvector (f, D);
bar ();
g = d;
}

View File

@ -2824,6 +2824,15 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
? VEC_UNPACK_FLOAT_HI_EXPR
: VEC_UNPACK_HI_EXPR);
/* Conversions between DFP and FP have no special tree code
but we cannot handle those since all relevant vector conversion
optabs only have a single mode. */
if (CONVERT_EXPR_CODE_P (conv_code)
&& FLOAT_TYPE_P (TREE_TYPE (type))
&& (DECIMAL_FLOAT_TYPE_P (TREE_TYPE (type))
!= DECIMAL_FLOAT_TYPE_P (TREE_TYPE (conv_src_type))))
return false;
if (CONVERT_EXPR_CODE_P (conv_code)
&& (2 * TYPE_PRECISION (TREE_TYPE (TREE_TYPE (orig[0])))
== TYPE_PRECISION (TREE_TYPE (type)))