cfgcleanup.c: Include tm_p.h
authorJan Hubicka <jh@suse.cz>
Sat, 5 Jan 2002 00:36:26 +0000 (01:36 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 5 Jan 2002 00:36:26 +0000 (00:36 +0000)
* cfgcleanup.c: Include tm_p.h
(mark_effect): Fix handling of hard register; fix handling of SET

From-SVN: r48553

gcc/ChangeLog
gcc/Makefile.in
gcc/cfgcleanup.c

index bee90a48db61f1ab73db58a3f7c0cc70d88e4d2c..5d0a8f93c74008e856d48692dafe1378a2b74144 100644 (file)
@@ -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
index 2fa38d7a9586c54edf1c1ee011503cfcfb171dbe..ce5307de7901e7ba33027b00028afb2481b5f245 100644 (file)
@@ -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 \
index 98030325f294b62f7620f8a6c31ea6e62431595f..0a111a513b98e1e7a013faab19fd2ec767346aae 100644 (file)
@@ -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))