This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix out-of-ssa with unsupported vector types (PR rtl-optimization/90756)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Jeff Law <law at redhat dot com>, Alexandre Oliva <oliva at adacore dot com>, gcc-patches at gcc dot gnu dot org
- Date: Wed, 3 Jul 2019 10:02:08 +0200 (CEST)
- Subject: Re: [PATCH] Fix out-of-ssa with unsupported vector types (PR rtl-optimization/90756)
- References: <20190703075941.GU815@tucnak>
On Wed, 3 Jul 2019, Jakub Jelinek wrote:
> Hi!
>
> This weird hink has been added by Alex in r228175, it isn't clear why
> nor how it ever can be correct. While say for DECL_MODE we have the problem
> that for global vars when switching between functions with different ISA
> selections the mode might not be ok, TYPE_MODE is stored as a raw vector
> mode that a function overrides to BLKmode if that particular vector mode is
> not supported. This hunk breaks that assumption and leaks unsupported
> vector modes in the IL of the functions which then have no way to handle
> that, but even before that happens usually it breaks because we try to
> convert_mode between BLKmode and the unsupported vector mode or vice versa
> on PHI nodes.
>
> Alex, do you remember why this has been done?
>
> Patch has been bootstrapped/regtested on x86_64-linux and i686-linux (the
> latter didn't have SSE enabled by default), Jeff said he'll test it on many
> crosses. Ok for trunk if that testing succeeds?
OK.
Thanks,
Richard.
> 2019-07-03 Jakub Jelinek <jakub@redhat.com>
>
> PR rtl-optimization/90756
> * explow.c (promote_ssa_mode): Always use TYPE_MODE, don't bypass it
> for VECTOR_TYPE_P.
>
> * gcc.dg/pr90756.c: New test.
>
> --- gcc/explow.c.jj 2019-06-26 13:51:54.289358743 +0200
> +++ gcc/explow.c 2019-07-02 20:32:11.318360013 +0200
> @@ -892,16 +892,7 @@ promote_ssa_mode (const_tree name, int *
>
> tree type = TREE_TYPE (name);
> int unsignedp = TYPE_UNSIGNED (type);
> - machine_mode mode = TYPE_MODE (type);
> -
> - /* Bypass TYPE_MODE when it maps vector modes to BLKmode. */
> - if (mode == BLKmode)
> - {
> - gcc_assert (VECTOR_TYPE_P (type));
> - mode = type->type_common.mode;
> - }
> -
> - machine_mode pmode = promote_mode (type, mode, &unsignedp);
> + machine_mode pmode = promote_mode (type, TYPE_MODE (type), &unsignedp);
> if (punsignedp)
> *punsignedp = unsignedp;
>
> --- gcc/testsuite/gcc.dg/pr90756.c.jj 2019-07-02 20:30:17.651131684 +0200
> +++ gcc/testsuite/gcc.dg/pr90756.c 2019-07-02 20:29:49.038574696 +0200
> @@ -0,0 +1,26 @@
> +/* PR rtl-optimization/90756 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -Wno-psabi" } */
> +/* { dg-additional-options "-mno-sse" { target ia32 } } */
> +
> +typedef float B __attribute__((vector_size(4 * sizeof (float))));
> +typedef unsigned long long C __attribute__((vector_size(4 * sizeof (long long))));
> +typedef short D __attribute__((vector_size(4 * sizeof (short))));
> +B z;
> +void foo (C);
> +C bar (D);
> +B baz ();
> +D qux (B);
> +
> +void
> +quux (int x)
> +{
> + B n = z, b = z;
> + while (1)
> + switch (x)
> + {
> + case 0: n = baz (); /* FALLTHRU */
> + case 1: { B o = n; n = b; b = o; } /* FALLTHRU */
> + case 2: { D u = qux (b); C v = bar (u); foo (v); }
> + }
> +}
>
> Jakub
>
--
Richard Biener <rguenther@suse.de>
SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany;
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG Nürnberg)