diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-12-05 07:58:18 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-12-05 07:58:18 +0000 |
commit | 46b51ffcc3256b89da9ad11d4e2a9d66ce78bc05 (patch) | |
tree | 954cdaa896e51c920dda107800c6236e82eb6186 /gcc/flow.c | |
parent | 2319409ba76a088f1a32e0050a595f2481a4fe31 (diff) | |
download | gcc-46b51ffcc3256b89da9ad11d4e2a9d66ce78bc05.tar.gz |
* flow.c (calculate_global_regs_live): Only force stack pointer
live before reload. Force pic register live before reload.
(insn_dead_p): Don't protect pic references from deletion.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38027 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/flow.c')
-rw-r--r-- | gcc/flow.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/gcc/flow.c b/gcc/flow.c index 4aacbf8413e..1e51d20038b 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -3368,15 +3368,32 @@ calculate_global_regs_live (blocks_in, blocks_out, flags) IOR_REG_SET (new_live_at_end, sb->global_live_at_start); } - /* Force the stack pointer to be live -- which might not already be - the case for blocks within infinite loops. */ - SET_REGNO_REG_SET (new_live_at_end, STACK_POINTER_REGNUM); - - /* Similarly for the frame pointer before reload. Any reference - to any pseudo before reload is a potential reference of the - frame pointer. */ + /* Before reload, there are a few registers that must be forced + live everywhere -- which might not already be the case for + blocks within infinite loops. */ if (! reload_completed) - SET_REGNO_REG_SET (new_live_at_end, FRAME_POINTER_REGNUM); + { + /* The all-important stack pointer. */ + SET_REGNO_REG_SET (new_live_at_end, STACK_POINTER_REGNUM); + + /* Any reference to any pseudo before reload is a potential + reference of the frame pointer. */ + SET_REGNO_REG_SET (new_live_at_end, FRAME_POINTER_REGNUM); + +#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM + /* Pseudos with argument area equivalences may require + reloading via the argument pointer. */ + if (fixed_regs[ARG_POINTER_REGNUM]) + SET_REGNO_REG_SET (new_live_at_end, ARG_POINTER_REGNUM); +#endif + +#ifdef PIC_OFFSET_TABLE_REGNUM + /* Any constant, or pseudo with constant equivalences, may + require reloading from memory using the pic register. */ + if (fixed_regs[PIC_OFFSET_TABLE_REGNUM]) + SET_REGNO_REG_SET (new_live_at_end, PIC_OFFSET_TABLE_REGNUM); +#endif + } /* Regs used in phi nodes are not included in global_live_at_start, since they are live only along a @@ -4219,6 +4236,10 @@ insn_dead_p (pbi, x, call_ok, notes) if (regno == STACK_POINTER_REGNUM) return 0; + /* ??? These bits might be redundant with the force live bits + in calculate_global_regs_live. We would delete from + sequential sets; whether this actually affects real code + for anything but the stack pointer I don't know. */ /* Make sure insns to set the frame pointer aren't deleted. */ if (regno == FRAME_POINTER_REGNUM && (! reload_completed || frame_pointer_needed)) @@ -4237,16 +4258,6 @@ insn_dead_p (pbi, x, call_ok, notes) return 0; #endif -#ifdef PIC_OFFSET_TABLE_REGNUM - /* Before reload, do not allow sets of the pic register - to be deleted. Reload can insert references to - constant pool memory anywhere in the function, making - the PIC register live where it wasn't before. */ - if (regno == PIC_OFFSET_TABLE_REGNUM && fixed_regs[regno] - && ! reload_completed) - return 0; -#endif - /* Otherwise, the set is dead. */ return 1; } |