* reload1.c (reload): Only spill eliminable register with multiple
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 Feb 2004 12:42:26 +0000 (12:42 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 Feb 2004 12:42:26 +0000 (12:42 +0000)
adjacent elimination alternatives if all alternatives fail.

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

gcc/ChangeLog
gcc/reload1.c

index ec2d741..4405cd9 100644 (file)
@@ -1,3 +1,8 @@
+2004-02-25  J"orn Rennecke <joern.rennecke@superh.com>
+
+       * reload1.c (reload): Only spill eliminable register with multiple
+       adjacent elimination alternatives if all alternatives fail.
+
 2004-02-25  Richard Earnshaw  <rearnsha@arm.com>
 
        * arm.c (arm_legitimate_index_p): For QImode the range of an offset
index 1f21e48..12451db 100644 (file)
@@ -849,9 +849,22 @@ reload (rtx first, int global)
 
   /* Spill any hard regs that we know we can't eliminate.  */
   CLEAR_HARD_REG_SET (used_spill_regs);
-  for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-    if (! ep->can_eliminate)
-      spill_hard_reg (ep->from, 1);
+  /* There can be multiple ways to eliminate a register;
+     they should be listed adjacently.
+     Elimination for any register fails only if all possible ways fail.  */
+  for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; )
+    {
+      int from = ep->from;
+      int can_eliminate = 0;
+      do
+       {
+          can_eliminate |= ep->can_eliminate;
+          ep++;
+       }
+      while (ep < &reg_eliminate[NUM_ELIMINABLE_REGS] && ep->from == from);
+      if (! can_eliminate)
+       spill_hard_reg (from, 1);
+    }
 
 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
   if (frame_pointer_needed)