summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2001-06-28 18:24:55 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2001-06-28 18:24:55 +0000
commit86ac44ea33336ed9aa3798682698fb2eef1b2cf2 (patch)
tree82ecd03ca4c9f05046ceb72b92b971adedbbe29c
parentb1e17e1006e4a1526de00e7ddcd899169e83b340 (diff)
downloadppe42-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/ChangeLog3
-rw-r--r--gcc/ssa-dce.c35
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);
+ }
+ });
+
+ }
+ }
}
}
OpenPOWER on IntegriCloud