ssa-dce.c (eliminate_dead_code): Properly handle control dependencies implied by PHI nodes.

* ssa-dce.c (eliminate_dead_code): Properly handle control
        dependencies implied by PHI nodes.

From-SVN: r43643
This commit is contained in:
Jeffrey A Law 2001-06-28 18:24:55 +00:00 committed by Jeff Law
parent 7a442791bb
commit fa2eec9a67
2 changed files with 38 additions and 0 deletions

View File

@ -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.

View File

@ -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);
}
});
}
}
}
}