On Tue, 8 Jan 2019, Jakub Jelinek wrote:

> Hi!
> 
> The following patch attempts to fix one of the several issues with
> the r266345 commit.  assign_stack_local isn't called just during expansion,
> but also during RA, at which point we can't just randomly emit insns in the
> middle of nowhere hoping it will be emitted in some insn sequence.
> 
> This patch just reverts the behavior for the over-aligned temporaries to
> what we did before if it isn't during RA.  If needed, for GCC10 we can come
> up with a way to tell the RA that it should realign, but IMHO it isn't
> really needed right now.
> 
> Bootstrapped/regtested on x86_64-linux, i686-linux and powerpc64le-linux, ok
> for trunk?

OK.

Richard.

> 2019-01-08  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR rtl-optimization/88331
>       * function.c (assign_stack_local_1): Don't set dynamic_align_addr if
>       not currently_expanding_to_rtl.
> 
>       * gcc.target/i386/pr88331.c: New test.
> 
> --- gcc/function.c.jj 2019-01-01 12:37:16.550984910 +0100
> +++ gcc/function.c    2019-01-08 16:51:02.868722422 +0100
> @@ -400,7 +400,9 @@ assign_stack_local_1 (machine_mode mode,
>      {
>        /* If the required alignment exceeds MAX_SUPPORTED_STACK_ALIGNMENT and
>        it is not OK to reduce it.  Align the slot dynamically.  */
> -      if (mode == BLKmode && (kind & ASLK_REDUCE_ALIGN) == 0)
> +      if (mode == BLKmode
> +       && (kind & ASLK_REDUCE_ALIGN) == 0
> +       && currently_expanding_to_rtl)
>       dynamic_align_addr = true;
>        else
>       {
> --- gcc/testsuite/gcc.target/i386/pr88331.c.jj        2019-01-08 
> 17:31:46.504540870 +0100
> +++ gcc/testsuite/gcc.target/i386/pr88331.c   2019-01-08 17:31:17.547014393 
> +0100
> @@ -0,0 +1,30 @@
> +/* PR rtl-optimization/88331 */
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -march=core-avx2" } */
> +
> +int b, d, e, g, i, j, l, m;
> +int *c, *h, *n, *o;
> +long f, k;
> +
> +void
> +foo (void)
> +{
> +  long p = i;
> +  int *a = o;
> +  while (p)
> +    {
> +      n = (int *) (__UINTPTR_TYPE__) a[0];
> +      for (; f; f += 4)
> +     for (; m <= d;)
> +       {
> +         for (; g <= e; ++g)
> +           l = (int) (__UINTPTR_TYPE__) (n + l);
> +         c[m] = (int) (__UINTPTR_TYPE__) n;
> +       }
> +    }
> +  int q = 0;
> +  k = 0;
> +  for (; k < j; k++)
> +    q += o[k] * h[k];
> +  b = q;
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to