diff options
author | Jan Hubicka <jh@suse.cz> | 2002-01-05 01:36:26 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2002-01-05 00:36:26 +0000 |
commit | 9f16e871d3cde2e2b027c9b8e3a6f5045e8fb349 (patch) | |
tree | 074f5987c3c005954ed0b46a1711c9014750dac9 /gcc | |
parent | 302d2f14391b84764e1338d9c4aa51b7a1e4637a (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/Makefile.in | 2 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 31 |
3 files changed, 33 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bee90a4..5d0a8f9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Sat Jan 5 01:35:29 CET 2002 Jan Hubicka <jh@suse.cz> + + * cfgcleanup.c: Include tm_p.h + (mark_effect): Fix handling of hard register; fix handling of SET + 2002-01-04 Kazu Hirata <kazu@hxi.com> * config/h8300/h8300.md (anonymous patterns): Check that diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 2fa38d7..ce5307d 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1477,7 +1477,7 @@ cfgbuild.o : cfgbuild.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) flags.h insn-config.h \ function.h except.h $(GGC_H) cfgcleanup.o : cfgcleanup.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TIMEVAR_H)\ $(BASIC_BLOCK_H) hard-reg-set.h output.h flags.h $(RECOG_H) toplev.h \ - $(GGC_H) insn-config.h cselib.h + $(GGC_H) insn-config.h cselib.h $(TM_P_H) cfgloop.o : cfgloop.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) \ $(BASIC_BLOCK_H) hard-reg-set.h dominance.o : dominance.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) hard-reg-set.h \ 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)) |