OSDN Git Service

Patch for asm clobber of fp.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 20 Dec 2003 02:39:43 +0000 (02:39 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 20 Dec 2003 02:39:43 +0000 (02:39 +0000)
* flow.c (mark_set_regs, case PARALLEL): Scan loop forwards.
Add case for ASM_OPERANDS.
* global.c (global_alloc): Set regs_ever_live for regs_asm_clobbered
registers.

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

gcc/ChangeLog
gcc/flow.c
gcc/global.c

index 5528fd7..eea65d3 100644 (file)
@@ -1,3 +1,10 @@
+2003-12-19  James E Wilson  <wilson@specifixinc.com>
+
+       * flow.c (mark_set_regs, case PARALLEL): Scan loop forwards.
+       Add case for ASM_OPERANDS.
+       * global.c (global_alloc): Set regs_ever_live for regs_asm_clobbered
+       registers.
+
 2003-12-19  Kazu Hirata  <kazu@cs.umass.edu>
 
        * expr.c (check_max_integer_computation_mode): Remove.
index 023fb1c..c146310 100644 (file)
@@ -2468,7 +2468,9 @@ mark_set_regs (struct propagate_block_info *pbi, rtx x, rtx insn)
       {
        int i;
 
-       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
+       /* We must scan forwards.  If we have an asm, we need to set
+          the PROP_ASM_SCAN flag before scanning the clobbers.  */
+       for (i = 0; i < XVECLEN (x, 0); i++)
          {
            rtx sub = XVECEXP (x, 0, i);
            switch (code = GET_CODE (sub))
@@ -2495,6 +2497,10 @@ mark_set_regs (struct propagate_block_info *pbi, rtx x, rtx insn)
                mark_set_1 (pbi, code, SET_DEST (sub), cond, insn, flags);
                break;
 
+             case ASM_OPERANDS:
+               flags |= PROP_ASM_SCAN;
+               break;
+
              default:
                break;
              }
index d19e87e..de765b3 100644 (file)
@@ -355,6 +355,8 @@ global_alloc (FILE *file)
       else if (cannot_elim)
        error ("%s cannot be used in asm here",
               reg_names[eliminables[i].from]);
+      else
+       regs_ever_live[eliminables[i].from] = 1;
     }
 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
   if (!regs_asm_clobbered[HARD_FRAME_POINTER_REGNUM])
@@ -366,6 +368,8 @@ global_alloc (FILE *file)
   else if (need_fp)
     error ("%s cannot be used in asm here",
           reg_names[HARD_FRAME_POINTER_REGNUM]);
+  else
+    regs_ever_live[HARD_FRAME_POINTER_REGNUM] = 1;
 #endif
 
 #else
@@ -377,6 +381,8 @@ global_alloc (FILE *file)
     }
   else if (need_fp)
     error ("%s cannot be used in asm here", reg_names[FRAME_POINTER_REGNUM]);
+  else
+    regs_ever_live[FRAME_POINTER_REGNUM] = 1;
 #endif
 
   /* Track which registers have already been used.  Start with registers