diff options
author | zadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-01-16 13:41:11 +0000 |
---|---|---|
committer | zadeck <zadeck@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-01-16 13:41:11 +0000 |
commit | cff725a2a1be030221ff112cdaa2f9798f1252cc (patch) | |
tree | e9c6d1b1f501cbcbd1dc7656ea9f36030c76be75 /gcc/dce.c | |
parent | daaa06b2d0aebedfc7e77a4aaaf51d67ae6aa973 (diff) | |
download | gcc-cff725a2a1be030221ff112cdaa2f9798f1252cc.tar.gz |
2009-01-16 Kenneth Zadeck <zadeck@naturalbridge.com>
* dce.c (delete_unmarked_insns): Reversed the order that insns are
examined before deleting them.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143433 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dce.c')
-rw-r--r-- | gcc/dce.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/gcc/dce.c b/gcc/dce.c index 5a64fb2ecf8..f6a10d6197e 100644 --- a/gcc/dce.c +++ b/gcc/dce.c @@ -510,8 +510,8 @@ delete_unmarked_insns (void) rtx insn, next; bool must_clean = false; - FOR_EACH_BB (bb) - FOR_BB_INSNS_SAFE (bb, insn, next) + FOR_EACH_BB_REVERSE (bb) + FOR_BB_INSNS_REVERSE_SAFE (bb, insn, next) if (INSN_P (insn)) { /* Always delete no-op moves. */ @@ -522,13 +522,24 @@ delete_unmarked_insns (void) else if (marked_insn_p (insn)) continue; - /* Beware that reaching a dbg counter limit here can rarely - result in miscompiled file. This occurs when a group of - insns must be deleted together. Currently this only - can happen on non-looping pure and constant calls - on machines where ACCUMULATE_OUTGOING_ARGS is true. By - using the dbg_cnt, it is possible to remove the call, but - leave the argument pushes to the stack. */ + /* Beware that reaching a dbg counter limit here can result + in miscompiled file. This occurs when a group of insns + must be deleted together, typically because the kept insn + depends on the output from the deleted insn. Deleting + this insns in reverse order (both at the bb level and + when looking at the blocks) minimizes this, but does not + eliminate it, since it is possible for the using insn to + be top of a block and the producer to be at the bottom of + the block. However, in most cases this will only result + in an uninitialized use of an insn that is dead anyway. + + However, there is one rare case that will cause a + miscompile: deletion of non-looping pure and constant + calls on a machine where ACCUMULATE_OUTGOING_ARGS is true. + In this case it is possible to remove the call, but leave + the argument pushes to the stack. Because of the changes + to the stack pointer, this will almost always lead to a + miscompile. */ if (!dbg_cnt (dce)) continue; |