* reload.h (earlyclobber_operand_p): Declare.
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Oct 1999 02:14:12 +0000 (02:14 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Oct 1999 02:14:12 +0000 (02:14 +0000)
* reload.c (earlyclobber_operand_p): Don't declare.  No longer static.
* reload1.c (reload_reg_free_for_value_p):  RELOAD_OTHER reloads with
an earlyclobbered output conflict with RELOAD_INPUT reloads - handle
case where the RELOAD_OTHER reload is new.  Use earlyclobber_operand_p.

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

gcc/ChangeLog
gcc/reload.c
gcc/reload.h
gcc/reload1.c

index 6614d8b..bbec9cf 100644 (file)
@@ -1,3 +1,11 @@
+Wed Oct 27 03:09:23 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * reload.h (earlyclobber_operand_p): Declare.
+       * reload.c (earlyclobber_operand_p): Don't declare.  No longer static.
+       * reload1.c (reload_reg_free_for_value_p):  RELOAD_OTHER reloads with
+       an earlyclobbered output conflict with RELOAD_INPUT reloads - handle
+       case where the RELOAD_OTHER reload is new.  Use earlyclobber_operand_p.
+
 Tue Oct 26 18:23:38 1999  Jan Hubicka  <hubicka@freesoft.cz>
                          Richard Henderson  <rth@cygnus.com>
 
index bd32ba3..4010339 100644 (file)
@@ -252,7 +252,6 @@ static int find_reusable_reload     PROTO((rtx *, rtx, enum reg_class,
 static rtx find_dummy_reload   PROTO((rtx, rtx, rtx *, rtx *,
                                       enum machine_mode, enum machine_mode,
                                       enum reg_class, int, int));
-static int earlyclobber_operand_p PROTO((rtx));
 static int hard_reg_set_here_p PROTO((int, int, rtx));
 static struct decomposition decompose PROTO((rtx));
 static int immune_p            PROTO((rtx, rtx, struct decomposition));
@@ -1921,7 +1920,7 @@ find_dummy_reload (real_in, real_out, inloc, outloc,
 
 /* Return 1 if X is an operand of an insn that is being earlyclobbered.  */
 
-static int
+int
 earlyclobber_operand_p (x)
      rtx x;
 {
index c07515f..953e059 100644 (file)
@@ -354,6 +354,9 @@ extern rtx find_equiv_reg PROTO((rtx, rtx, enum reg_class, int, short *,
 /* Return 1 if register REGNO is the subject of a clobber in insn INSN.  */
 extern int regno_clobbered_p PROTO((int, rtx));
 
+/* Return 1 if X is an operand of an insn that is being earlyclobbered.  */
+int earlyclobber_operand_p PROTO((rtx));
+
 /* Functions in reload1.c:  */
 
 extern int reloads_conflict            PROTO ((int, int));
index 0528860..955acca 100644 (file)
@@ -5291,6 +5291,10 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum,
      int ignore_address_reloads;
 {
   int time1;
+  /* Set if we see an input reload that must not share its reload register
+     with any new earlyclobber, but might otherwise share the reload
+     register with an output or input-output reload.  */
+  int check_earlyclobber = 0;
   int i;
   int copy = 0;
 
@@ -5372,7 +5376,7 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum,
          if (! rld[i].in || ! rtx_equal_p (rld[i].in, value)
              || rld[i].out || out)
            {
-             int j, time2;
+             int time2;
              switch (rld[i].when_needed)
                {
                case RELOAD_FOR_OTHER_ADDRESS:
@@ -5411,6 +5415,7 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum,
                  break;
                case RELOAD_FOR_INPUT:
                  time2 = rld[i].opnum * 4 + 4;
+                 check_earlyclobber = 1;
                  break;
                  /* rld[i].opnum * 4 + 4 <= (MAX_RECOG_OPERAND - 1) * 4 + 4
                     == MAX_RECOG_OPERAND * 4  */
@@ -5423,6 +5428,7 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum,
                  break;
                case RELOAD_FOR_OPERAND_ADDRESS:
                  time2 = MAX_RECOG_OPERANDS * 4 + 2;
+                 check_earlyclobber = 1;
                  break;
                case RELOAD_FOR_INSN:
                  time2 = MAX_RECOG_OPERANDS * 4 + 3;
@@ -5452,9 +5458,8 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum,
                    {
                      time2 = MAX_RECOG_OPERANDS * 4 + 4;
                      /* Earlyclobbered outputs must conflict with inputs.  */
-                     for (j = 0; j < n_earlyclobbers; j++)
-                       if (rld[i].out == reload_earlyclobbers[j])
-                         time2 = MAX_RECOG_OPERANDS * 4 + 3;
+                     if (earlyclobber_operand_p (rld[i].out))
+                       time2 = MAX_RECOG_OPERANDS * 4 + 3;
                          
                      break;
                    }
@@ -5478,6 +5483,11 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum,
            }
        }
     }
+
+  /* Earlyclobbered outputs must conflict with inputs.  */
+  if (check_earlyclobber && out && earlyclobber_operand_p (out))
+    return 0;
+
   return 1;
 }