On Fri, Mar 11, 2016 at 12:13 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> Hi,
>
> This patch is for PR70160.  The problem is that when we build
> instructions chain for conversion in STV pass we don't include
> instruction using unitialized register value but don't skip
> them when convert register.  This patch simply fixes it by
> skipping such register uses.  Bootstrapped and tested on
> x86_64-pc-linux-gnu {-m32}.  OK for trunk?
>
> Thanks,
> Ilya
> --
> gcc/
>
> 2016-03-11  Ilya Enkovich  <enkovich....@gmail.com>
>             Jakub Jelinek  <ja...@redhat.com>
>
>         PR target/70160
>         * config/i386/i386.c (scalar_chain::convert_reg): Skip uses
>         of uninitialized values.
>
> gcc/testsuite/
>
> 2016-03-11  Ilya Enkovich  <enkovich....@gmail.com>
>
>         PR target/70160
>         * gcc.target/i386/pr70160.c: New test.

OK.

Thanks,
Uros.

>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index fa7d3ff..3d8dbc4 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -3372,8 +3372,11 @@ scalar_chain::convert_reg (unsigned regno)
>             bitmap_clear_bit (conv, DF_REF_INSN_UID (ref));
>           }
>        }
> -    else if (NONDEBUG_INSN_P (DF_REF_INSN (ref)))
> +    /* Skip debug insns and uninitialized uses.  */
> +    else if (DF_REF_CHAIN (ref)
> +            && NONDEBUG_INSN_P (DF_REF_INSN (ref)))
>        {
> +       gcc_assert (scopy);
>         replace_rtx (DF_REF_INSN (ref), reg, scopy);
>         df_insn_rescan (DF_REF_INSN (ref));
>        }
> diff --git a/gcc/testsuite/gcc.target/i386/pr70160.c 
> b/gcc/testsuite/gcc.target/i386/pr70160.c
> new file mode 100644
> index 0000000..725e955
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr70160.c
> @@ -0,0 +1,19 @@
> +/* { dg-do compile { target { ia32 } } } */
> +/* { dg-options "-O2 -msse2 -Wno-uninitialized -Wno-maybe-uninitialized" } */
> +
> +long long a;
> +void fn1();
> +void fn2(unsigned t, int a_int, unsigned p)
> +{
> +  long long x;
> +  int i, j = 1;
> +  t = i;
> +  for (; j;) {
> +    a = x;
> +    x = 1 + t;
> +    j += a_int;
> +    fn1();
> +    if (x == 1)
> +      return;
> +  }
> +}

Reply via email to