On Tue, Nov 29, 2016 at 8:44 PM, Jakub Jelinek <[email protected]> wrote:
> Hi!
>
> The following testcase ICEs because DECL_RTL/DECL_INCOMING_RTL are adjusted
> by the stv pass through the PUT_MODE modifications, which means that for
> var-tracking.c they contain a bogus mode.
>
> Fixed by wrapping those into TImode subreg or adjusting the MEMs to have the
> correct mode.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2016-11-29 Jakub Jelinek <[email protected]>
>
> PR rtl-optimization/78547
> * config/i386/i386.c (convert_scalars_to_vectors): If any
> insns have been converted, adjust all parameter's DEC_RTL and
> DECL_INCOMING_RTL back from V1TImode to TImode if the parameters have
> TImode.
LGTM.
Thanks,
Uros.
> --- gcc/config/i386/i386.c.jj 2016-11-29 08:31:58.000000000 +0100
> +++ gcc/config/i386/i386.c 2016-11-29 12:21:36.867323776 +0100
> @@ -4075,6 +4075,39 @@ convert_scalars_to_vector ()
> crtl->stack_alignment_needed = 128;
> if (crtl->stack_alignment_estimated < 128)
> crtl->stack_alignment_estimated = 128;
> + /* Fix up DECL_RTL/DECL_INCOMING_RTL of arguments. */
> + if (TARGET_64BIT)
> + for (tree parm = DECL_ARGUMENTS (current_function_decl);
> + parm; parm = DECL_CHAIN (parm))
> + {
> + if (TYPE_MODE (TREE_TYPE (parm)) != TImode)
> + continue;
> + if (DECL_RTL_SET_P (parm)
> + && GET_MODE (DECL_RTL (parm)) == V1TImode)
> + {
> + rtx r = DECL_RTL (parm);
> + if (REG_P (r))
> + SET_DECL_RTL (parm, gen_rtx_SUBREG (TImode, r, 0));
> + else
> + {
> + gcc_assert (MEM_P (r));
> + SET_DECL_RTL (parm, adjust_address_nv (r, TImode, 0));
> + }
> + }
> + if (DECL_INCOMING_RTL (parm)
> + && GET_MODE (DECL_INCOMING_RTL (parm)) == V1TImode)
> + {
> + rtx r = DECL_INCOMING_RTL (parm);
> + if (REG_P (r))
> + DECL_INCOMING_RTL (parm) = gen_rtx_SUBREG (TImode, r, 0);
> + else
> + {
> + gcc_assert (MEM_P (r));
> + DECL_INCOMING_RTL (parm)
> + = change_address (r, TImode, NULL_RTX);
> + }
> + }
> + }
> }
>
> return 0;
> --- gcc/testsuite/gcc.dg/pr78547.c.jj 2016-11-29 12:26:26.544662630 +0100
> +++ gcc/testsuite/gcc.dg/pr78547.c 2016-11-29 12:26:09.000000000 +0100
> @@ -0,0 +1,18 @@
> +/* PR rtl-optimization/78547 */
> +/* { dg-do compile { target int128 } } */
> +/* { dg-options "-Os -g -freorder-blocks-algorithm=simple -Wno-psabi" } */
> +/* { dg-additional-options "-mstringop-strategy=libcall" { target i?86-*-*
> x86_64-*-* } } */
> +
> +typedef unsigned __int128 u128;
> +typedef unsigned __int128 V __attribute__ ((vector_size (64)));
> +
> +V
> +foo (u128 a, u128 b, u128 c, V d)
> +{
> + V e = (V) {a};
> + V f = e & 1;
> + e = 0 != e;
> + c = c;
> + f = f << ((V) {c} & 7);
> + return f + e;
> +}
>
> Jakub