re PR rtl-optimization/80343 (ICE in extract_constrain_insn, at recog.c:2213 (error...
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 13 Apr 2017 18:08:51 +0000 (18:08 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 13 Apr 2017 18:08:51 +0000 (18:08 +0000)
2017-04-13  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/80343
* lra-remat.c (update_scratch_ops): Assign original hard reg to
new scratch pseudo.

2017-04-13  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/80343
* gcc.target/powerpc/pr80343.c: New.

From-SVN: r246914

gcc/ChangeLog
gcc/lra-remat.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr80343.c [new file with mode: 0644]

index 2fb6b3522312aa98f75bd532483f548ffa74be67..ca93f9bf21eb932e54f160e4d0184608c0822513 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-13  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/80343
+       * lra-remat.c (update_scratch_ops): Assign original hard reg to
+       new scratch pseudo.
+
 2017-04-13  Denis Khalikov <d.khalikov@partner.samsung.com>
 
        PR sanitizer/80414
index 5a15075e7aa8581cc59604d170cf84c5963467bd..2c51481374ac1f641ac163d345f2865c5536ef21 100644 (file)
@@ -1024,6 +1024,7 @@ get_hard_regs (struct lra_insn_reg *reg, int &nregs)
 static void
 update_scratch_ops (rtx_insn *remat_insn)
 {
+  int hard_regno;
   lra_insn_recog_data_t id = lra_get_insn_recog_data (remat_insn);
   struct lra_static_insn_data *static_id = id->insn_static_data;
   for (int i = 0; i < static_id->n_operands; i++)
@@ -1034,9 +1035,17 @@ update_scratch_ops (rtx_insn *remat_insn)
       int regno = REGNO (*loc);
       if (! lra_former_scratch_p (regno))
        continue;
+      hard_regno = reg_renumber[regno];
       *loc = lra_create_new_reg (GET_MODE (*loc), *loc,
                                 lra_get_allocno_class (regno),
                                 "scratch pseudo copy");
+      if (hard_regno >= 0)
+       {
+         reg_renumber[REGNO (*loc)] = hard_regno;
+         if (lra_dump_file)
+           fprintf (lra_dump_file, "    Assigning the same %d to r%d\n",
+                    REGNO (*loc), hard_regno);
+       }
       lra_register_new_scratch_op (remat_insn, i);
     }
   
index c7b8d61736454c8b78edd5533206d6a57ce89103..4f46db8091fe9e997c5cd899eb84939268b9d4d3 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-13  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/80343
+       * gcc.target/powerpc/pr80343.c: New.
+
 2017-04-13  Denis Khalikov  <d.khalikov@partner.samsung.com>
 
        PR sanitizer/80414
diff --git a/gcc/testsuite/gcc.target/powerpc/pr80343.c b/gcc/testsuite/gcc.target/powerpc/pr80343.c
new file mode 100644 (file)
index 0000000..cea2a77
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-do compile { target powerpc-*-*spe } } */
+/* { dg-options "-O2 -ftracer -fPIC" } */
+long long int vi, ls;
+int wq, oa, to, fv;
+signed char zo;
+
+long long int
+ai (long long int ip, long long int jc, int gt)
+{
+  ip /= 3;
+  jc += ip;
+  if (ip != 0)
+    vi = 0;
+  vi += ls;
+
+  if (wq != oa)
+    {
+      int tz;
+
+      for (tz = 0; tz < 32; ++tz)
+        zo -= wq & gt;
+
+      if ((gt & 5) > oa)
+        {
+          zo += gt;
+          fv += zo + to;
+        }
+
+      if (gt != 0)
+        oa = 0;
+
+      if (fv != 0)
+        {
+          vi += wq;
+          ls += ip;
+          jc += (vi != 0) ? ip : ls;
+        }
+
+      while (tz != 0)
+        {
+          zo = wq;
+          tz = zo;
+        }
+
+      ++to;
+      wq = ip;
+    }
+
+  return jc;
+}