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. 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; + } +}