Hi, emit_memset fails to adjust destination address after gen_strset, which leads to the wrong address in aliasing info. This patch fixes it. Tested on Linux/x86-64. 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. gcc/testsuite/ 2013-12-03 H.J. Lu <hongjiu...@intel.com> PR target/59363 * gcc.target/i386/pr59363.c: New file. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index aa221df..d395a99 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; } 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); +}