------- Comment #8 from zadeck at naturalbridge dot com  2007-06-23 15:55 
-------
Subject: Re:  [4.3 Regression] MIPS: FAIL in gcc.dg/cleanup-[8|9|10|11].c

This patch changes dce:deletable_insn_p so that it looks at all of the
top level
clauses in a parallel to make it's decision.  It was not keeping insns
that had a top level USE or UNSPEC if they were inside of parallels.

This should fix pr32437 and perhaps other things. 

The patch has only been tested on ppc and x86-64.  It is harmless on
those platforms.
It is likely to make a difference on pa-risc and mips where there are
parallels that contain top level unspecs. 

Ok to commit?

Kenny



2007-06-23  Kenneth Zadeck <[EMAIL PROTECTED]>

    PR middle-end/32437
    *dce.c (deletable_insn_p): Add extra parameter and recurse if insn
    is a PARALLEL.
    (prescan_insns_for_dce): Add extra parameter.


Index: dce.c
===================================================================
--- dce.c       (revision 125971)
+++ dce.c       (working copy)
@@ -58,15 +58,14 @@ static bitmap_obstack dce_tmp_bitmap_obs

 static sbitmap marked = NULL;

-/* Return true if INSN a normal instruction that can be deleted by the
-   DCE pass.  */
+/* Return true if INSN with BODY is a normal instruction that can be
+   deleted by the DCE pass.  */

 static bool
-deletable_insn_p (rtx insn, bool fast)
+deletable_insn_p (rtx insn, rtx body, bool fast)
 {
   rtx x;
-
-  switch (GET_CODE (PATTERN (insn)))
+  switch (GET_CODE (body))
     {
     case USE:
     case PREFETCH:
@@ -86,7 +85,7 @@ deletable_insn_p (rtx insn, bool fast)
          /* A CLOBBER of a dead pseudo register serves no purpose.
             That is not necessarily true for hard registers until
             after reload.  */
-         x = XEXP (PATTERN (insn), 0);
+         x = XEXP (body, 0);
          return REG_P (x) && (!HARD_REGISTER_P (x) || reload_completed);
        }
       else 
@@ -95,14 +94,23 @@ deletable_insn_p (rtx insn, bool fast)
           never be the target of a use-def chain.  */
        return false;

+    case PARALLEL:
+      {
+       int i;
+       for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
+         if (!deletable_insn_p (insn, XVECEXP (body, 0, i), fast))
+           return false;
+       return true;
+      }
+
     default:
       if (!NONJUMP_INSN_P (insn))
        return false;

-      if (volatile_insn_p (PATTERN (insn)))
+      if (volatile_insn_p (body))
        return false;

-      if (flag_non_call_exceptions && may_trap_p (PATTERN (insn)))
+      if (flag_non_call_exceptions && may_trap_p (body))
        return false;

       return true;
@@ -361,7 +369,7 @@ prescan_insns_for_dce (bool fast)
         rtx note = find_reg_note (insn, REG_LIBCALL_ID, NULL_RTX);
         if (note)
           mark_libcall (insn, fast);
-        else if (deletable_insn_p (insn, fast))
+        else if (deletable_insn_p (insn, PATTERN (insn), fast))
           mark_nonreg_stores (PATTERN (insn), insn, fast);
         else
           mark_insn (insn, fast);


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32437

Reply via email to