forwprop: simplify_vector_constructor follow-up fix [PR95713]

As the following testcase shows, the exception for the aarch64
vec_pack_trunc_di is not sufficient on x86, the halfvectype
"vectors" have SImode but the x86 vec_pack_trunc_si meant for
the bool bitmasks combines 2x SImode into DImode, while in the
testcase the halfvectype is 1x SImode "vector" with SImode and
result is 2x HImode "vector" with SImode.

Richard Sandiford's reply:
FWIW, since the aarch64 case was only found by inspection and might
not be useful, personally I'd prefer to drop that case after all.

2020-06-18  Jakub Jelinek  <jakub@redhat.com>

	PR target/95713
	* tree-ssa-forwprop.c (simplify_vector_constructor): Don't allow
	scalar mode halfvectype other than vector boolean for
	VEC_PACK_TRUNC_EXPR.

	* gcc.dg/pr95713.c: New test.
This commit is contained in:
Jakub Jelinek 2020-06-18 12:08:06 +02:00
parent 5553433d7b
commit 9a875db43c
2 changed files with 19 additions and 7 deletions

View file

@ -0,0 +1,15 @@
/* PR target/95713 */
/* { dg-do compile } */
/* { dg-options "-O2 -Wno-psabi -w" } */
/* { dg-additional-options "-mavx512bw" { target i?86-*-* x86_64-*-* } } */
typedef int v2si __attribute__((vector_size (8)));
typedef short int v2hi __attribute__((vector_size (4)));
void foo (v2hi);
void
bar (v2si x)
{
v2hi a = (v2hi) { (short) x[0], (short) x[1] };
foo (4 > a);
}

View file

@ -2401,8 +2401,8 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
&& (dblvectype
= build_vector_type (TREE_TYPE (TREE_TYPE (orig[0])),
nelts * 2))
/* Only use it for vector modes or for vector booleans represented
as scalar bitmasks. See PR95528. */
/* Only use it for vector modes or for vector booleans
represented as scalar bitmasks. See PR95528. */
&& (VECTOR_MODE_P (TYPE_MODE (dblvectype))
|| VECTOR_BOOLEAN_TYPE_P (dblvectype))
&& (optab = optab_for_tree_code (FLOAT_TYPE_P (TREE_TYPE (type))
@ -2447,12 +2447,9 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
= build_vector_type (TREE_TYPE (TREE_TYPE (orig[0])),
nelts / 2))
/* Only use it for vector modes or for vector booleans
represented as scalar bitmasks, or allow halfvectype
be the element mode. See PR95528. */
represented as scalar bitmasks. See PR95528. */
&& (VECTOR_MODE_P (TYPE_MODE (halfvectype))
|| VECTOR_BOOLEAN_TYPE_P (halfvectype)
|| (TYPE_MODE (halfvectype)
== TYPE_MODE (TREE_TYPE (halfvectype))))
|| VECTOR_BOOLEAN_TYPE_P (halfvectype))
&& (optab = optab_for_tree_code (VEC_PACK_TRUNC_EXPR,
halfvectype,
optab_default))