OSDN Git Service

(expand_call): Declare and set current_call_is_indirect.
[pf3gnuchains/gcc-fork.git] / gcc / reload1.c
index 1aa9d17..844a9e0 100644 (file)
@@ -1,5 +1,5 @@
 /* Reload pseudo regs into hard regs for insns that require hard regs.
-   Copyright (C) 1987, 1988, 1989, 1992 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1989, 1992, 1993 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -1680,14 +1680,21 @@ reload (first, global, dumpfile)
                  if (i == FIRST_PSEUDO_REGISTER)
                    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
                      {
+                       int k;
                        j = potential_reload_regs[i];
+                       /* Verify that J+1 is a potential reload reg.  */
+                       for (k = 0; k < FIRST_PSEUDO_REGISTER; k++)
+                         if (potential_reload_regs[k] == j + 1)
+                           break;
                        if (j >= 0 && j + 1 < FIRST_PSEUDO_REGISTER
+                           && k < FIRST_PSEUDO_REGISTER
                            && spill_reg_order[j] < 0 && spill_reg_order[j + 1] < 0
                            && TEST_HARD_REG_BIT (reg_class_contents[class], j)
                            && TEST_HARD_REG_BIT (reg_class_contents[class], j + 1)
                            && HARD_REGNO_MODE_OK (j, group_mode[class])
                            && ! TEST_HARD_REG_BIT (counted_for_nongroups,
-                                                   j + 1))
+                                                   j + 1)
+                           && ! TEST_HARD_REG_BIT (bad_spill_regs, j + 1))
                          break;
                      }
 
@@ -2734,10 +2741,17 @@ eliminate_regs (x, mem_mode, insn)
       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        if (ep->to_rtx == XEXP (x, 0))
          {
+           int size = GET_MODE_SIZE (mem_mode);
+
+           /* If more bytes than MEM_MODE are pushed, account for them.  */
+#ifdef PUSH_ROUNDING
+           if (ep->to_rtx == stack_pointer_rtx)
+             size = PUSH_ROUNDING (size);
+#endif
            if (code == PRE_DEC || code == POST_DEC)
-             ep->offset += GET_MODE_SIZE (mem_mode);
+             ep->offset += size;
            else
-             ep->offset -= GET_MODE_SIZE (mem_mode);
+             ep->offset -= size;
          }
 
       /* Fall through to generic unary operation case.  */