diff mbox

PATCH: PR target/59363: [4.9 Regression] r203886 miscompiles git

Message ID 20131203010536.GA10039@intel.com
State New
Headers show

Commit Message

H.J. Lu Dec. 3, 2013, 1:05 a.m. UTC
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.lu@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.lu@intel.com>

	PR target/59363
	* gcc.target/i386/pr59363.c: New file.

Comments

Uros Bizjak Dec. 3, 2013, 8:11 a.m. UTC | #1
On Tue, Dec 3, 2013 at 2:05 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:

> 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?
>
> 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.
>
> gcc/testsuite/
>
> 2013-12-03   H.J. Lu  <hongjiu.lu@intel.com>
>
>         PR target/59363
>         * gcc.target/i386/pr59363.c: New file.

OK, but according to [1], there are other places where similar issues
should be fixed. I propose to wait for Michael's analysis and eventual
patch, and fix them all together.

[1] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59363#c21

Thanks,
Uros.
Michael Zolotukhin Dec. 3, 2013, 8:45 a.m. UTC | #2
Hi Uros, HJ,

I checked expand_movmem_epilogue - it seemingly doesn't have such a
problem, so the patch is ok.

We might want to add similar adjust_automodify_address_nv call to here as well:
    if (TARGET_64BIT)
        {
          dest = change_address (destmem, DImode, destptr);
          emit_insn (gen_strset (destptr, dest, value));
          emit_insn (gen_strset (destptr, dest, value));
        }
      else
        {
          dest = change_address (destmem, SImode, destptr);
          emit_insn (gen_strset (destptr, dest, value));
          emit_insn (gen_strset (destptr, dest, value));
          emit_insn (gen_strset (destptr, dest, value));
          emit_insn (gen_strset (destptr, dest, value));
        }
(code snippet from previous HJ's comment in bugzilla).
I think it's needed here, but I didn't manage to exploit the bug in
this code. Maybe Uros or Jan can comment whether it's needed in such
code or not.

Thanks,
Michael


On 3 December 2013 12:11, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Tue, Dec 3, 2013 at 2:05 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>
>> 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?
>>
>> 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.
>>
>> gcc/testsuite/
>>
>> 2013-12-03   H.J. Lu  <hongjiu.lu@intel.com>
>>
>>         PR target/59363
>>         * gcc.target/i386/pr59363.c: New file.
>
> OK, but according to [1], there are other places where similar issues
> should be fixed. I propose to wait for Michael's analysis and eventual
> patch, and fix them all together.
>
> [1] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59363#c21
>
> Thanks,
> Uros.
diff mbox

Patch

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);
+}