Message ID | 20160729183413.GA20050@intel.com |
---|---|
State | New |
Headers | show |
On Fri, Jul 29, 2016 at 8:34 PM, H.J. Lu <hongjiu.lu@intel.com> wrote: > TImode register referenced in debug insn can be converted to V1TImode by > scalar to vector optimization. When converting a TImode store to V1TImode, > we need to check all debug insns on its use chain to convert the V1TImode > register to SUBREG TImode if source register is undefined. > > Tested on x86-64. OK for trunk? OK. Thanks, Uros. > H.J. > --- > gcc/ > > PR target/72748 > * config/i386/i386.c (timode_scalar_chain::convert_insn): Call > fix_debug_reg_uses after changing source register mode to > V1TImode if source register is undefined. > > gcc/testsuite/ > > * gcc.target/i386/pr72748.c: New test. > --- > gcc/config/i386/i386.c | 6 ++++++ > gcc/testsuite/gcc.target/i386/pr72748.c | 27 +++++++++++++++++++++++++++ > 2 files changed, 33 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/i386/pr72748.c > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index 7c8bb17..93eaab1 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -3858,6 +3858,12 @@ timode_scalar_chain::convert_insn (rtx_insn *insn) > switch (GET_CODE (src)) > { > case REG: > + PUT_MODE (src, V1TImode); > + /* Call fix_debug_reg_uses only if SRC is never defined. */ > + if (!DF_REG_DEF_CHAIN (REGNO (src))) > + fix_debug_reg_uses (src); > + break; > + > case MEM: > PUT_MODE (src, V1TImode); > break; > diff --git a/gcc/testsuite/gcc.target/i386/pr72748.c b/gcc/testsuite/gcc.target/i386/pr72748.c > new file mode 100644 > index 0000000..0d5e4f5 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr72748.c > @@ -0,0 +1,27 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -g" } */ > + > +volatile int a; > +int c, d, e, f, g, h; > + > +int fn1 () > +{ > + int i; > + for (; d;) > + { > + if (e) > + break; > + g = 0; > + int j[4]; > + for (h = 0; h < 4; h++) > + g++; > + for (; c < 2; c++) > + { > + e = j[g]; > + i = j[0]; > + f = 4; > + } > + f |= d; > + } > + return a; > +} > -- > 2.7.4 >
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 7c8bb17..93eaab1 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3858,6 +3858,12 @@ timode_scalar_chain::convert_insn (rtx_insn *insn) switch (GET_CODE (src)) { case REG: + PUT_MODE (src, V1TImode); + /* Call fix_debug_reg_uses only if SRC is never defined. */ + if (!DF_REG_DEF_CHAIN (REGNO (src))) + fix_debug_reg_uses (src); + break; + case MEM: PUT_MODE (src, V1TImode); break; diff --git a/gcc/testsuite/gcc.target/i386/pr72748.c b/gcc/testsuite/gcc.target/i386/pr72748.c new file mode 100644 index 0000000..0d5e4f5 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr72748.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -g" } */ + +volatile int a; +int c, d, e, f, g, h; + +int fn1 () +{ + int i; + for (; d;) + { + if (e) + break; + g = 0; + int j[4]; + for (h = 0; h < 4; h++) + g++; + for (; c < 2; c++) + { + e = j[g]; + i = j[0]; + f = 4; + } + f |= d; + } + return a; +}