]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR rtl-optimization/87871
authorbergner <bergner@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 18 Apr 2019 22:14:17 +0000 (22:14 +0000)
committerbergner <bergner@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 18 Apr 2019 22:14:17 +0000 (22:14 +0000)
* ira-lives.c (make_object_dead): Don't add conflicts to
TOTAL_CONFLICT_HARD_REGS for register ignore_reg_for_conflicts.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@270448 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ira-lives.c

index 3784ca2d46516db4f6e3a5168a970377cb483fa0..c240c54b25f1d7106727654c81534915bde0a17d 100644 (file)
@@ -1,3 +1,9 @@
+2019-04-18  Peter Bergner  <bergner@linux.ibm.com>
+
+       PR rtl-optimization/87871
+       * ira-lives.c (make_object_dead): Don't add conflicts to
+       TOTAL_CONFLICT_HARD_REGS for register ignore_reg_for_conflicts.
+
 2019-04-18  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/89797
index af5b821768866a060f6905e48e990c4c8a6b620c..faadf08b07387ccc1b3c4a5f339767557ec4165d 100644 (file)
@@ -163,7 +163,9 @@ static void
 make_object_dead (ira_object_t obj)
 {
   live_range_t lr;
+  int regno;
   int ignore_regno = -1;
+  int ignore_total_regno = -1;
   int end_regno = -1;
 
   sparseset_clear_bit (objects_live, OBJECT_CONFLICT_ID (obj));
@@ -174,16 +176,14 @@ make_object_dead (ira_object_t obj)
       && REGNO (ignore_reg_for_conflicts) < FIRST_PSEUDO_REGISTER)
     {
       end_regno = END_REGNO (ignore_reg_for_conflicts);
-      int src_regno = ignore_regno = REGNO (ignore_reg_for_conflicts);
+      ignore_regno = ignore_total_regno = REGNO (ignore_reg_for_conflicts);
 
-      while (src_regno < end_regno)
+      for (regno = ignore_regno; regno < end_regno; regno++)
        {
-         if (TEST_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), src_regno))
-           {
-             ignore_regno = end_regno = -1;
-             break;
-           }
-         src_regno++;
+         if (TEST_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), regno))
+           ignore_regno = end_regno;
+         if (TEST_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), regno))
+           ignore_total_regno = end_regno;
        }
     }
 
@@ -192,8 +192,10 @@ make_object_dead (ira_object_t obj)
 
   /* If IGNORE_REG_FOR_CONFLICTS did not already conflict with OBJ, make
      sure it still doesn't.  */
-  for (; ignore_regno < end_regno; ignore_regno++)
-    CLEAR_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), ignore_regno);
+  for (regno = ignore_regno; regno < end_regno; regno++)
+    CLEAR_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), regno);
+  for (regno = ignore_total_regno; regno < end_regno; regno++)
+    CLEAR_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), regno);
 
   lr = OBJECT_LIVE_RANGES (obj);
   ira_assert (lr != NULL);