diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-06-28 18:24:55 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-06-28 18:24:55 +0000 |
commit | 86ac44ea33336ed9aa3798682698fb2eef1b2cf2 (patch) | |
tree | 82ecd03ca4c9f05046ceb72b92b971adedbbe29c | |
parent | b1e17e1006e4a1526de00e7ddcd899169e83b340 (diff) | |
download | ppe42-gcc-86ac44ea33336ed9aa3798682698fb2eef1b2cf2.tar.gz ppe42-gcc-86ac44ea33336ed9aa3798682698fb2eef1b2cf2.zip |
* ssa-dce.c (eliminate_dead_code): Properly handle control
dependencies implied by PHI nodes.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@43643 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/ssa-dce.c | 35 |
2 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a6f96b4f54e..5d363c36194 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -11,6 +11,9 @@ Thu Jun 28 20:13:11 CEST 2001 Jan Hubicka <jh@suse.cz> Thu Jun 28 11:19:42 2001 Jeffrey A Law (law@cygnus.com) + * ssa-dce.c (eliminate_dead_code): Properly handle control + dependencies implied by PHI nodes. + * ssa-dce.c (eliminate_dead_code): Remove fake edges from the CFG after dead code elimination is complete. diff --git a/gcc/ssa-dce.c b/gcc/ssa-dce.c index 1629803b8e8..4ccd9e01ccb 100644 --- a/gcc/ssa-dce.c +++ b/gcc/ssa-dce.c @@ -558,6 +558,41 @@ eliminate_dead_code () &propagate_necessity_through_operand, (PTR) &unprocessed_instructions); + /* PHI nodes are somewhat special in that each PHI alternative + has data and control dependencies. The data dependencies + are handled via propagate_necessity_through_operand. We + handle the control dependency here. + + We consider the control dependent edges leading to the + predecessor block associated with each PHI alternative + as necessary. */ + if (PHI_NODE_P (current_instruction)) + { + rtvec phi_vec = XVEC (SET_SRC (PATTERN (current_instruction)), 0); + int num_elem = GET_NUM_ELEM (phi_vec); + int v; + + for (v = num_elem - 2; v >= 0; v -= 2) + { + basic_block bb; + + bb = BASIC_BLOCK (INTVAL (RTVEC_ELT (phi_vec, v + 1))); + EXECUTE_IF_CONTROL_DEPENDENT + (cdbte, bb->end, edge_number, + { + rtx jump_insn; + + jump_insn = (INDEX_EDGE_PRED_BB (el, edge_number))->end; + if (((GET_CODE (jump_insn) == JUMP_INSN)) + && UNNECESSARY_P (jump_insn)) + { + RESURRECT_INSN (jump_insn); + VARRAY_PUSH_RTX (unprocessed_instructions, jump_insn); + } + }); + + } + } } } |