diff options
author | Richard Henderson <rth@redhat.com> | 2002-09-26 17:28:20 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-09-26 17:28:20 -0700 |
commit | 03a626729b5a74fac41ff004d4df85b58d255492 (patch) | |
tree | 9147409c450eebfa8fb9dcf10bc9017909163274 | |
parent | a7215b32249d0936b0ebf1ab8b4176e6a55ceb24 (diff) | |
download | gcc-03a626729b5a74fac41ff004d4df85b58d255492.zip gcc-03a626729b5a74fac41ff004d4df85b58d255492.tar.gz gcc-03a626729b5a74fac41ff004d4df85b58d255492.tar.bz2 |
emit-rtl.c (active_insn_p): Consider a clobber of the function return value to be active even after reload.
* emit-rtl.c (active_insn_p): Consider a clobber of the
function return value to be active even after reload.
From-SVN: r57561
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 33 |
2 files changed, 33 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2458c15..5638d5d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-09-26 Richard Henderson <rth@redhat.com> + + * emit-rtl.c (active_insn_p): Consider a clobber of the + function return value to be active even after reload. + 2002-09-27 Alan Modra <amodra@bigpond.net.au> * doloop.c (doloop_modify_runtime <biv skips initial incr>): Adjust diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index a5a7760..ccd6cba 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -3022,11 +3022,34 @@ int active_insn_p (insn) rtx insn; { - return (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN - || (GET_CODE (insn) == INSN - && (! reload_completed - || (GET_CODE (PATTERN (insn)) != USE - && GET_CODE (PATTERN (insn)) != CLOBBER)))); + if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN) + return true; + if (GET_CODE (insn) == INSN) + { + if (reload_completed) + { + rtx pat = PATTERN (insn); + + /* After reload, remaining USE insns are noops. */ + if (GET_CODE (pat) == USE) + return false; + + if (GET_CODE (pat) == CLOBBER) + { + /* ??? Don't skip past the clobber of the return register. + If we eliminate it, we risk a variety of life analysis + problems on broken code. */ + if (GET_CODE (XEXP (pat, 0)) == REG + && REG_FUNCTION_VALUE_P (XEXP (pat, 0))) + return true; + + /* Otherwise, clobbers don't do anything either. */ + return false; + } + } + return true; + } + return false; } rtx |