re PR rtl-optimization/72778 (internal compiler error: in create_pre_exit, at mode...
authorVladimir Makarov <vmakarov@redhat.com>
Tue, 2 Aug 2016 20:57:04 +0000 (20:57 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Tue, 2 Aug 2016 20:57:04 +0000 (20:57 +0000)
2016-08-02  Vladimir Makarov  <vmakarov@redhat.com>

PR middle-end/72778
* lra-spills.c (regno_in_use_p): New.
(lra_final_code_change): Use it.

From-SVN: r239000

gcc/ChangeLog
gcc/lra-spills.c

index a5fe1d5cf319d6111fb2069a1a66b07bdd79619d..bec2824710066c134e441f8b7db790a4bf9e0c13 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-02  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR middle-end/72778
+       * lra-spills.c (regno_in_use_p): New.
+       (lra_final_code_change): Use it.
+
 2016-08-02  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/69847
index 1801b7bb391d50f9880b49e2ec84477736e55b27..a5073b69f46a79f639b0624eaea1300f511c18d1 100644 (file)
@@ -686,6 +686,20 @@ return_regno_p (unsigned int regno)
   return false;
 }
 
+/* Return true if REGNO is one of subsequent USE after INSN.  */
+static bool
+regno_in_use_p (rtx_insn *insn, unsigned int regno)
+{
+  while ((insn = next_nondebug_insn (insn)) != NULL_RTX
+        && INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE)
+    {
+      if (REG_P (XEXP (PATTERN (insn), 0))
+         && regno == REGNO (XEXP (PATTERN (insn), 0)))
+       return TRUE;
+    }
+  return false;
+}
+
 /* Final change of pseudos got hard registers into the corresponding
    hard registers and removing temporary clobbers.  */
 void
@@ -693,7 +707,7 @@ lra_final_code_change (void)
 {
   int i, hard_regno;
   basic_block bb;
-  rtx_insn *insn, *curr, *next_insn;
+  rtx_insn *insn, *curr;
   int max_regno = max_reg_num ();
 
   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
@@ -728,11 +742,7 @@ lra_final_code_change (void)
              && REG_P (SET_SRC (pat)) && REG_P (SET_DEST (pat))
              && REGNO (SET_SRC (pat)) == REGNO (SET_DEST (pat))
              && (! return_regno_p (REGNO (SET_SRC (pat)))
-                 || (next_insn = next_nondebug_insn (insn)) == NULL_RTX
-                 || ! INSN_P (next_insn)
-                 || GET_CODE (PATTERN (next_insn)) != USE
-                 || ! REG_P (XEXP (PATTERN (next_insn), 0))
-                 || REGNO (SET_SRC (pat)) != REGNO (XEXP (PATTERN (next_insn), 0))))
+                 || ! regno_in_use_p (insn, REGNO (SET_SRC (pat)))))
            {
              lra_invalidate_insn_data (insn);
              delete_insn (insn);