]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Adjust destination address after gen_strset
authorH.J. Lu <hongjiu.lu@intel.com>
Tue, 3 Dec 2013 12:56:32 +0000 (12:56 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Tue, 3 Dec 2013 12:56:32 +0000 (04:56 -0800)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr59363.c [new file with mode: 0644]

index 944e28cbbc4fb5d34c522a075543184474bb8a92..cc8dc86701600744708e99954ff418ab40ba1f12 100644 (file)
@@ -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
index 81e9ce8348967807eacf8fe9eacfcd83e5cf392d..21963bb28b7132f571a93d1df4a303d68379953b 100644 (file)
@@ -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);
index 60019c9c8a58daca38dfbc47bcda9a90a64bd0cf..17f208fded4db8c3e957e38828c1ecf3fd3c76fd 100644 (file)
@@ -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 (file)
index 0000000..a4e1240
--- /dev/null
@@ -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);
+}