aboutsummaryrefslogtreecommitdiff
path: root/gcc/reg-stack.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2000-01-06 14:03:58 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2000-01-06 13:03:58 +0000
commit3040ffd65141f584f2f1801ea79b5f77951ee276 (patch)
tree3cfe44a5fdf95ca0e24c5a2920c44035ffb06f08 /gcc/reg-stack.c
parent4cf962a2b4db3f712fdbc2c6d0d0a1def88c2e40 (diff)
downloadgcc-3040ffd65141f584f2f1801ea79b5f77951ee276.zip
gcc-3040ffd65141f584f2f1801ea79b5f77951ee276.tar.gz
gcc-3040ffd65141f584f2f1801ea79b5f77951ee276.tar.bz2
reg-stack.c (subst_stack_regs_pat): Handle correctly USEs of dead registers.
* reg-stack.c (subst_stack_regs_pat): Handle correctly USEs of dead registers. * i386.c (movsf splitter): Fix typo in my last checkin. From-SVN: r31256
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r--gcc/reg-stack.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index de4c75a..2e7fc64 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -1383,12 +1383,24 @@ subst_stack_regs_pat (insn, regstack, pat)
if (STACK_REG_P (*src)
&& find_regno_note (insn, REG_DEAD, REGNO (*src)))
{
- emit_pop_insn (insn, regstack, *src, EMIT_AFTER);
+ /* In stupid allocation the USE might be used to extend lifetime
+ of variable to given scope. This may end up as USE of dead
+ register. */
+ if (optimize || get_hard_regnum (regstack, *src) != -1)
+ emit_pop_insn (insn, regstack, *src, EMIT_AFTER);
return;
}
- /* ??? Uninitialized USE should not happen. */
else if (get_hard_regnum (regstack, *src) == -1)
- abort();
+ {
+ if (optimize)
+ abort();
+ if (GET_CODE (PATTERN (insn)) != USE)
+ abort();
+ PATTERN (insn) = gen_rtx_SET (GET_MODE (*src), *src,
+ CONST0_RTX (GET_MODE (*src)));
+ subst_stack_regs_pat (insn, regstack, PATTERN (insn));
+ return;
+ }
break;
case CLOBBER: