diff options
author | Jan Hubicka <jh@suse.cz> | 2000-01-06 14:03:58 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2000-01-06 13:03:58 +0000 |
commit | 3040ffd65141f584f2f1801ea79b5f77951ee276 (patch) | |
tree | 3cfe44a5fdf95ca0e24c5a2920c44035ffb06f08 /gcc/reg-stack.c | |
parent | 4cf962a2b4db3f712fdbc2c6d0d0a1def88c2e40 (diff) | |
download | gcc-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.c | 18 |
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: |