re PR rtl-optimization/67037 (Wrong code at -O1 and above on ARM)
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Wed, 30 Sep 2015 18:51:31 +0000 (18:51 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Wed, 30 Sep 2015 18:51:31 +0000 (18:51 +0000)
2015-09-30  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR rtl-optimization/67037
        * lra-constraints.c (process_addr_reg): Use copy_rtx when necessary.

testsuite:
2015-09-30  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR rtl-optimization/67037
        * gcc.c-torture/execute/pr67037.c: New test.

From-SVN: r228303

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr67037.c [new file with mode: 0644]

index dd723b825abc04b66c2985927eb18e1b5e23146d..b60a3e6bd1c40ececb02e62b8c280ff76738f8be 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-30  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR rtl-optimization/67037
+       * lra-constraints.c (process_addr_reg): Use copy_rtx when necessary.
+
 2015-09-30  Bernd Schmidt  <bernds@redhat.com>
 
        * gimple-ssa.h (gimple_df): Add free_ssanames_queue field.
index c6afa7a94f5e4db6045b2efc4463fc0ac4c67526..7764f29f477b78e6fafdc1e8ea8a56471dd1b7ad 100644 (file)
@@ -1339,7 +1339,7 @@ process_addr_reg (rtx *loc, bool check_only_p, rtx_insn **before, rtx_insn **aft
   if (after != NULL)
     {
       start_sequence ();
-      lra_emit_move (reg, new_reg);
+      lra_emit_move (before_p ? copy_rtx (reg) : reg, new_reg);
       emit_insn (*after);
       *after = get_insns ();
       end_sequence ();
index 9cddbefdb8160607cc820822f79b71d0a32e7c23..ece4ad1b089fe85694d357cbc76f57e0ece17e77 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-30  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR rtl-optimization/67037
+       * gcc.c-torture/execute/pr67037.c: New test.
+
 2015-09-30  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        * lib/target-supports.exp (check_effective_target_sync_int_128):
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr67037.c b/gcc/testsuite/gcc.c-torture/execute/pr67037.c
new file mode 100644 (file)
index 0000000..3119d32
--- /dev/null
@@ -0,0 +1,49 @@
+long (*extfunc)();
+
+static inline void lstrcpynW( short *d, const short *s, int n )
+{
+    unsigned int count = n;
+
+    while ((count > 1) && *s)
+    {
+        count--;
+        *d++ = *s++;
+    }
+    if (count) *d = 0;
+}
+
+int __attribute__((noinline,noclone))
+badfunc(int u0, int u1, int u2, int u3,
+  short *fsname, unsigned int fsname_len)
+{
+    static const short ntfsW[] = {'N','T','F','S',0};
+    char superblock[2048+3300];
+    int ret = 0;
+    short *p;
+
+    if (extfunc())
+        return 0;
+    p = (void *)extfunc();
+    if (p != 0)
+        goto done;
+
+    extfunc(superblock);
+
+    lstrcpynW(fsname, ntfsW, fsname_len);
+
+    ret = 1;
+done:
+    return ret;
+}
+
+static long f()
+{
+    return 0;
+}
+
+int main()
+{
+    short buf[6];
+    extfunc = f;
+    return !badfunc(0, 0, 0, 0, buf, 6);
+}