aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-09-26 17:28:20 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-09-26 17:28:20 -0700
commit03a626729b5a74fac41ff004d4df85b58d255492 (patch)
tree9147409c450eebfa8fb9dcf10bc9017909163274
parenta7215b32249d0936b0ebf1ab8b4176e6a55ceb24 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/emit-rtl.c33
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