diff mbox

[4.9/5,Backport] PR rtl-optimization/67037 Use copy_rtx when necessary

Message ID 1446072524-17431-1-git-send-email-notasas@gmail.com
State New
Headers show

Commit Message

Gražvydas Ignotas Oct. 28, 2015, 10:48 p.m. UTC
Hi,

This is the 4.9 and GCC 5 backport of patch from PR67037 that's already in trunk.
I've build it on 4.9 and confirmed that it works.

Grazvydas

Backport from mainline
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.
---
 gcc/lra-constraints.c                         |  2 +-
 gcc/testsuite/gcc.c-torture/execute/pr67037.c | 49 +++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr67037.c

Comments

Gražvydas Ignotas Nov. 4, 2015, 10:49 a.m. UTC | #1
Can anyone commit this, please?

On Thu, Oct 29, 2015 at 12:48 AM, Grazvydas Ignotas <notasas@gmail.com> wrote:
> Hi,
>
> This is the 4.9 and GCC 5 backport of patch from PR67037 that's already in trunk.
> I've build it on 4.9 and confirmed that it works.
>
> Grazvydas
>
> Backport from mainline
> 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.
> ---
>  gcc/lra-constraints.c                         |  2 +-
>  gcc/testsuite/gcc.c-torture/execute/pr67037.c | 49 +++++++++++++++++++++++++++
>  2 files changed, 50 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr67037.c
>
> diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
> index ae8f3cd..919b127 100644
> --- a/gcc/lra-constraints.c
> +++ b/gcc/lra-constraints.c
> @@ -1203,7 +1203,7 @@ process_addr_reg (rtx *loc, rtx *before, rtx *after, enum reg_class cl)
>    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 ();
> diff --git a/gcc/testsuite/gcc.c-torture/execute/pr67037.c b/gcc/testsuite/gcc.c-torture/execute/pr67037.c
> new file mode 100644
> index 0000000..3119d32
> --- /dev/null
> +++ b/gcc/testsuite/gcc.c-torture/execute/pr67037.c
> @@ -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);
> +}
> --
> 1.9.1
>
diff mbox

Patch

diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index ae8f3cd..919b127 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -1203,7 +1203,7 @@  process_addr_reg (rtx *loc, rtx *before, rtx *after, enum reg_class cl)
   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 ();
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr67037.c b/gcc/testsuite/gcc.c-torture/execute/pr67037.c
new file mode 100644
index 0000000..3119d32
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr67037.c
@@ -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);
+}