aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.md2
-rw-r--r--gcc/reg-stack.c18
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: