On Fri, Mar 11, 2016 at 12:13 PM, Ilya Enkovich <[email protected]> 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 <[email protected]>
> Jakub Jelinek <[email protected]>
>
> PR target/70160
> * config/i386/i386.c (scalar_chain::convert_reg): Skip uses
> of uninitialized values.
>
> gcc/testsuite/
>
> 2016-03-11 Ilya Enkovich <[email protected]>
>
> 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;
> + }
> +}