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, non-empty, 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 doubly-linked 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
.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
-
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
-