From 655ee98ed1239f4c9fb067ae0b52ed1691451597 Mon Sep 17 00:00:00 2001 From: rth Date: Wed, 26 Jan 2000 00:54:44 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31620 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/Makefile.in | 2 +- gcc/flow.c | 42 +++++++++++++++++++----------------------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f3c6842..f14165a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2000-01-25 Richard Henderson + + * 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 * loop.c (current_loop_info): Delete. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index f6ac12a..fdf800a 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -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 diff --git a/gcc/flow.c b/gcc/flow.c index 2e4b666..bee21d2 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -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 (); } } -- 2.7.4