Message ID | CAMe9rOqkmkvBVFQ-=80HqCPmD21kHXK-vqJMkPhgP+DpTWa2aA@mail.gmail.com |
---|---|
State | New |
Headers | show |
> Here is the updated patch. Tested on Linux/x86-64. It > fixed git. OK to install? > > Thanks. > > -- > H.J. > --- > gcc/ > > 2013-12-03 H.J. Lu <hongjiu.lu@intel.com> > > PR target/59363 > * config/i386/i386.c (emit_memset): Adjust destination address > after gen_strset. > (expand_setmem_epilogue): Likewise. > > gcc/testsuite/ > > 2013-12-03 H.J. Lu <hongjiu.lu@intel.com> > > PR target/59363 > * gcc.target/i386/pr59363.c: New file. Yes, this seems fine to me. As discussed previously, we probably want to make strmov patterns use to match strset (I will need to re-check codegen on targets that does single memops) and then we will need similar update of aliasing there, too. Currently I assume we are fine becaue we use it only in expand_movmem epilogue and on the way there we already cleared the alias offset on all code paths? Thanks for looking into it. Honza > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index b11363be..d048511 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -22806,6 +22806,8 @@ emit_memset (rtx destmem, rtx destptr, rtx promoted_val, > if (piece_size <= GET_MODE_SIZE (word_mode)) > { > emit_insn (gen_strset (destptr, dst, promoted_val)); > + dst = adjust_automodify_address_nv (dst, move_mode, destptr, > + piece_size); > continue; > } > > @@ -22875,14 +22877,18 @@ expand_setmem_epilogue (rtx destmem, rtx > destptr, rtx value, rtx vec_value, > { > dest = change_address (destmem, DImode, destptr); > emit_insn (gen_strset (destptr, dest, value)); > + dest = adjust_automodify_address_nv (dest, DImode, destptr, 8); > emit_insn (gen_strset (destptr, dest, value)); > } > else > { > dest = change_address (destmem, SImode, destptr); > emit_insn (gen_strset (destptr, dest, value)); > + dest = adjust_automodify_address_nv (dest, SImode, destptr, 4); > emit_insn (gen_strset (destptr, dest, value)); > + dest = adjust_automodify_address_nv (dest, SImode, destptr, 8); > emit_insn (gen_strset (destptr, dest, value)); > + dest = adjust_automodify_address_nv (dest, SImode, destptr, 12); > emit_insn (gen_strset (destptr, dest, value)); > } > emit_label (label); > @@ -22900,6 +22906,7 @@ expand_setmem_epilogue (rtx destmem, rtx > destptr, rtx value, rtx vec_value, > { > dest = change_address (destmem, SImode, destptr); > emit_insn (gen_strset (destptr, dest, value)); > + dest = adjust_automodify_address_nv (dest, SImode, destptr, 4); > emit_insn (gen_strset (destptr, dest, value)); > } > emit_label (label); > diff --git a/gcc/testsuite/gcc.target/i386/pr59363.c > b/gcc/testsuite/gcc.target/i386/pr59363.c > new file mode 100644 > index 0000000..a4e1240 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr59363.c > @@ -0,0 +1,24 @@ > +/* PR target/59363 */ > +/* { dg-do run } */ > +/* { dg-options "-O2 -mtune=amdfam10" } */ > + > +typedef struct { > + int ctxlen; > + long interhunkctxlen; > + int flags; > + long find_func; > + void *find_func_priv; > + int hunk_func; > +} xdemitconf_t; > + > +__attribute__((noinline)) > +int xdi_diff(xdemitconf_t *xecfg) { > + if (xecfg->hunk_func == 0) > + __builtin_abort(); > + return 0; > +} > +int main() { > + xdemitconf_t xecfg = {0}; > + xecfg.hunk_func = 1; > + return xdi_diff(&xecfg); > +}
On Tue, Dec 3, 2013 at 4:41 AM, Jan Hubicka <hubicka@ucw.cz> wrote: >> Here is the updated patch. Tested on Linux/x86-64. It >> fixed git. OK to install? >> >> Thanks. >> >> -- >> H.J. >> --- >> gcc/ >> >> 2013-12-03 H.J. Lu <hongjiu.lu@intel.com> >> >> PR target/59363 >> * config/i386/i386.c (emit_memset): Adjust destination address >> after gen_strset. >> (expand_setmem_epilogue): Likewise. >> >> gcc/testsuite/ >> >> 2013-12-03 H.J. Lu <hongjiu.lu@intel.com> >> >> PR target/59363 >> * gcc.target/i386/pr59363.c: New file. > > Yes, this seems fine to me. As discussed previously, we probably want to make > strmov patterns use to match strset (I will need to re-check codegen on targets > that does single memops) and then we will need similar update of aliasing > there, too. > Currently I assume we are fine becaue we use it only in expand_movmem epilogue > and on the way there we already cleared the alias offset on all code paths? > I believe it is the case. I checked it in. Thanks.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b11363be..d048511 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -22806,6 +22806,8 @@ emit_memset (rtx destmem, rtx destptr, rtx promoted_val, if (piece_size <= GET_MODE_SIZE (word_mode)) { emit_insn (gen_strset (destptr, dst, promoted_val)); + dst = adjust_automodify_address_nv (dst, move_mode, destptr, + piece_size); continue; } @@ -22875,14 +22877,18 @@ expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx vec_value, { dest = change_address (destmem, DImode, destptr); emit_insn (gen_strset (destptr, dest, value)); + dest = adjust_automodify_address_nv (dest, DImode, destptr, 8); emit_insn (gen_strset (destptr, dest, value)); } else { dest = change_address (destmem, SImode, destptr); emit_insn (gen_strset (destptr, dest, value)); + dest = adjust_automodify_address_nv (dest, SImode, destptr, 4); emit_insn (gen_strset (destptr, dest, value)); + dest = adjust_automodify_address_nv (dest, SImode, destptr, 8); emit_insn (gen_strset (destptr, dest, value)); + dest = adjust_automodify_address_nv (dest, SImode, destptr, 12); emit_insn (gen_strset (destptr, dest, value)); } emit_label (label); @@ -22900,6 +22906,7 @@ expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx vec_value, { dest = change_address (destmem, SImode, destptr); emit_insn (gen_strset (destptr, dest, value)); + dest = adjust_automodify_address_nv (dest, SImode, destptr, 4); emit_insn (gen_strset (destptr, dest, value)); } emit_label (label); diff --git a/gcc/testsuite/gcc.target/i386/pr59363.c b/gcc/testsuite/gcc.target/i386/pr59363.c new file mode 100644 index 0000000..a4e1240 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr59363.c @@ -0,0 +1,24 @@ +/* PR target/59363 */ +/* { dg-do run } */ +/* { dg-options "-O2 -mtune=amdfam10" } */ + +typedef struct { + int ctxlen; + long interhunkctxlen; + int flags; + long find_func; + void *find_func_priv; + int hunk_func; +} xdemitconf_t; + +__attribute__((noinline)) +int xdi_diff(xdemitconf_t *xecfg) { + if (xecfg->hunk_func == 0) + __builtin_abort(); + return 0; +} +int main() { + xdemitconf_t xecfg = {0}; + xecfg.hunk_func = 1; + return xdi_diff(&xecfg); +}