This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Bug target/32437] [4.3 Regression] MIPS: FAIL in gcc.dg/cleanup-[8|9|10|11].c


Kenneth Zadeck <zadeck@naturalbridge.com> writes:
> 2007-06-23  Kenneth Zadeck <zadeck@naturalbridge.com>
>
>     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.

Kenny found that this patch introduced problems on x86 (I think it was)
because it applied the special handling for bare CLOBBERs to those
inside PARALLELs as well.  We don't want that; bare USEs and CLOBBERs
are special DF markers, but USEs and CLOBBERs inside PARALLELs are parts
of asms or define_insns.

Kenny pre-approved the patch below.  Bootstrapped & regression-tested
on x86_64-linux-gnu.  Applied to mainline.

Richard


gcc/
	* dce.c (deletable_insn_p_1): New function, split out from...
	(deletable_insn_p): ...here.  Only treat bare USEs and CLOBBERs
	specially, not those inside PARALLELs.  Remove BODY argument
	and adjust recursive call accordingly.
	(prescan_insns_for_dce): Update call to delete_insn_p.

Index: gcc/dce.c
===================================================================
--- gcc/dce.c	(revision 126053)
+++ gcc/dce.c	(working copy)
@@ -58,16 +58,15 @@ static VEC(rtx,heap) *worklist;
 
 static sbitmap marked = NULL;
 
-/* Return true if INSN with BODY is a normal instruction that can be
-   deleted by the DCE pass.  */
+/* A subroutine for which BODY is part of the instruction being tested;
+   either the top-level pattern, or an element of a PARALLEL.  The
+   instruction is known not to be a bare USE or CLOBBER.  */
 
 static bool
-deletable_insn_p (rtx insn, rtx body, bool fast)
+deletable_insn_p_1 (rtx body)
 {
-  rtx x;
   switch (GET_CODE (body))
     {
-    case USE:
     case PREFETCH:
     case TRAP_IF:
       /* The UNSPEC case was added here because the ia-64 claims that
@@ -79,6 +78,35 @@ deletable_insn_p (rtx insn, rtx body, bo
     case UNSPEC:
       return false;
 
+    default:
+      if (volatile_insn_p (body))
+	return false;
+
+      if (flag_non_call_exceptions && may_trap_p (body))
+	return false;
+
+      return true;
+    }
+}
+
+/* Return true if INSN is a normal instruction that can be deleted by
+   the DCE pass.  */
+
+static bool
+deletable_insn_p (rtx insn, bool fast)
+{
+  rtx body, x;
+  int i;
+
+  if (!NONJUMP_INSN_P (insn))
+    return false;
+
+  body = PATTERN (insn);
+  switch (GET_CODE (body))
+    {
+    case USE:
+      return false;
+
     case CLOBBER:
       if (fast)
 	{
@@ -88,32 +116,20 @@ deletable_insn_p (rtx insn, rtx body, bo
 	  x = XEXP (body, 0);
 	  return REG_P (x) && (!HARD_REGISTER_P (x) || reload_completed);
 	}
-      else 
+      else
 	/* Because of the way that use-def chains are built, it is not
 	   possible to tell if the clobber is dead because it can
 	   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;
-      }
+      for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
+	if (!deletable_insn_p_1 (XVECEXP (body, 0, i)))
+	  return false;
+      return true;
 
     default:
-      if (!NONJUMP_INSN_P (insn))
-	return false;
-
-      if (volatile_insn_p (body))
-	return false;
-
-      if (flag_non_call_exceptions && may_trap_p (body))
-	return false;
-
-      return true;
+      return deletable_insn_p_1 (body);
     }
 }
 
@@ -369,7 +385,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, PATTERN (insn), fast))
+        else if (deletable_insn_p (insn, fast))
           mark_nonreg_stores (PATTERN (insn), insn, fast);
         else
           mark_insn (insn, fast);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]