mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-12 10:00:17 +08:00
Makefile.in (flow.o): Depend on $(EXPR_H).
* 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. From-SVN: r31620
This commit is contained in:
parent
1a588ad752
commit
7554ad67e5
@ -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.
|
||||
|
@ -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
|
||||
|
42
gcc/flow.c
42
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 ();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user