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