diff options
author | Richard Sandiford <richard@codesourcery.com> | 2007-07-01 14:43:47 +0000 |
---|---|---|
committer | Kenneth Zadeck <zadeck@gcc.gnu.org> | 2007-07-01 14:43:47 +0000 |
commit | d4d7f1d1bbe95e484a50e4f91ac5304a7bb47bdf (patch) | |
tree | 74b9e0733fd2a6c49106bf5dcecb82223287f19c /gcc/dce.c | |
parent | 7ee1ad848363ca30a254981b13b57d0746ed0dc1 (diff) | |
download | gcc-d4d7f1d1bbe95e484a50e4f91ac5304a7bb47bdf.zip gcc-d4d7f1d1bbe95e484a50e4f91ac5304a7bb47bdf.tar.gz gcc-d4d7f1d1bbe95e484a50e4f91ac5304a7bb47bdf.tar.bz2 |
[multiple changes]
2007-07-01 Richard Sandiford <richard@codesourcery.com>
Unreverting Richard's Revert of:
2007-06-27 Richard Sandiford <richard@codesourcery.com>
* 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.
From-SVN: r126168
Diffstat (limited to 'gcc/dce.c')
-rw-r--r-- | gcc/dce.c | 64 |
1 files changed, 40 insertions, 24 deletions
@@ -58,16 +58,15 @@ static bitmap_obstack dce_tmp_bitmap_obstack; 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, bool fast) 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, bool fast) 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); |