From 03a626729b5a74fac41ff004d4df85b58d255492 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 26 Sep 2002 17:28:20 -0700 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/emit-rtl.c | 33 ++++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2458c15c5ae..5638d5db783 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-09-26 Richard Henderson + + * 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 * doloop.c (doloop_modify_runtime ): Adjust diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index a5a776041aa..ccd6cbad0aa 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 -- 2.30.2