re PR rtl-optimization/78547 (ICE: in loc_cmp, at var-tracking.c:3417 with -Os -g...
authorJakub Jelinek <jakub@redhat.com>
Fri, 2 Dec 2016 08:44:42 +0000 (09:44 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 2 Dec 2016 08:44:42 +0000 (09:44 +0100)
PR rtl-optimization/78547
* emit-rtl.c (unshare_all_rtl): Make sure DECL_RTL and
DECL_INCOMING_RTL is not shared.
* config/i386/i386.c (convert_scalars_to_vectors): If any
insns have been converted, adjust all parameter's DEC_RTL and
DECL_INCOMING_RTL back from V1TImode to TImode if the parameters have
TImode.

* gcc.dg/pr78547.c: New test.

From-SVN: r243165

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/emit-rtl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr78547.c [new file with mode: 0644]

index a83f5280b925212d020d60f07bbc231709351e38..260a66d9e8b7960c20dd6a6e10fba518eb1bd47f 100644 (file)
@@ -1,5 +1,13 @@
 2016-12-02  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/78547
+       * emit-rtl.c (unshare_all_rtl): Make sure DECL_RTL and
+       DECL_INCOMING_RTL is not shared.
+       * config/i386/i386.c (convert_scalars_to_vectors): If any
+       insns have been converted, adjust all parameter's DEC_RTL and
+       DECL_INCOMING_RTL back from V1TImode to TImode if the parameters have
+       TImode.
+
        PR rtl-optimization/78575
        * config/i386/i386.c (timode_scalar_chain::fix_debug_reg_uses): Use
        DF infrastructure to wrap all V1TImode reg uses into TImode subreg
index 5226e45440a383203b4904548cbd22b3b72d7847..5678fa2ba857ae810d97b97a6bdf22b0e7273e9d 100644 (file)
@@ -4075,6 +4075,28 @@ convert_scalars_to_vector ()
        crtl->stack_alignment_needed = 128;
       if (crtl->stack_alignment_estimated < 128)
        crtl->stack_alignment_estimated = 128;
+      /* Fix up DECL_RTL/DECL_INCOMING_RTL of arguments.  */
+      if (TARGET_64BIT)
+       for (tree parm = DECL_ARGUMENTS (current_function_decl);
+            parm; parm = DECL_CHAIN (parm))
+         {
+           if (TYPE_MODE (TREE_TYPE (parm)) != TImode)
+             continue;
+           if (DECL_RTL_SET_P (parm)
+               && GET_MODE (DECL_RTL (parm)) == V1TImode)
+             {
+               rtx r = DECL_RTL (parm);
+               if (REG_P (r))
+                 SET_DECL_RTL (parm, gen_rtx_SUBREG (TImode, r, 0));
+             }
+           if (DECL_INCOMING_RTL (parm)
+               && GET_MODE (DECL_INCOMING_RTL (parm)) == V1TImode)
+             {
+               rtx r = DECL_INCOMING_RTL (parm);
+               if (REG_P (r))
+                 DECL_INCOMING_RTL (parm) = gen_rtx_SUBREG (TImode, r, 0);
+             }
+         }
     }
 
   return 0;
index 02512d3857afff356bf4029b164ff147fe7dd102..d2ac88bd510217d8478df48e01016864ccb4ac66 100644 (file)
@@ -2668,6 +2668,14 @@ unsigned int
 unshare_all_rtl (void)
 {
   unshare_all_rtl_1 (get_insns ());
+
+  for (tree decl = DECL_ARGUMENTS (cfun->decl); decl; decl = DECL_CHAIN (decl))
+    {
+      if (DECL_RTL_SET_P (decl))
+       SET_DECL_RTL (decl, copy_rtx_if_shared (DECL_RTL (decl)));
+      DECL_INCOMING_RTL (decl) = copy_rtx_if_shared (DECL_INCOMING_RTL (decl));
+    }
+
   return 0;
 }
 
index 6ee4b1354ec6b33530e261d1d6f52f9a336ee921..490d08165abbfdfd72f0170b9f779401498025ba 100644 (file)
@@ -1,5 +1,8 @@
 2016-12-02  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/78547
+       * gcc.dg/pr78547.c: New test.
+
        PR rtl-optimization/78575
        * gcc.dg/pr78575.c: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr78547.c b/gcc/testsuite/gcc.dg/pr78547.c
new file mode 100644 (file)
index 0000000..9300cbc
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR rtl-optimization/78547 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-Os -g -freorder-blocks-algorithm=simple -Wno-psabi" } */
+/* { dg-additional-options "-mstringop-strategy=libcall" { target i?86-*-* x86_64-*-* } } */
+
+typedef unsigned __int128 u128;
+typedef unsigned __int128 V __attribute__ ((vector_size (64)));
+
+V
+foo (u128 a, u128 b, u128 c, V d)
+{
+  V e = (V) {a};
+  V f = e & 1;
+  e = 0 != e;
+  c = c;
+  f = f << ((V) {c} & 7);
+  return f + e;
+}