aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2013-12-03 12:56:32 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2013-12-03 04:56:32 -0800
commit3848839d3e2d112d397ef5c0edd5485acd932b42 (patch)
tree463c902a581264042685223f266c9861c2586420 /gcc
parentddc923b52d28df9ed6e5d50138593a31da3e519a (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr59363.c24
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);
+}