Message ID | 20160311111301.GC3131@msticlxl57.ims.intel.com |
---|---|
State | New |
Headers | show |
On Fri, Mar 11, 2016 at 12:13 PM, Ilya Enkovich <enkovich.gnu@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.gnu@gmail.com> > Jakub Jelinek <jakub@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.gnu@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; > + } > +}
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; + } +}