OSDN Git Service

* Makefile.in (flow.o): Depend on $(EXPR_H).
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Jan 2000 00:54:44 +0000 (00:54 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Jan 2000 00:54:44 +0000 (00:54 +0000)
        * flow.c (mark_regs_live_at_end): Use hard_function_value, i.e.
        duplicate the structure of diddle_return_value for keeping regs live.

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

gcc/ChangeLog
gcc/Makefile.in
gcc/flow.c

index f3c6842..f14165a 100644 (file)
@@ -1,3 +1,9 @@
+2000-01-25  Richard Henderson  <rth@cygnus.com>
+
+       * Makefile.in (flow.o): Depend on $(EXPR_H).
+       * flow.c (mark_regs_live_at_end): Use hard_function_value, i.e.
+       duplicate the structure of diddle_return_value for keeping regs live.
+
 2000-01-26  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
 
        * loop.c (current_loop_info): Delete.
index f6ac12a..fdf800a 100644 (file)
@@ -1573,7 +1573,7 @@ unroll.o : unroll.c $(CONFIG_H) system.h $(RTL_H) insn-config.h function.h \
    varray.h 
 flow.o : flow.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h insn-config.h \
    $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h $(RECOG_H) \
-   insn-flags.h function.h except.h
+   insn-flags.h function.h except.h $(EXPR_H)
 combine.o : combine.c $(CONFIG_H) system.h $(RTL_H) flags.h function.h \
    insn-config.h insn-flags.h insn-codes.h insn-attr.h $(REGS_H) $(EXPR_H) \
    $(BASIC_BLOCK_H) $(RECOG_H) real.h hard-reg-set.h toplev.h
index 2e4b666..bee21d2 100644 (file)
@@ -133,6 +133,7 @@ Boston, MA 02111-1307, USA.  */
 #include "except.h"
 #include "toplev.h"
 #include "recog.h"
+#include "expr.h"
 #include "insn-flags.h"
 
 #include "obstack.h"
@@ -2782,7 +2783,8 @@ static void
 mark_regs_live_at_end (set)
      regset set;
 {
-  tree type;
+  tree return_decl, return_type;
+  rtx return_reg;
   int i;
 
   /* If exiting needs the right stack value, consider the stack pointer
@@ -2841,40 +2843,34 @@ mark_regs_live_at_end (set)
 
   /* Mark function return value.  */
 
-  type = TREE_TYPE (DECL_RESULT (current_function_decl));
-  if (type != void_type_node)
+  return_decl = DECL_RESULT (current_function_decl);
+  return_type = TREE_TYPE (return_decl);
+  return_reg = DECL_RTL (return_decl);
+  if (return_reg)
     {
-      rtx outgoing;
-
-      if (current_function_returns_struct
-         || current_function_returns_pcc_struct)
-       type = build_pointer_type (type);
-
-#ifdef FUNCTION_OUTGOING_VALUE
-      outgoing = FUNCTION_OUTGOING_VALUE (type, current_function_decl);
-#else
-      outgoing = FUNCTION_VALUE (type, current_function_decl);
-#endif
-
-      if (GET_CODE (outgoing) == REG)
-       mark_reg (set, outgoing);
-      else if (GET_CODE (outgoing) == PARALLEL)
+      if (GET_CODE (return_reg) == REG
+         && REGNO (return_reg) < FIRST_PSEUDO_REGISTER)
        {
-         int len = XVECLEN (outgoing, 0);
+         /* Use hard_function_value to avoid examining a BLKmode register.  */
+         return_reg
+           = hard_function_value (return_type, current_function_decl, 1);
+         mark_reg (set, return_reg);
+       }
+      else if (GET_CODE (return_reg) == PARALLEL)
+       {
+         int len = XVECLEN (return_reg, 0);
 
          /* Check for a NULL entry, used to indicate that the parameter
             goes on the stack and in registers.  */
-         i = (XEXP (XVECEXP (outgoing, 0, 0), 0) ? 0 : 1);
+         i = (XEXP (XVECEXP (return_reg, 0, 0), 0) ? 0 : 1);
 
          for ( ; i < len; ++i)
            {
-             rtx r = XVECEXP (outgoing, 0, i);
+             rtx r = XVECEXP (return_reg, 0, i);
              if (GET_CODE (r) == REG)
                mark_reg (set, r);
            }
        }
-      else
-       abort ();
     }
 }