re PR middle-end/79909 (ICE error: invalid rtl sharing found in the insn on ppc64le)
authorJakub Jelinek <jakub@redhat.com>
Fri, 10 Mar 2017 07:57:45 +0000 (08:57 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 10 Mar 2017 07:57:45 +0000 (08:57 +0100)
PR rtl-optimization/79909
* combine.c (try_combine): Use simplify_replace_rtx on individual
CALL_INSN_FUNCTION_USAGE elements instead of replace_rtx on copy_rtx
of the whole CALL_INSN_FUNCTION_USAGE.

* gcc.target/powerpc/pr79909.c: New test.

From-SVN: r246023

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr79909.c [new file with mode: 0644]

index 9a4844e..b44a7a5 100644 (file)
@@ -1,5 +1,10 @@
 2017-03-10  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/79909
+       * combine.c (try_combine): Use simplify_replace_rtx on individual
+       CALL_INSN_FUNCTION_USAGE elements instead of replace_rtx on copy_rtx
+       of the whole CALL_INSN_FUNCTION_USAGE.
+
        PR tree-optimization/79972
        * gimple-ssa-warn-alloca.c (alloca_call_type): Only call
        get_range_info on SSA_NAMEs.  Formatting fixes.
index b5c0c18..66215a6 100644 (file)
@@ -4293,26 +4293,25 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
 
     if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
       {
-       rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
-
-       reset_used_flags (call_usage);
-       call_usage = copy_rtx (call_usage);
-
-       if (substed_i2)
+       for (rtx link = CALL_INSN_FUNCTION_USAGE (i3); link;
+            link = XEXP (link, 1))
          {
-           /* I2SRC must still be meaningful at this point.  Some splitting
-              operations can invalidate I2SRC, but those operations do not
-              apply to calls.  */
-           gcc_assert (i2src);
-           replace_rtx (call_usage, i2dest, i2src);
+           if (substed_i2)
+             {
+               /* I2SRC must still be meaningful at this point.  Some
+                  splitting operations can invalidate I2SRC, but those
+                  operations do not apply to calls.  */
+               gcc_assert (i2src);
+               XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
+                                                      i2dest, i2src);
+             }
+           if (substed_i1)
+             XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
+                                                    i1dest, i1src);
+           if (substed_i0)
+             XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
+                                                    i0dest, i0src);
          }
-
-       if (substed_i1)
-         replace_rtx (call_usage, i1dest, i1src);
-       if (substed_i0)
-         replace_rtx (call_usage, i0dest, i0src);
-
-       CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
       }
 
     if (undobuf.other_insn)
index b60d750..bf1c69d 100644 (file)
@@ -1,5 +1,8 @@
 2017-03-10  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/79909
+       * gcc.target/powerpc/pr79909.c: New test.
+
        PR tree-optimization/79972
        * gcc.dg/pr79972.c: New test.
 
diff --git a/gcc/testsuite/gcc.target/powerpc/pr79909.c b/gcc/testsuite/gcc.target/powerpc/pr79909.c
new file mode 100644 (file)
index 0000000..a9cdc8e
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR rtl-optimization/79909 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mxl-compat" } */
+
+typedef float T __attribute__ ((mode (TD)));
+T b, c, d, e, f, g;
+void bar (T, T, T, T, T, T);
+
+void
+foo (void)
+{
+  bar (e, b, f, c, g, d);
+}