Safe Haskell | None |
---|---|
Language | Haskell2010 |
Dataflow analysis to be applied once basic block analysis is complete.
- dominators :: BBGr a -> DomMap
- iDominators :: BBGr a -> IDomMap
- type DomMap = IntMap IntSet
- type IDomMap = IntMap Int
- postOrder :: OrderF a
- revPostOrder :: OrderF a
- preOrder :: OrderF a
- revPreOrder :: OrderF a
- type OrderF a = BBGr a -> [Node]
- dataFlowSolver :: Ord t => BBGr a -> (Node -> InOut t) -> OrderF a -> (OutF t -> InF t) -> (InF t -> OutF t) -> InOutMap t
- showDataFlow :: (Data a, Out a, Show a) => ProgramFile (Analysis a) -> String
- type InOut t = (t, t)
- type InOutMap t = IntMap (InOut t)
- type InF t = Node -> t
- type OutF t = Node -> t
- liveVariableAnalysis :: Data a => BBGr (Analysis a) -> InOutMap (Set Name)
- reachingDefinitions :: Data a => DefMap -> BBGr (Analysis a) -> InOutMap IntSet
- genUDMap :: Data a => BlockMap a -> DefMap -> BBGr (Analysis a) -> InOutMap IntSet -> UDMap
- genDUMap :: Data a => BlockMap a -> DefMap -> BBGr (Analysis a) -> InOutMap IntSet -> DUMap
- duMapToUdMap :: DUMap -> UDMap
- type UDMap = IntMap IntSet
- type DUMap = IntMap IntSet
- genFlowsToGraph :: Data a => BlockMap a -> DefMap -> BBGr (Analysis a) -> InOutMap IntSet -> FlowsGraph a
- type FlowsGraph a = Gr (Block (Analysis a)) ()
- genVarFlowsToMap :: Data a => DefMap -> FlowsGraph a -> VarFlowsMap
- type VarFlowsMap = Map Name (Set Name)
- genBlockMap :: Data a => ProgramFile (Analysis a) -> BlockMap a
- genDefMap :: Data a => BlockMap a -> DefMap
- type BlockMap a = IntMap (Block (Analysis a))
- type DefMap = Map Name IntSet
- genCallMap :: Data a => ProgramFile (Analysis a) -> CallMap
- type CallMap = Map ProgramUnitName (Set Name)
- loopNodes :: Graph gr => BackEdgeMap -> gr a b -> [IntSet]
- genBackEdgeMap :: Graph gr => DomMap -> gr a b -> BackEdgeMap
- sccWith :: Graph gr => Node -> gr a b -> [Node]
- type BackEdgeMap = IntMap Node
- genLoopNodeMap :: Graph gr => BackEdgeMap -> gr a b -> LoopNodeMap
- type LoopNodeMap = IntMap IntSet
- genInductionVarMap :: Data a => BackEdgeMap -> BBGr (Analysis a) -> InductionVarMap
- type InductionVarMap = IntMap (Set Name)
- genInductionVarMapByASTBlock :: forall a. Data a => BackEdgeMap -> BBGr (Analysis a) -> InductionVarMapByASTBlock
- type InductionVarMapByASTBlock = IntMap (Set Name)
- noPredNodes :: Graph g => g a b -> [Node]
- genDerivedInductionMap :: forall a. Data a => BackEdgeMap -> BBGr (Analysis a) -> DerivedInductionMap
- type DerivedInductionMap = IntMap InductionExpr
- data InductionExpr
Documentation
dominators :: BBGr a -> DomMap Source #
Compute dominators of each bblock in the graph. Node A dominates node B when all paths from the start node (0) must pass through node A in order to reach node B. That will be represented as the relation (B, [A, ...]) in the DomMap.
iDominators :: BBGr a -> IDomMap Source #
Compute the immediate dominator of each bblock in the graph. The
immediate dominator is, in a sense, the closest
dominator of a
node. Given nodes A and B, you can say that node A is immediately
dominated by node B if there does not exist any node C such that:
node A dominates node C and node C dominates node B.
postOrder :: OrderF a Source #
The postordering of a graph outputs the label after traversal of children.
revPostOrder :: OrderF a Source #
Reversed postordering.
The preordering of a graph outputs the label before traversal of children.
revPreOrder :: OrderF a Source #
Reversed preordering.
type OrderF a = BBGr a -> [Node] Source #
An OrderF is a function from graph to a specific ordering of nodes.
:: Ord t | |
=> BBGr a | basic block graph |
-> (Node -> InOut t) | initialisation for in and out dataflows |
-> OrderF a | ordering function |
-> (OutF t -> InF t) | compute the in-flow given an out-flow function |
-> (InF t -> OutF t) | compute the out-flow given an in-flow function |
-> InOutMap t | final dataflow for each node |
Apply the iterative dataflow analysis method.
showDataFlow :: (Data a, Out a, Show a) => ProgramFile (Analysis a) -> String Source #
Show some information about dataflow analyses.
type InOutMap t = IntMap (InOut t) Source #
InOutMap : node -> (dataflow into node, dataflow out of node)
liveVariableAnalysis :: Data a => BBGr (Analysis a) -> InOutMap (Set Name) Source #
Dataflow analysis for live variables given basic block graph. Muchnick, p. 445: A variable is "live" at a particular program point if there is a path to the exit along which its value may be used before it is redefined. It is "dead" if there is no such path.
reachingDefinitions :: Data a => DefMap -> BBGr (Analysis a) -> InOutMap IntSet Source #
Reaching definitions dataflow analysis. Reaching definitions are the set of variable-defining AST-block labels that may reach a program point. Suppose AST-block with label A defines a variable named v. Label A may reach another program point labeled P if there is at least one program path from label A to label P that does not redefine variable v.
genUDMap :: Data a => BlockMap a -> DefMap -> BBGr (Analysis a) -> InOutMap IntSet -> UDMap Source #
use-def map: map AST-block labels of variable-using AST-blocks to the AST-blocks that define those variables.
genDUMap :: Data a => BlockMap a -> DefMap -> BBGr (Analysis a) -> InOutMap IntSet -> DUMap Source #
def-use map: map AST-block labels of defining AST-blocks to the AST-blocks that may use the definition.
duMapToUdMap :: DUMap -> UDMap Source #
Invert the DUMap into a UDMap
:: Data a | |
=> BlockMap a | |
-> DefMap | |
-> BBGr (Analysis a) | |
-> InOutMap IntSet | result of reaching definitions |
-> FlowsGraph a |
Flows-To analysis. Represent def-use map as a graph.
type FlowsGraph a = Gr (Block (Analysis a)) () Source #
FlowsGraph : nodes as AST-block (numbered by label), edges showing which definitions contribute to which uses.
genVarFlowsToMap :: Data a => DefMap -> FlowsGraph a -> VarFlowsMap Source #
Create a map (A -> Bs) where A "flows" or contributes towards the variables Bs.
genBlockMap :: Data a => ProgramFile (Analysis a) -> BlockMap a Source #
Build a BlockMap from the AST. This can only be performed after analyseBasicBlocks has operated, created basic blocks, and labeled all of the AST-blocks with unique numbers.
genDefMap :: Data a => BlockMap a -> DefMap Source #
Build a DefMap from the BlockMap. This allows us to quickly look up the AST-block labels that wrote into the given variable.
type BlockMap a = IntMap (Block (Analysis a)) Source #
BlockMap : AST-block label -> AST-block Each AST-block has been given a unique number label during analysis of basic blocks. The purpose of this map is to provide the ability to lookup AST-blocks by label.
genCallMap :: Data a => ProgramFile (Analysis a) -> CallMap Source #
Create a call map showing the structure of the program.
type CallMap = Map ProgramUnitName (Set Name) Source #
CallMap : program unit name -> { name of function or subroutine }
loopNodes :: Graph gr => BackEdgeMap -> gr a b -> [IntSet] Source #
For each loop in the program, find out which bblock nodes are
part of the loop by looking through the backedges (m, n) where n is
considered the 'loop-header', delete n from the map, and then do a
reverse-depth-first traversal starting from m to find all the nodes
of interest. Intersect this with the strongly-connected component
containing m, in case of improper
graphs with weird control
transfers.
genBackEdgeMap :: Graph gr => DomMap -> gr a b -> BackEdgeMap Source #
Find the edges that 'loop back' in the graph; ones where the target node dominates the source node. If the backedges are viewed as (m -> n) then n is considered the 'loop-header'
sccWith :: Graph gr => Node -> gr a b -> [Node] Source #
The strongly connected component containing a given node.
type BackEdgeMap = IntMap Node Source #
BackEdgeMap : node -> node
genLoopNodeMap :: Graph gr => BackEdgeMap -> gr a b -> LoopNodeMap Source #
Similar to loopNodes except it creates a map from loop-header to the set of loop nodes, for each loop-header.
type LoopNodeMap = IntMap IntSet Source #
LoopNodeMap : node -> { node }
genInductionVarMap :: Data a => BackEdgeMap -> BBGr (Analysis a) -> InductionVarMap Source #
For each loop in the program, figure out the names of the induction variables: the variables that are used to represent the current iteration of the loop.
type InductionVarMap = IntMap (Set Name) Source #
Map of loop header nodes to the induction variables within that loop.
genInductionVarMapByASTBlock :: forall a. Data a => BackEdgeMap -> BBGr (Analysis a) -> InductionVarMapByASTBlock Source #
Generate an induction variable map that is indexed by the labels on AST-blocks within those loops.
type InductionVarMapByASTBlock = IntMap (Set Name) Source #
InductionVarMapByASTBlock : AST-block label -> { name }
noPredNodes :: Graph g => g a b -> [Node] Source #
Compute the set of nodes with no predecessors.
genDerivedInductionMap :: forall a. Data a => BackEdgeMap -> BBGr (Analysis a) -> DerivedInductionMap Source #
For every expression in a loop, try to derive its relationship to a basic induction variable.