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

Reply via email to