diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2013-12-03 12:56:32 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2013-12-03 04:56:32 -0800 |
commit | 3848839d3e2d112d397ef5c0edd5485acd932b42 (patch) | |
tree | 463c902a581264042685223f266c9861c2586420 /gcc | |
parent | ddc923b52d28df9ed6e5d50138593a31da3e519a (diff) | |
download | gcc-3848839d3e2d112d397ef5c0edd5485acd932b42.zip gcc-3848839d3e2d112d397ef5c0edd5485acd932b42.tar.gz gcc-3848839d3e2d112d397ef5c0edd5485acd932b42.tar.bz2 |
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.
From-SVN: r205630
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr59363.c | 24 |
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 944e28c..cc8dc86 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +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. + 2013-12-03 Marek Polacek <polacek@redhat.com> PR middle-end/56344 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 81e9ce8..21963bb 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 60019c9..17f208f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-03 H.J. Lu <hongjiu.lu@intel.com> + + PR target/59363 + * gcc.target/i386/pr59363.c: New file. + 2013-12-03 Marek Polacek <polacek@redhat.com> 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 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); +} |