Class CFGTranslationPhaseThree
java.lang.Object
org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseThree
Class that performs phase three of the translation process. In particular, the following
degenerate cases of basic blocks are removed:
 Empty regular basic blocks: These blocks will be removed and their predecessors linked directly to the successor.
 Conditional basic blocks that have the same basic block as the 'then' and 'else' successor: The conditional basic block will be removed in this case.
 Two consecutive, nonempty, regular basic blocks where the second block has exactly one predecessor (namely the other of the two blocks): In this case, the two blocks are merged.
 Some basic blocks might not be reachable from the entryBlock. These basic blocks are removed, and the list of predecessors (in the doublylinked structure of basic blocks) are adapted correctly.

Nested Class Summary
Modifier and TypeClassDescriptionprotected static interface
A simple wrapper object that holds a basic block and allows to set one of its successors. 
Constructor Summary

Method Summary
Modifier and TypeMethodDescriptionprotected static BlockImpl
computeNeighborhoodOfEmptyBlock
(RegularBlockImpl start, Set<RegularBlockImpl> emptyBlocks, Set<CFGTranslationPhaseThree.PredecessorHolder> predecessors) Compute the set of empty regular basic blocksemptyBlocks
, starting atstart
and going both forward and backwards.protected static void
computeNeighborhoodOfEmptyBlockBackwards
(RegularBlockImpl start, Set<RegularBlockImpl> emptyBlocks, Set<CFGTranslationPhaseThree.PredecessorHolder> predecessors) Compute the set of empty regular basic blocksemptyBlocks
, starting atstart
and looking only backwards in the control flow graph.protected static CFGTranslationPhaseThree.PredecessorHolder
getPredecessorHolder
(BlockImpl pred, BlockImpl cur) Return a predecessor holder that can be used to set the successor ofpred
in the place where previously the edge pointed tocur
.protected static void
Simplify the CFG by merging consecutive singlesuccessor blocks.static ControlFlowGraph
process
(ControlFlowGraph cfg) Perform phase three on the control flow graphcfg
.protected static CFGTranslationPhaseThree.PredecessorHolder
Returns aCFGTranslationPhaseThree.PredecessorHolder
that sets the successor of a single successor blocks
.

Constructor Details

CFGTranslationPhaseThree
public CFGTranslationPhaseThree()


Method Details

process
Perform phase three on the control flow graphcfg
. Parameters:
cfg
 the control flow graph. Ownership is transfered to this method and the caller is not allowed to read or modifycfg
after the call toprocess
any more. Returns:
 the resulting control flow graph

mergeConsecutiveBlocks
Simplify the CFG by merging consecutive singlesuccessor blocks. Parameters:
cfg
 the control flow graph

computeNeighborhoodOfEmptyBlock
protected static BlockImpl computeNeighborhoodOfEmptyBlock(RegularBlockImpl start, Set<RegularBlockImpl> emptyBlocks, Set<CFGTranslationPhaseThree.PredecessorHolder> predecessors) Compute the set of empty regular basic blocksemptyBlocks
, starting atstart
and going both forward and backwards. Furthermore, compute the predecessors of these empty blocks (predecessors
), and their single successor (return value). Parameters:
start
 the starting point of the search (an empty, regular basic block)emptyBlocks
 a set to be filled by this method with all empty basic blocks found (includingstart
).predecessors
 a set to be filled by this method with all predecessors Returns:
 the single successor of the set of the empty basic blocks

computeNeighborhoodOfEmptyBlockBackwards
protected static void computeNeighborhoodOfEmptyBlockBackwards(RegularBlockImpl start, Set<RegularBlockImpl> emptyBlocks, Set<CFGTranslationPhaseThree.PredecessorHolder> predecessors) Compute the set of empty regular basic blocksemptyBlocks
, starting atstart
and looking only backwards in the control flow graph. Furthermore, compute the predecessors of these empty blocks (predecessors
). Parameters:
start
 the starting point of the search (an empty, regular basic block)emptyBlocks
 a set to be filled by this method with all empty basic blocks found (includingstart
).predecessors
 a set to be filled by this method with all predecessors

getPredecessorHolder
protected static CFGTranslationPhaseThree.PredecessorHolder getPredecessorHolder(BlockImpl pred, BlockImpl cur) Return a predecessor holder that can be used to set the successor ofpred
in the place where previously the edge pointed tocur
. Additionally, the predecessor holder also takes care of unlinking (i.e., removing thepred
fromcur's
predecessors). Parameters:
pred
 a block whose successor should be setcur
 the previous successor ofpred
 Returns:
 a predecessor holder to set the successor of
pred

singleSuccessorHolder
protected static CFGTranslationPhaseThree.PredecessorHolder singleSuccessorHolder(SingleSuccessorBlockImpl s, BlockImpl old) Returns aCFGTranslationPhaseThree.PredecessorHolder
that sets the successor of a single successor blocks
. Returns:
 a
CFGTranslationPhaseThree.PredecessorHolder
that sets the successor of a single successor blocks
