aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgcleanup.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2002-01-05 01:36:26 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2002-01-05 00:36:26 +0000
commit9f16e871d3cde2e2b027c9b8e3a6f5045e8fb349 (patch)
tree074f5987c3c005954ed0b46a1711c9014750dac9 /gcc/cfgcleanup.c
parent302d2f14391b84764e1338d9c4aa51b7a1e4637a (diff)
downloadgcc-9f16e871d3cde2e2b027c9b8e3a6f5045e8fb349.zip
gcc-9f16e871d3cde2e2b027c9b8e3a6f5045e8fb349.tar.gz
gcc-9f16e871d3cde2e2b027c9b8e3a6f5045e8fb349.tar.bz2
cfgcleanup.c: Include tm_p.h
* cfgcleanup.c: Include tm_p.h (mark_effect): Fix handling of hard register; fix handling of SET From-SVN: r48553
Diffstat (limited to 'gcc/cfgcleanup.c')
-rw-r--r--gcc/cfgcleanup.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 9803032..0a111a5 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -43,6 +43,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "recog.h"
#include "toplev.h"
#include "cselib.h"
+#include "tm_p.h"
#include "obstack.h"
@@ -192,21 +193,43 @@ mark_effect (exp, nonequal)
rtx exp;
regset nonequal;
{
+ int regno;
+ rtx dest;
switch (GET_CODE (exp))
{
/* In case we do clobber the register, mark it as equal, as we know the
value is dead so it don't have to match. */
case CLOBBER:
if (REG_P (XEXP (exp, 0)))
- CLEAR_REGNO_REG_SET (nonequal, REGNO (XEXP (exp, 0)));
+ {
+ dest = XEXP (exp, 0);
+ regno = REGNO (dest);
+ CLEAR_REGNO_REG_SET (nonequal, regno);
+ if (regno < FIRST_PSEUDO_REGISTER)
+ {
+ int n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
+ while (--n > 0)
+ CLEAR_REGNO_REG_SET (nonequal, regno + n);
+ }
+ }
return false;
case SET:
if (rtx_equal_for_cselib_p (SET_DEST (exp), SET_SRC (exp)))
return false;
- if (GET_CODE (SET_SRC (exp)) != REG)
+ dest = SET_DEST (exp);
+ if (dest == pc_rtx)
+ return false;
+ if (!REG_P (dest))
return true;
- SET_REGNO_REG_SET (nonequal, REGNO (SET_SRC (exp)));
+ regno = REGNO (dest);
+ SET_REGNO_REG_SET (nonequal, regno);
+ if (regno < FIRST_PSEUDO_REGISTER)
+ {
+ int n = HARD_REGNO_NREGS (regno, GET_MODE (dest));
+ while (--n > 0)
+ SET_REGNO_REG_SET (nonequal, regno + n);
+ }
return false;
default:
@@ -292,7 +315,7 @@ thread_jump (mode, e, b)
processing as if it were same basic block.
Our goal is to prove that whole block is an NOOP. */
- for (insn = NEXT_INSN (b->head); insn != b->end && !failed;
+ for (insn = NEXT_INSN (b->head); insn != NEXT_INSN (b->end) && !failed;
insn = NEXT_INSN (insn))
{
if (INSN_P (insn))