Fix suboptimal code generation bug in reload
authorBernd Schmidt <bernds@cygnus.co.uk>
Wed, 12 Jan 2000 12:40:49 +0000 (12:40 +0000)
committerBernd Schmidt <crux@gcc.gnu.org>
Wed, 12 Jan 2000 12:40:49 +0000 (12:40 +0000)
From-SVN: r31352

gcc/ChangeLog
gcc/reload1.c

index 0edd42dbd652d3962f5527f160aacee771d3ab32..a585836e5943a918c96b280797836fbb9f67b7d4 100644 (file)
@@ -1,3 +1,11 @@
+2000-01-12  Bernd Schmidt  <bernds@cygnus.co.uk>
+
+       * reload1.c (reload_reg_unavailable): New static variable.
+       (reload_reg_free_p): Test it.
+       (reload_reg_free_for_value_p): Test it instead of
+       reload_reg_used.
+       (choose_reload_regs_init): Compute it.
+
 Wed Jan 12 03:24:41 2000  Toshiyasu Morita (toshi.morita@sega.com)
 
        * reorg.c (fill_slots_from_thread): Check modified_in_p
index d817f0f382ecaeaebbb21cab2c4f77a0ec6ce6cc..2245e9f2f169d5635c53afba56163a5b46242f21 100644 (file)
@@ -3990,6 +3990,8 @@ forget_old_reloads_1 (x, ignored, data)
 /* The following HARD_REG_SETs indicate when each hard register is
    used for a reload of various parts of the current insn.  */
 
+/* If reg is unavailable for all reloads.  */
+static HARD_REG_SET reload_reg_unavailable;
 /* If reg is in use as a reload reg for a RELOAD_OTHER reload.  */
 static HARD_REG_SET reload_reg_used;
 /* If reg is in use for a RELOAD_FOR_INPUT_ADDRESS reload for operand I.  */
@@ -4213,7 +4215,8 @@ reload_reg_free_p (regno, opnum, type)
   int i;
 
   /* In use for a RELOAD_OTHER means it's not available for anything.  */
-  if (TEST_HARD_REG_BIT (reload_reg_used, regno))
+  if (TEST_HARD_REG_BIT (reload_reg_used, regno)
+      || TEST_HARD_REG_BIT (reload_reg_unavailable, regno))
     return 0;
 
   switch (type)
@@ -4617,11 +4620,7 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum,
   int i;
   int copy = 0;
 
-  /* ??? reload_reg_used is abused to hold the registers that are not
-     available as spill registers, including hard registers that are
-     earlyclobbered in asms.  As a temporary measure, reject anything
-     in reload_reg_used.  */
-  if (TEST_HARD_REG_BIT (reload_reg_used, regno))
+  if (TEST_HARD_REG_BIT (reload_reg_unavailable, regno))
     return 0;
 
   if (out == const0_rtx)
@@ -5064,7 +5063,7 @@ choose_reload_regs_init (chain, save_reload_reg_rtx)
       CLEAR_HARD_REG_SET (reload_reg_used_in_outaddr_addr[i]);
     }
 
-  IOR_COMPL_HARD_REG_SET (reload_reg_used, chain->used_spill_regs);
+  COMPL_HARD_REG_SET (reload_reg_unavailable, chain->used_spill_regs);
 
   CLEAR_HARD_REG_SET (reload_reg_used_for_inherit);