aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-02-14 10:09:10 +0100
committerRichard Biener <rguenther@suse.de>2022-02-14 11:26:06 +0100
commitf320197c8b495324dc6997a99d53e7f45ecf5840 (patch)
tree520a43c5efe17bd98d836927ffa293b93aa1ca08
parentf7e26913187ce0ed35e340c4fd14104bbcd1932e (diff)
downloadgcc-f320197c8b495324dc6997a99d53e7f45ecf5840.zip
gcc-f320197c8b495324dc6997a99d53e7f45ecf5840.tar.gz
gcc-f320197c8b495324dc6997a99d53e7f45ecf5840.tar.bz2
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.
-rw-r--r--gcc/testsuite/gcc.dg/pr104511.c16
-rw-r--r--gcc/tree-ssa-forwprop.cc9
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr104511.c b/gcc/testsuite/gcc.dg/pr104511.c
new file mode 100644
index 0000000..ad5430c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr104511.c
@@ -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;
+}
diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index 709bde6..484491f 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -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)))