OSDN Git Service

* pa.c (following_call): Fail if the CALL_INSN is an indirect
[pf3gnuchains/gcc-fork.git] / gcc / stupid.c
index 6f10025..b68b196 100644 (file)
@@ -1,5 +1,5 @@
 /* Dummy data flow analysis for GNU compiler in nonoptimizing mode.
-   Copyright (C) 1987, 1991, 1994, 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1987, 91, 94, 95, 96, 1997 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -179,13 +179,11 @@ stupid_life_analysis (f, nregs, file)
   regs_crosses_setjmp = (char *) alloca (nregs * sizeof (char));
   bzero ((char *) regs_crosses_setjmp, nregs * sizeof (char));
 
-  reg_renumber = (short *) oballoc (nregs * sizeof (short));
+  /* Allocate the reg_renumber array */
+  allocate_reg_info (max_regno, FALSE, TRUE);
   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
     reg_renumber[i] = i;
 
-  for (i = FIRST_VIRTUAL_REGISTER; i < max_regno; i++)
-    reg_renumber[i] = -1;
-
   after_insn_hard_regs
     = (HARD_REG_SET *) alloca (max_suid * sizeof (HARD_REG_SET));
 
@@ -197,7 +195,7 @@ stupid_life_analysis (f, nregs, file)
   allocate_for_life_analysis ();
 
   for (i = 0; i < max_regno; i++)
-    reg_n_deaths[i] = 1;
+    REG_N_DEATHS (i) = 1;
 
   bzero (regs_live, nregs);
 
@@ -277,7 +275,7 @@ stupid_life_analysis (f, nregs, file)
 
       /* Now find the best hard-register class for this pseudo register */
       if (N_REG_CLASSES > 1)
-       reg_renumber[r] = stupid_find_reg (reg_n_calls_crossed[r]
+       reg_renumber[r] = stupid_find_reg (REG_N_CALLS_CROSSED (r)
                                           reg_preferred_class (r),
                                           PSEUDO_REGNO_MODE (r),
                                           reg_where_born[r],
@@ -286,7 +284,7 @@ stupid_life_analysis (f, nregs, file)
 
       /* If no reg available in that class, try alternate class.  */
       if (reg_renumber[r] == -1 && reg_alternate_class (r) != NO_REGS)
-       reg_renumber[r] = stupid_find_reg (reg_n_calls_crossed[r],
+       reg_renumber[r] = stupid_find_reg (REG_N_CALLS_CROSSED (r),
                                           reg_alternate_class (r),
                                           PSEUDO_REGNO_MODE (r),
                                           reg_where_born[r],
@@ -315,7 +313,7 @@ stupid_reg_compare (r1p, r2p)
   if (tem != 0)
     return tem;
 
-  tem = reg_n_refs[r1] - reg_n_refs[r2];
+  tem = REG_N_REFS (r1) - REG_N_REFS (r2);
   if (tem != 0)
     return tem;
 
@@ -509,13 +507,26 @@ stupid_mark_refs (x, insn)
                }
 
              /* Count the refs of this reg.  */
-             reg_n_refs[regno]++;
+             REG_N_REFS (regno)++;
 
              if (last_call_suid < reg_where_dead[regno])
-               reg_n_calls_crossed[regno] += 1;
+               REG_N_CALLS_CROSSED (regno) += 1;
 
              if (last_setjmp_suid < reg_where_dead[regno])
                regs_crosses_setjmp[regno] = 1;
+
+             /* If this register is only used in this insn and is only
+                set, mark it unused.  We have to do this even when not 
+                optimizing so that MD patterns which count on this
+                behavior (e.g., it not causing an output reload on
+                an insn setting CC) will operate correctly.  */
+             if (GET_CODE (SET_DEST (x)) == REG
+                 && REGNO_FIRST_UID (regno) == INSN_UID (insn)
+                 && REGNO_LAST_UID (regno) == INSN_UID (insn)
+                 && (code == CLOBBER || ! reg_mentioned_p (SET_DEST (x),
+                                                           SET_SRC (x))))
+               REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_UNUSED,
+                                           SET_DEST (x), REG_NOTES (insn));
            }
        }
 
@@ -560,7 +571,7 @@ stupid_mark_refs (x, insn)
          /* Pseudo reg: record first use, last use and number of uses.  */
 
          reg_where_born[regno] = INSN_SUID (insn);
-         reg_n_refs[regno]++;
+         REG_N_REFS (regno)++;
          if (regs_live[regno] == 0)
            {
              regs_live[regno] = 1;