/* Return true if basic block BB does nothing except pass control
flow to another block and that we can safely insert a label at
- the start of the successor block. */
+ the start of the successor block.
+
+ As a precondition, we require that BB be not equal to
+ ENTRY_BLOCK_PTR. */
static bool
tree_forwarder_block_p (basic_block bb)
if (! bb_ann (bb)->forwardable)
return false;
- /* BB must have a single outgoing normal edge. Otherwise it can not be
- a forwarder block. */
+ /* BB must have a single outgoing edge. */
if (EDGE_COUNT (bb->succs) != 1
+ /* BB can not have any PHI nodes. This could potentially be
+ relaxed early in compilation if we re-rewrote the variables
+ appearing in any PHI nodes in forwarder blocks. */
+ || phi_nodes (bb)
+ /* BB may not be a predecessor of EXIT_BLOCK_PTR. */
|| EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR
- || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL)
- || bb == ENTRY_BLOCK_PTR)
+ /* BB may not have an abnormal outgoing edge. */
+ || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL))
{
bb_ann (bb)->forwardable = 0;
return false;
}
+#if ENABLE_CHECKING
+ gcc_assert (bb != ENTRY_BLOCK_PTR);
+#endif
+
/* Successors of the entry block are not forwarders. */
FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
if (e->dest == bb)
return false;
}
- /* BB can not have any PHI nodes. This could potentially be relaxed
- early in compilation if we re-rewrote the variables appearing in
- any PHI nodes in forwarder blocks. */
- if (phi_nodes (bb))
- {
- bb_ann (bb)->forwardable = 0;
- return false;
- }
-
/* Now walk through the statements. We can ignore labels, anything else
means this is not a forwarder block. */
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))