On Tue, Nov 29, 2016 at 8:44 PM, Jakub Jelinek <ja...@redhat.com> 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 <ja...@redhat.com> > > 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