From ba7cbae582ffee78025d5c7fcf59a36904ef3d14 Mon Sep 17 00:00:00 2001 From: hjl Date: Tue, 3 Dec 2013 12:56:32 +0000 Subject: [PATCH] Adjust destination address after gen_strset gcc/ PR target/59363 * config/i386/i386.c (emit_memset): Adjust destination address after gen_strset. (expand_setmem_epilogue): Likewise. gcc/testsuite/ PR target/59363 * gcc.target/i386/pr59363.c: New file. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205630 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/config/i386/i386.c | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/pr59363.c | 24 ++++++++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr59363.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 944e28cbbc4..cc8dc867016 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-12-03 H.J. Lu + + PR target/59363 + * config/i386/i386.c (emit_memset): Adjust destination address + after gen_strset. + (expand_setmem_epilogue): Likewise. + 2013-12-03 Marek Polacek PR middle-end/56344 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 81e9ce83489..21963bb28b7 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -22854,6 +22854,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; } @@ -22923,14 +22925,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); @@ -22948,6 +22954,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/ChangeLog b/gcc/testsuite/ChangeLog index 60019c9c8a5..17f208fded4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-03 H.J. Lu + + PR target/59363 + * gcc.target/i386/pr59363.c: New file. + 2013-12-03 Marek Polacek PR c/59351 diff --git a/gcc/testsuite/gcc.target/i386/pr59363.c b/gcc/testsuite/gcc.target/i386/pr59363.c new file mode 100644 index 00000000000..a4e12403543 --- /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); +} -- 2.11.4.GIT