diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 2 | ||||
-rw-r--r-- | gcc/reg-stack.c | 18 |
3 files changed, 23 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b345602..271ae69 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Thu Jan 6 13:44:59 CET 2000 Jan Hubicka <jh@suse.cz> + + * reg-stack.c (subst_stack_regs_pat): Handle correctly USEs of + dead registers. + + * i386.c (movsf splitter): Fix typo in my last checkin. + 2000-01-05 Nick Clifton <nickc@cygnus.com> * varasm.c (IN_NAMED_SECTION): Allow targets to provide their diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 3addccb..f9316de 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -1788,7 +1788,7 @@ [(set_attr "type" "fmov,fmov,fmov,imov,imov")]) (define_split - [(set (match_operand:SF 0 "general_operand" "") + [(set (match_operand:SF 0 "nonimmediate_operand" "") (match_operand:SF 1 "memory_operand" ""))] "reload_completed && GET_CODE (operands[1]) == MEM 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: |