This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Bug target/32437] [4.3 Regression] MIPS: FAIL in gcc.dg/cleanup-[8|9|10|11].c
- From: Richard Sandiford <richard at codesourcery dot com>
- To: Kenneth Zadeck <zadeck at naturalbridge dot com>
- Cc: Richard Guenther <richard dot guenther at gmail dot com>, gcc-bugzilla at gcc dot gnu dot org, "Bonzini, Paolo" <bonzini at gnu dot org>, "Park, Seongbae" <seongbae dot park at gmail dot com>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 27 Jun 2007 15:37:10 +0100
- Subject: Re: [Bug target/32437] [4.3 Regression] MIPS: FAIL in gcc.dg/cleanup-[8|9|10|11].c
- References: <bug-32437-7151@http.gcc.gnu.org/bugzilla/> <20070623021344.16771.qmail@sourceware.org> <467D4264.6090905@naturalbridge.com> <84fc9c000706230911v29c5ce81oba8d93bd370dbfae@mail.gmail.com> <467D48D6.2070508@naturalbridge.com>
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);