| Safe Haskell | Safe |
|---|---|
| Language | Haskell2010 |
Compiler.Hoopl
Contents
Synopsis
- class LabelsPtr l where
- class NonLocal thing where
- data Graph' block (n :: * -> * -> *) e x where
- type Graph = Graph' Block
- type Body' block (n :: * -> * -> *) = LabelMap (block n C C)
- type Body n = LabelMap (Block n C C)
- emptyBody :: Body' block n
- bodyUnion :: forall a. LabelMap a -> LabelMap a -> LabelMap a
- bodyList :: Body' block n -> [(Label, block n C C)]
- addBlock :: NonLocal thing => thing C C -> LabelMap (thing C C) -> LabelMap (thing C C)
- bodyGraph :: Body n -> Graph n C C
- gUnitOO :: block n O O -> Graph' block n O O
- gUnitOC :: block n O C -> Graph' block n O C
- gUnitCO :: block n C O -> Graph' block n C O
- gUnitCC :: NonLocal (block n) => block n C C -> Graph' block n C C
- catGraphNodeOO :: Graph n e O -> n O O -> Graph n e O
- catGraphNodeOC :: NonLocal n => Graph n e O -> n O C -> Graph n e C
- catNodeOOGraph :: n O O -> Graph n O x -> Graph n O x
- catNodeCOGraph :: NonLocal n => n C O -> Graph n O x -> Graph n C x
- blockGraph :: NonLocal n => Block n e x -> Graph n e x
- gSplice :: NonLocal n => Graph n e a -> Graph n a x -> Graph n e x
- mapGraph :: (forall e x. n e x -> n' e x) -> Graph n e x -> Graph n' e x
- mapGraphBlocks :: forall block n block' n' e x. (forall e x. block n e x -> block' n' e x) -> Graph' block n e x -> Graph' block' n' e x
- foldGraphNodes :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Graph n e x -> a -> a
- postorder_dfs :: NonLocal (block n) => Graph' block n O x -> [block n C C]
- preorder_dfs :: NonLocal (block n) => Graph' block n O x -> [block n C C]
- postorder_dfs_from_except :: forall block e. (NonLocal block, LabelsPtr e) => LabelMap (block C C) -> e -> LabelSet -> [block C C]
- postorder_dfs_from :: (NonLocal block, LabelsPtr b) => LabelMap (block C C) -> b -> [block C C]
- preorder_dfs_from_except :: forall block e. (NonLocal block, LabelsPtr e) => LabelMap (block C C) -> e -> LabelSet -> [block C C]
- labelsDefined :: forall block n e x. NonLocal (block n) => Graph' block n e x -> LabelSet
- labelsUsed :: forall block n e x. NonLocal (block n) => Graph' block n e x -> LabelSet
- externalEntryLabels :: forall n. NonLocal n => LabelMap (Block n C C) -> LabelSet
- data O
- data C
- data MaybeO ex t where
- data MaybeC ex t where
- type family IndexedCO ex a b :: *
- data Shape ex where
- data Block n e x where
- BlockCO :: n C O -> Block n O O -> Block n C O
- BlockCC :: n C O -> Block n O O -> n O C -> Block n C C
- BlockOC :: Block n O O -> n O C -> Block n O C
- BNil :: Block n O O
- BMiddle :: n O O -> Block n O O
- BCat :: Block n O O -> Block n O O -> Block n O O
- BSnoc :: Block n O O -> n O O -> Block n O O
- BCons :: n O O -> Block n O O -> Block n O O
- isEmptyBlock :: Block n e x -> Bool
- emptyBlock :: Block n O O
- blockCons :: n O O -> Block n O x -> Block n O x
- blockSnoc :: Block n e O -> n O O -> Block n e O
- blockJoinHead :: n C O -> Block n O x -> Block n C x
- blockJoinTail :: Block n e O -> n O C -> Block n e C
- blockJoin :: n C O -> Block n O O -> n O C -> Block n C C
- blockJoinAny :: (MaybeC e (n C O), Block n O O, MaybeC x (n O C)) -> Block n e x
- blockAppend :: Block n e O -> Block n O x -> Block n e x
- firstNode :: Block n C x -> n C O
- lastNode :: Block n x C -> n O C
- endNodes :: Block n C C -> (n C O, n O C)
- blockSplitHead :: Block n C x -> (n C O, Block n O x)
- blockSplitTail :: Block n e C -> (Block n e O, n O C)
- blockSplit :: Block n C C -> (n C O, Block n O O, n O C)
- blockSplitAny :: Block n e x -> (MaybeC e (n C O), Block n O O, MaybeC x (n O C))
- replaceFirstNode :: Block n C x -> n C O -> Block n C x
- replaceLastNode :: Block n x C -> n O C -> Block n x C
- blockToList :: Block n O O -> [n O O]
- blockFromList :: [n O O] -> Block n O O
- mapBlock :: (forall e x. n e x -> n' e x) -> Block n e x -> Block n' e x
- mapBlock' :: (forall e x. n e x -> n' e x) -> Block n e x -> Block n' e x
- mapBlock3' :: forall n n' e x. (n C O -> n' C O, n O O -> n' O O, n O C -> n' O C) -> Block n e x -> Block n' e x
- foldBlockNodesF :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Block n e x -> IndexedCO e a a -> IndexedCO x a a
- foldBlockNodesF3 :: forall n a b c. (n C O -> a -> b, n O O -> b -> b, n O C -> b -> c) -> forall e x. Block n e x -> IndexedCO e a b -> IndexedCO x c b
- foldBlockNodesB :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Block n e x -> IndexedCO x a a -> IndexedCO e a a
- foldBlockNodesB3 :: forall n a b c. (n C O -> b -> c, n O O -> b -> b, n O C -> a -> b) -> forall e x. Block n e x -> IndexedCO x a b -> IndexedCO e c b
- frontBiasBlock :: Block n e x -> Block n e x
- backBiasBlock :: Block n e x -> Block n e x
- data AGraph n e x
- graphOfAGraph :: AGraph n e x -> forall m. UniqueMonad m => m (Graph n e x)
- aGraphOfGraph :: Graph n e x -> AGraph n e x
- (<*>) :: (GraphRep g, NonLocal n) => g n e O -> g n O x -> g n e x
- (|*><*|) :: (GraphRep g, NonLocal n) => g n e C -> g n C x -> g n e x
- catGraphs :: (GraphRep g, NonLocal n) => [g n O O] -> g n O O
- addEntrySeq :: NonLocal n => AGraph n O C -> AGraph n C x -> AGraph n O x
- addExitSeq :: NonLocal n => AGraph n e C -> AGraph n C O -> AGraph n e O
- addBlocks :: HooplNode n => AGraph n e x -> AGraph n C C -> AGraph n e x
- unionBlocks :: NonLocal n => AGraph n C C -> AGraph n C C -> AGraph n C C
- emptyGraph :: GraphRep g => g n O O
- emptyClosedGraph :: GraphRep g => g n C C
- withFresh :: Uniques u => (u -> AGraph n e x) -> AGraph n e x
- mkFirst :: GraphRep g => n C O -> g n C O
- mkMiddle :: GraphRep g => n O O -> g n O O
- mkMiddles :: (GraphRep g, NonLocal n) => [n O O] -> g n O O
- mkLast :: GraphRep g => n O C -> g n O C
- mkBranch :: (GraphRep g, HooplNode n) => Label -> g n O C
- mkLabel :: (GraphRep g, HooplNode n) => Label -> g n C O
- mkWhileDo :: HooplNode n => (Label -> Label -> AGraph n O C) -> AGraph n O O -> AGraph n O O
- class IfThenElseable x where
- mkEntry :: GraphRep g => Block n O C -> g n O C
- mkExit :: GraphRep g => Block n C O -> g n C O
- class NonLocal n => HooplNode n where
- firstXfer :: NonLocal n => (n C O -> f -> f) -> n C O -> FactBase f -> f
- distributeXfer :: NonLocal n => DataflowLattice f -> (n O C -> f -> f) -> n O C -> f -> FactBase f
- distributeFact :: NonLocal n => n O C -> f -> FactBase f
- distributeFactBwd :: NonLocal n => n C O -> f -> FactBase f
- successorFacts :: NonLocal n => n O C -> FactBase f -> [f]
- joinFacts :: DataflowLattice f -> Label -> [f] -> f
- joinOutFacts :: NonLocal node => DataflowLattice f -> node O C -> FactBase f -> f
- joinMaps :: Ord k => JoinFun v -> JoinFun (Map k v)
- analyzeAndRewriteFwdBody :: forall m n f entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => FwdPass m n f -> entries -> Body n -> FactBase f -> m (Body n, FactBase f)
- analyzeAndRewriteBwdBody :: forall m n f entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => BwdPass m n f -> entries -> Body n -> FactBase f -> m (Body n, FactBase f)
- analyzeAndRewriteFwdOx :: forall m n f x. (CheckpointMonad m, NonLocal n) => FwdPass m n f -> Graph n O x -> f -> m (Graph n O x, FactBase f, MaybeO x f)
- analyzeAndRewriteBwdOx :: forall m n f x. (CheckpointMonad m, NonLocal n) => BwdPass m n f -> Graph n O x -> Fact x f -> m (Graph n O x, FactBase f, f)
- class IsSet set where
- type ElemOf set
- setInsertList :: IsSet set => [ElemOf set] -> set -> set
- setDeleteList :: IsSet set => [ElemOf set] -> set -> set
- setUnions :: IsSet set => [set] -> set
- class IsMap map where
- type KeyOf map
- mapInsertList :: IsMap map => [(KeyOf map, a)] -> map a -> map a
- mapDeleteList :: IsMap map => [KeyOf map] -> map a -> map a
- mapUnions :: IsMap map => [map a] -> map a
- class Monad m => CheckpointMonad m where
- type Checkpoint m
- newtype BwdRewrite m n f = BwdRewrite3 {
- getBRewrite3 :: (n C O -> f -> m (Maybe (Graph n C O, BwdRewrite m n f)), n O O -> f -> m (Maybe (Graph n O O, BwdRewrite m n f)), n O C -> FactBase f -> m (Maybe (Graph n O C, BwdRewrite m n f)))
- newtype BwdTransfer n f = BwdTransfer3 {}
- data BwdPass m n f = BwdPass {
- bp_lattice :: DataflowLattice f
- bp_transfer :: BwdTransfer n f
- bp_rewrite :: BwdRewrite m n f
- type family Fact x f :: *
- newtype FwdRewrite m n f = FwdRewrite3 {
- getFRewrite3 :: (n C O -> f -> m (Maybe (Graph n C O, FwdRewrite m n f)), n O O -> f -> m (Maybe (Graph n O O, FwdRewrite m n f)), n O C -> f -> m (Maybe (Graph n O C, FwdRewrite m n f)))
- newtype FwdTransfer n f = FwdTransfer3 {}
- data FwdPass m n f = FwdPass {
- fp_lattice :: DataflowLattice f
- fp_transfer :: FwdTransfer n f
- fp_rewrite :: FwdRewrite m n f
- data ChangeFlag
- newtype NewFact a = NewFact a
- newtype OldFact a = OldFact a
- type JoinFun a = Label -> OldFact a -> NewFact a -> (ChangeFlag, a)
- data DataflowLattice a = DataflowLattice {}
- changeIf :: Bool -> ChangeFlag
- mkFactBase :: forall f. DataflowLattice f -> [(Label, f)] -> FactBase f
- mkFTransfer3 :: (n C O -> f -> f) -> (n O O -> f -> f) -> (n O C -> f -> FactBase f) -> FwdTransfer n f
- mkFTransfer :: (forall e x. n e x -> f -> Fact x f) -> FwdTransfer n f
- mkFRewrite3 :: forall m n f. FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> f -> m (Maybe (Graph n O C))) -> FwdRewrite m n f
- noFwdRewrite :: Monad m => FwdRewrite m n f
- mkFRewrite :: FuelMonad m => (forall e x. n e x -> f -> m (Maybe (Graph n e x))) -> FwdRewrite m n f
- analyzeAndRewriteFwd :: forall m n f e x entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => FwdPass m n f -> MaybeC e entries -> Graph n e x -> Fact e f -> m (Graph n e x, FactBase f, MaybeO x f)
- mkBTransfer3 :: (n C O -> f -> f) -> (n O O -> f -> f) -> (n O C -> FactBase f -> f) -> BwdTransfer n f
- mkBTransfer :: (forall e x. n e x -> Fact x f -> f) -> BwdTransfer n f
- mkBRewrite3 :: forall m n f. FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> FactBase f -> m (Maybe (Graph n O C))) -> BwdRewrite m n f
- noBwdRewrite :: Monad m => BwdRewrite m n f
- mkBRewrite :: FuelMonad m => (forall e x. n e x -> Fact x f -> m (Maybe (Graph n e x))) -> BwdRewrite m n f
- analyzeAndRewriteBwd :: (CheckpointMonad m, NonLocal n, LabelsPtr entries) => BwdPass m n f -> MaybeC e entries -> Graph n e x -> Fact x f -> m (Graph n e x, FactBase f, MaybeO e f)
- type FactBase f = LabelMap f
- data LabelMap v
- data LabelSet
- data Label
- freshLabel :: UniqueMonad m => m Label
- noFacts :: FactBase f
- lookupFact :: Label -> FactBase f -> Maybe f
- data Pointed t b a where
- addPoints :: String -> JoinFun a -> DataflowLattice (Pointed t C a)
- addPoints' :: forall a t. String -> (Label -> OldFact a -> NewFact a -> (ChangeFlag, Pointed t C a)) -> DataflowLattice (Pointed t C a)
- addTop :: DataflowLattice a -> DataflowLattice (WithTop a)
- addTop' :: forall a. String -> a -> (Label -> OldFact a -> NewFact a -> (ChangeFlag, WithTop a)) -> DataflowLattice (WithTop a)
- liftJoinTop :: JoinFun a -> JoinFun (WithTop a)
- extendJoinDomain :: forall a. (Label -> OldFact a -> NewFact a -> (ChangeFlag, WithTop a)) -> JoinFun (WithTop a)
- type WithTop a = Pointed C O a
- type WithBot a = Pointed O C a
- type WithTopAndBot a = Pointed C C a
- thenFwdRw :: forall m n f. Monad m => FwdRewrite m n f -> FwdRewrite m n f -> FwdRewrite m n f
- deepFwdRw3 :: FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> f -> m (Maybe (Graph n O C))) -> FwdRewrite m n f
- deepFwdRw :: FuelMonad m => (forall e x. n e x -> f -> m (Maybe (Graph n e x))) -> FwdRewrite m n f
- iterFwdRw :: forall m n f. Monad m => FwdRewrite m n f -> FwdRewrite m n f
- thenBwdRw :: forall m n f. Monad m => BwdRewrite m n f -> BwdRewrite m n f -> BwdRewrite m n f
- deepBwdRw3 :: FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> FactBase f -> m (Maybe (Graph n O C))) -> BwdRewrite m n f
- deepBwdRw :: FuelMonad m => (forall e x. n e x -> Fact x f -> m (Maybe (Graph n e x))) -> BwdRewrite m n f
- iterBwdRw :: forall m n f. Monad m => BwdRewrite m n f -> BwdRewrite m n f
- pairFwd :: forall m n f f'. Monad m => FwdPass m n f -> FwdPass m n f' -> FwdPass m n (f, f')
- pairBwd :: forall m n f f'. Monad m => BwdPass m n f -> BwdPass m n f' -> BwdPass m n (f, f')
- pairLattice :: forall f f'. DataflowLattice f -> DataflowLattice f' -> DataflowLattice (f, f')
- type SimpleFuelMonad = CheckingFuelMonad SimpleUniqueMonad
- data InfiniteFuelMonad m a
- data CheckingFuelMonad m a
- type Fuel = Int
- class FuelMonadT fm where
- class Monad m => FuelMonad m
- fuelRemaining :: FuelMonad m => m Fuel
- infiniteFuel :: Fuel
- data UniqueMonadT m a
- data SimpleUniqueMonad a
- class Monad m => UniqueMonad m where
- data UniqueMap v
- data UniqueSet
- type Unique = Int
- intToUnique :: Int -> Unique
- runSimpleUniqueMonad :: SimpleUniqueMonad a -> a
- runUniqueMonadT :: Monad m => UniqueMonadT m a -> m a
- type TraceFn = forall a. String -> a -> a
- debugFwdJoins :: forall m n f. Show f => TraceFn -> ChangePred -> FwdPass m n f -> FwdPass m n f
- debugBwdJoins :: forall m n f. Show f => TraceFn -> ChangePred -> BwdPass m n f -> BwdPass m n f
- debugFwdTransfers :: forall m n f. Show f => TraceFn -> ShowN n -> FPred n f -> FwdPass m n f -> FwdPass m n f
- debugBwdTransfers :: forall m n f. Show f => TraceFn -> ShowN n -> BPred n f -> BwdPass m n f -> BwdPass m n f
- showGraph :: forall n e x. Showing n -> Graph n e x -> String
- showFactBase :: Show f => FactBase f -> String
- type Showing n = forall e x. n e x -> String
Documentation
Minimal complete definition
Methods
targetLabels :: l -> [Label] #
Instances
| LabelsPtr LabelSet # | |
Defined in Compiler.Hoopl.Graph Methods targetLabels :: LabelSet -> [Label] # | |
| LabelsPtr Label # | |
Defined in Compiler.Hoopl.Graph Methods targetLabels :: Label -> [Label] # | |
| LabelsPtr l => LabelsPtr [l] # | |
Defined in Compiler.Hoopl.Graph Methods targetLabels :: [l] -> [Label] # | |
| NonLocal n => LabelsPtr (n e C) # | |
Defined in Compiler.Hoopl.Graph Methods targetLabels :: n e C -> [Label] # | |
Gives access to the anchor points for nonlocal edges as well as the edges themselves
Minimal complete definition
Methods
Instances
| NonLocal n => NonLocal (Block n) # | |
Defined in Compiler.Hoopl.Graph | |
data Graph' block (n :: * -> * -> *) e x where #
Graph' is abstracted over the block type, so that we can build
graphs of annotated blocks for example (Compiler.Hoopl.Dataflow
needs this).
A control-flow graph, which may take any of four shapes (O/O, OC, CO, C/C). A graph open at the entry has a single, distinguished, anonymous entry point; if a graph is closed at the entry, its entry point(s) are supplied by a context.
blockGraph :: NonLocal n => Block n e x -> Graph n e x #
mapGraph :: (forall e x. n e x -> n' e x) -> Graph n e x -> Graph n' e x #
Maps over all nodes in a graph.
mapGraphBlocks :: forall block n block' n' e x. (forall e x. block n e x -> block' n' e x) -> Graph' block n e x -> Graph' block' n' e x #
Function mapGraphBlocks enables a change of representation of blocks,
nodes, or both. It lifts a polymorphic block transform into a polymorphic
graph transform. When the block representation stabilizes, a similar
function should be provided for blocks.
foldGraphNodes :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Graph n e x -> a -> a #
Fold a function over every node in a graph. The fold function must be polymorphic in the shape of the nodes.
postorder_dfs :: NonLocal (block n) => Graph' block n O x -> [block n C C] #
Traversal: postorder_dfs returns a list of blocks reachable
from the entry of enterable graph. The entry and exit are *not* included.
The list has the following property:
Say a "back reference" exists if one of a block's control-flow successors precedes it in the output list
Then there are as few back references as possible
The output is suitable for use in
a forward dataflow problem. For a backward problem, simply reverse
the list. (postorder_dfs is sufficiently tricky to implement that
one doesn't want to try and maintain both forward and backward
versions.)
postorder_dfs_from_except :: forall block e. (NonLocal block, LabelsPtr e) => LabelMap (block C C) -> e -> LabelSet -> [block C C] #
preorder_dfs_from_except :: forall block e. (NonLocal block, LabelsPtr e) => LabelMap (block C C) -> e -> LabelSet -> [block C C] #
labelsDefined :: forall block n e x. NonLocal (block n) => Graph' block n e x -> LabelSet #
labelsUsed :: forall block n e x. NonLocal (block n) => Graph' block n e x -> LabelSet #
Shapes
Used at the type level to indicate an "open" structure with a unique, unnamed control-flow edge flowing in or out. Fallthrough and concatenation are permitted at an open point.
Instances
| IfThenElseable O # | |
| type Fact O f # | |
Defined in Compiler.Hoopl.Dataflow | |
| type IndexedCO O _a b # | |
Defined in Compiler.Hoopl.Block | |
Used at the type level to indicate a "closed" structure which supports control transfer only through the use of named labels---no "fallthrough" is permitted. The number of control-flow edges is unconstrained.
Instances
| IfThenElseable C # | |
| NonLocal n => LabelsPtr (n e C) # | |
Defined in Compiler.Hoopl.Graph Methods targetLabels :: n e C -> [Label] # | |
| type Fact C f # | |
Defined in Compiler.Hoopl.Dataflow | |
| type IndexedCO C a _b # | |
Defined in Compiler.Hoopl.Block | |
Maybe type indexed by open/closed
Maybe type indexed by closed/open
Blocks
A sequence of nodes. May be any of four shapes (OO, OC, CO, CC). Open at the entry means single entry, mutatis mutandis for exit. A closedclosed block is a basic/ block and can't be extended further. Clients should avoid manipulating blocks and should stick to either nodes or graphs.
Constructors
| BlockCO :: n C O -> Block n O O -> Block n C O | |
| BlockCC :: n C O -> Block n O O -> n O C -> Block n C C | |
| BlockOC :: Block n O O -> n O C -> Block n O C | |
| BNil :: Block n O O | |
| BMiddle :: n O O -> Block n O O | |
| BCat :: Block n O O -> Block n O O -> Block n O O | |
| BSnoc :: Block n O O -> n O O -> Block n O O | |
| BCons :: n O O -> Block n O O -> Block n O O |
Instances
| NonLocal n => NonLocal (Block n) # | |
Defined in Compiler.Hoopl.Graph | |
Predicates on Blocks
isEmptyBlock :: Block n e x -> Bool #
Constructing blocks
emptyBlock :: Block n O O #
blockJoinAny :: (MaybeC e (n C O), Block n O O, MaybeC x (n O C)) -> Block n e x #
Convert a list of nodes to a block. The entry and exit node must or must not be present depending on the shape of the block.
Deconstructing blocks
blockSplit :: Block n C C -> (n C O, Block n O O, n O C) #
Split a closed block into its entry node, open middle block, and exit node.
Modifying blocks
Converting to and from lists
Maps and folds
mapBlock :: (forall e x. n e x -> n' e x) -> Block n e x -> Block n' e x #
map a function over the nodes of a Block
mapBlock3' :: forall n n' e x. (n C O -> n' C O, n O O -> n' O O, n O C -> n' O C) -> Block n e x -> Block n' e x #
map over a block, with different functions to apply to first nodes, middle nodes and last nodes respectively. The map is strict.
foldBlockNodesF :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Block n e x -> IndexedCO e a a -> IndexedCO x a a #
foldBlockNodesF3 :: forall n a b c. (n C O -> a -> b, n O O -> b -> b, n O C -> b -> c) -> forall e x. Block n e x -> IndexedCO e a b -> IndexedCO x c b #
Fold a function over every node in a block, forward or backward. The fold function must be polymorphic in the shape of the nodes.
foldBlockNodesB :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Block n e x -> IndexedCO x a a -> IndexedCO e a a #
foldBlockNodesB3 :: forall n a b c. (n C O -> b -> c, n O O -> b -> b, n O C -> a -> b) -> forall e x. Block n e x -> IndexedCO x a b -> IndexedCO e c b #
Biasing
frontBiasBlock :: Block n e x -> Block n e x #
A block is "front biased" if the left child of every concatenation operation is a node, not a general block; a front-biased block is analogous to an ordinary list. If a block is front-biased, then its nodes can be traversed from front to back without general recusion; tail recursion suffices. Not all shapes can be front-biased; a closed/open block is inherently back-biased.
backBiasBlock :: Block n e x -> Block n e x #
A block is "back biased" if the right child of every concatenation operation is a node, not a general block; a back-biased block is analogous to a snoc-list. If a block is back-biased, then its nodes can be traversed from back to back without general recusion; tail recursion suffices. Not all shapes can be back-biased; an open/closed block is inherently front-biased.
The type of abstract graphs. Offers extra "smart constructors" that may consume fresh labels during construction.
graphOfAGraph :: AGraph n e x -> forall m. UniqueMonad m => m (Graph n e x) #
aGraphOfGraph :: Graph n e x -> AGraph n e x #
Take a graph and make it abstract.
(<*>) :: (GraphRep g, NonLocal n) => g n e O -> g n O x -> g n e x infixl 3 #
Concatenate two graphs; control flows from left to right.
(|*><*|) :: (GraphRep g, NonLocal n) => g n e C -> g n C x -> g n e x infixl 2 #
Splice together two graphs at a closed point; nothing is known about control flow.
catGraphs :: (GraphRep g, NonLocal n) => [g n O O] -> g n O O #
Conveniently concatenate a sequence of open/open graphs using <*>.
addEntrySeq :: NonLocal n => AGraph n O C -> AGraph n C x -> AGraph n O x #
Deprecated: use |*><*| instead
addExitSeq :: NonLocal n => AGraph n e C -> AGraph n C O -> AGraph n e O #
Deprecated: use |*><*| instead
addBlocks :: HooplNode n => AGraph n e x -> AGraph n C C -> AGraph n e x #
Extend an existing AGraph with extra basic blocks "out of line".
No control flow is implied. Simon PJ should give example use case.
unionBlocks :: NonLocal n => AGraph n C C -> AGraph n C C -> AGraph n C C #
Deprecated: use |*><*| instead
emptyGraph :: GraphRep g => g n O O #
An empty graph that is open at entry and exit.
It is the left and right identity of <*>.
emptyClosedGraph :: GraphRep g => g n C C #
An empty graph that is closed at entry and exit.
It is the left and right identity of |*><*|.
mkMiddles :: (GraphRep g, NonLocal n) => [n O O] -> g n O O #
Conveniently concatenate a sequence of middle nodes to form an open/open graph.
class IfThenElseable x where #
Minimal complete definition
Methods
Arguments
| :: HooplNode n | |
| => (Label -> Label -> AGraph n O C) | branch condition |
| -> AGraph n O x | code in the "then" branch |
| -> AGraph n O x | code in the "else" branch |
| -> AGraph n O x | resulting if-then-else construct |
Translate a high-level if-then-else construct into an AGraph.
The condition takes as arguments labels on the true-false branch
and returns a single-entry, two-exit graph which exits to
the two labels.
Instances
| IfThenElseable C # | |
| IfThenElseable O # | |
class NonLocal n => HooplNode n where #
For some graph-construction operations and some optimizations,
Hoopl must be able to create control-flow edges using a given node
type n.
Minimal complete definition
Methods
mkBranchNode :: Label -> n O C #
Create a branch node, the source of a control-flow edge.
mkLabelNode :: Label -> n C O #
Create a label node, the target (destination) of a control-flow edge.
Utilities for clients
firstXfer :: NonLocal n => (n C O -> f -> f) -> n C O -> FactBase f -> f #
A utility function so that a transfer function for a first node can be given just a fact; we handle the lookup. This function is planned to be made obsolete by changes in the dataflow interface.
distributeXfer :: NonLocal n => DataflowLattice f -> (n O C -> f -> f) -> n O C -> f -> FactBase f #
This utility function handles a common case in which a transfer function produces a single fact out of a last node, which is then distributed over the outgoing edges.
distributeFact :: NonLocal n => n O C -> f -> FactBase f #
This utility function handles a common case in which a transfer function for a last node takes the incoming fact unchanged and simply distributes that fact over the outgoing edges.
distributeFactBwd :: NonLocal n => n C O -> f -> FactBase f #
This utility function handles a common case in which a backward transfer function takes the incoming fact unchanged and tags it with the node's label.
successorFacts :: NonLocal n => n O C -> FactBase f -> [f] #
List of (unlabelled) facts from the successors of a last node
joinFacts :: DataflowLattice f -> Label -> [f] -> f #
Join a list of facts.
joinOutFacts :: NonLocal node => DataflowLattice f -> node O C -> FactBase f -> f #
Deprecated: should be replaced by 'joinFacts lat l (successorFacts n f)'; as is, it uses the wrong Label
joinMaps :: Ord k => JoinFun v -> JoinFun (Map k v) #
It's common to represent dataflow facts as a map from variables to some fact about the locations. For these maps, the join operation on the map can be expressed in terms of the join on each element of the codomain:
analyzeAndRewriteFwdBody :: forall m n f entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => FwdPass m n f -> entries -> Body n -> FactBase f -> m (Body n, FactBase f) #
Forward dataflow analysis and rewriting for the special case of a Body. A set of entry points must be supplied; blocks not reachable from the set are thrown away.
analyzeAndRewriteBwdBody :: forall m n f entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => BwdPass m n f -> entries -> Body n -> FactBase f -> m (Body n, FactBase f) #
Backward dataflow analysis and rewriting for the special case of a Body. A set of entry points must be supplied; blocks not reachable from the set are thrown away.
analyzeAndRewriteFwdOx :: forall m n f x. (CheckpointMonad m, NonLocal n) => FwdPass m n f -> Graph n O x -> f -> m (Graph n O x, FactBase f, MaybeO x f) #
Forward dataflow analysis and rewriting for the special case of a
graph open at the entry. This special case relieves the client
from having to specify a type signature for NothingO, which beginners
might find confusing and experts might find annoying.
analyzeAndRewriteBwdOx :: forall m n f x. (CheckpointMonad m, NonLocal n) => BwdPass m n f -> Graph n O x -> Fact x f -> m (Graph n O x, FactBase f, f) #
Backward dataflow analysis and rewriting for the special case of a
graph open at the entry. This special case relieves the client
from having to specify a type signature for NothingO, which beginners
might find confusing and experts might find annoying.
Minimal complete definition
setNull, setSize, setMember, setEmpty, setSingleton, setInsert, setDelete, setUnion, setDifference, setIntersection, setIsSubsetOf, setFold, setElems, setFromList
Methods
setMember :: ElemOf set -> set -> Bool #
setSingleton :: ElemOf set -> set #
setInsert :: ElemOf set -> set -> set #
setDelete :: ElemOf set -> set -> set #
setUnion :: set -> set -> set #
setDifference :: set -> set -> set #
setIntersection :: set -> set -> set #
setIsSubsetOf :: set -> set -> Bool #
setFold :: (ElemOf set -> b -> b) -> b -> set -> b #
setElems :: set -> [ElemOf set] #
setFromList :: [ElemOf set] -> set #
Instances
setInsertList :: IsSet set => [ElemOf set] -> set -> set #
setDeleteList :: IsSet set => [ElemOf set] -> set -> set #
Minimal complete definition
mapNull, mapSize, mapMember, mapLookup, mapFindWithDefault, mapEmpty, mapSingleton, mapInsert, mapInsertWith, mapDelete, mapUnion, mapUnionWithKey, mapDifference, mapIntersection, mapIsSubmapOf, mapMap, mapMapWithKey, mapFold, mapFoldWithKey, mapFilter, mapElems, mapKeys, mapToList, mapFromList, mapFromListWith
Methods
mapMember :: KeyOf map -> map a -> Bool #
mapLookup :: KeyOf map -> map a -> Maybe a #
mapFindWithDefault :: a -> KeyOf map -> map a -> a #
mapSingleton :: KeyOf map -> a -> map a #
mapInsert :: KeyOf map -> a -> map a -> map a #
mapInsertWith :: (a -> a -> a) -> KeyOf map -> a -> map a -> map a #
mapDelete :: KeyOf map -> map a -> map a #
mapUnion :: map a -> map a -> map a #
mapUnionWithKey :: (KeyOf map -> a -> a -> a) -> map a -> map a -> map a #
mapDifference :: map a -> map a -> map a #
mapIntersection :: map a -> map a -> map a #
mapIsSubmapOf :: Eq a => map a -> map a -> Bool #
mapMap :: (a -> b) -> map a -> map b #
mapMapWithKey :: (KeyOf map -> a -> b) -> map a -> map b #
mapFold :: (a -> b -> b) -> b -> map a -> b #
mapFoldWithKey :: (KeyOf map -> a -> b -> b) -> b -> map a -> b #
mapFilter :: (a -> Bool) -> map a -> map a #
mapKeys :: map a -> [KeyOf map] #
mapToList :: map a -> [(KeyOf map, a)] #
mapFromList :: [(KeyOf map, a)] -> map a #
mapFromListWith :: (a -> a -> a) -> [(KeyOf map, a)] -> map a #
Instances
mapInsertList :: IsMap map => [(KeyOf map, a)] -> map a -> map a #
mapDeleteList :: IsMap map => [KeyOf map] -> map a -> map a #
class Monad m => CheckpointMonad m where #
Obeys the following law:
for all m
do { s <- checkpoint; m; restart s } == return ()
Minimal complete definition
Associated Types
type Checkpoint m #
Instances
| CheckpointMonad SimpleUniqueMonad # | |
Defined in Compiler.Hoopl.Unique Associated Types type Checkpoint SimpleUniqueMonad :: * # Methods checkpoint :: SimpleUniqueMonad (Checkpoint SimpleUniqueMonad) # restart :: Checkpoint SimpleUniqueMonad -> SimpleUniqueMonad () # | |
| CheckpointMonad m => CheckpointMonad (InfiniteFuelMonad m) # | |
Defined in Compiler.Hoopl.Fuel Associated Types type Checkpoint (InfiniteFuelMonad m) :: * # Methods checkpoint :: InfiniteFuelMonad m (Checkpoint (InfiniteFuelMonad m)) # restart :: Checkpoint (InfiniteFuelMonad m) -> InfiniteFuelMonad m () # | |
| CheckpointMonad m => CheckpointMonad (CheckingFuelMonad m) # | |
Defined in Compiler.Hoopl.Fuel Associated Types type Checkpoint (CheckingFuelMonad m) :: * # Methods checkpoint :: CheckingFuelMonad m (Checkpoint (CheckingFuelMonad m)) # restart :: Checkpoint (CheckingFuelMonad m) -> CheckingFuelMonad m () # | |
newtype BwdRewrite m n f #
Constructors
| BwdRewrite3 | |
Fields
| |
newtype BwdTransfer n f #
Constructors
| BwdTransfer3 | |
Constructors
| BwdPass | |
Fields
| |
newtype FwdRewrite m n f #
Constructors
| FwdRewrite3 | |
Fields
| |
newtype FwdTransfer n f #
Constructors
| FwdTransfer3 | |
Constructors
| FwdPass | |
Fields
| |
data ChangeFlag #
Constructors
| NoChange | |
| SomeChange |
Instances
| Eq ChangeFlag # | |
Defined in Compiler.Hoopl.Dataflow | |
| Ord ChangeFlag # | |
Defined in Compiler.Hoopl.Dataflow Methods compare :: ChangeFlag -> ChangeFlag -> Ordering # (<) :: ChangeFlag -> ChangeFlag -> Bool # (<=) :: ChangeFlag -> ChangeFlag -> Bool # (>) :: ChangeFlag -> ChangeFlag -> Bool # (>=) :: ChangeFlag -> ChangeFlag -> Bool # max :: ChangeFlag -> ChangeFlag -> ChangeFlag # min :: ChangeFlag -> ChangeFlag -> ChangeFlag # | |
data DataflowLattice a #
A transfer function might want to use the logging flag to control debugging, as in for example, it updates just one element in a big finite map. We don't want Hoopl to show the whole fact, and only the transfer function knows exactly what changed.
changeIf :: Bool -> ChangeFlag #
mkFactBase :: forall f. DataflowLattice f -> [(Label, f)] -> FactBase f #
mkFactBase creates a FactBase from a list of (Label, fact)
pairs. If the same label appears more than once, the relevant facts
are joined.
mkFTransfer3 :: (n C O -> f -> f) -> (n O O -> f -> f) -> (n O C -> f -> FactBase f) -> FwdTransfer n f #
mkFTransfer :: (forall e x. n e x -> f -> Fact x f) -> FwdTransfer n f #
mkFRewrite3 :: forall m n f. FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> f -> m (Maybe (Graph n O C))) -> FwdRewrite m n f #
Functions passed to mkFRewrite3 should not be aware of the fuel supply.
The result returned by mkFRewrite3 respects fuel.
noFwdRewrite :: Monad m => FwdRewrite m n f #
mkFRewrite :: FuelMonad m => (forall e x. n e x -> f -> m (Maybe (Graph n e x))) -> FwdRewrite m n f #
Functions passed to mkFRewrite should not be aware of the fuel supply.
The result returned by mkFRewrite respects fuel.
analyzeAndRewriteFwd :: forall m n f e x entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => FwdPass m n f -> MaybeC e entries -> Graph n e x -> Fact e f -> m (Graph n e x, FactBase f, MaybeO x f) #
if the graph being analyzed is open at the entry, there must be no other entry point, or all goes horribly wrong...
mkBTransfer3 :: (n C O -> f -> f) -> (n O O -> f -> f) -> (n O C -> FactBase f -> f) -> BwdTransfer n f #
mkBTransfer :: (forall e x. n e x -> Fact x f -> f) -> BwdTransfer n f #
mkBRewrite3 :: forall m n f. FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> FactBase f -> m (Maybe (Graph n O C))) -> BwdRewrite m n f #
Functions passed to mkBRewrite3 should not be aware of the fuel supply.
The result returned by mkBRewrite3 respects fuel.
noBwdRewrite :: Monad m => BwdRewrite m n f #
mkBRewrite :: FuelMonad m => (forall e x. n e x -> Fact x f -> m (Maybe (Graph n e x))) -> BwdRewrite m n f #
Functions passed to mkBRewrite should not be aware of the fuel supply.
The result returned by mkBRewrite respects fuel.
analyzeAndRewriteBwd :: (CheckpointMonad m, NonLocal n, LabelsPtr entries) => BwdPass m n f -> MaybeC e entries -> Graph n e x -> Fact x f -> m (Graph n e x, FactBase f, MaybeO e f) #
if the graph being analyzed is open at the exit, I don't quite understand the implications of possible other exits
Instances
Instances
| Eq LabelSet # | |
| Ord LabelSet # | |
Defined in Compiler.Hoopl.Label | |
| Show LabelSet # | |
| IsSet LabelSet # | |
Defined in Compiler.Hoopl.Label Methods setMember :: ElemOf LabelSet -> LabelSet -> Bool # setSingleton :: ElemOf LabelSet -> LabelSet # setInsert :: ElemOf LabelSet -> LabelSet -> LabelSet # setDelete :: ElemOf LabelSet -> LabelSet -> LabelSet # setUnion :: LabelSet -> LabelSet -> LabelSet # setDifference :: LabelSet -> LabelSet -> LabelSet # setIntersection :: LabelSet -> LabelSet -> LabelSet # setIsSubsetOf :: LabelSet -> LabelSet -> Bool # setFold :: (ElemOf LabelSet -> b -> b) -> b -> LabelSet -> b # setElems :: LabelSet -> [ElemOf LabelSet] # setFromList :: [ElemOf LabelSet] -> LabelSet # | |
| LabelsPtr LabelSet # | |
Defined in Compiler.Hoopl.Graph Methods targetLabels :: LabelSet -> [Label] # | |
| type ElemOf LabelSet # | |
Defined in Compiler.Hoopl.Label | |
freshLabel :: UniqueMonad m => m Label #
lookupFact :: Label -> FactBase f -> Maybe f #
Adds top, bottom, or both to help form a lattice
The type parameters t and b are used to say whether top
and bottom elements have been added. The analogy with Block
is nearly exact:
- A
Blockis closed at the entry if and only if it has a first node; aPointedis closed at the top if and only if it has a top element. - A
Blockis closed at the exit if and only if it has a last node; aPointedis closed at the bottom if and only if it has a bottom element.
We thus have four possible types, of which three are interesting:
Pointed C C a- Type
aextended with both top and bottom elements. Pointed C O a- Type
aextended with a top element only. (Presumablyacomes equipped with a bottom element of its own.) Pointed O C a- Type
aextended with a bottom element only. Pointed O O a- Isomorphic to
a, and therefore not interesting.
The advantage of all this GADT-ishness is that the constructors
Bot, Top, and PElem can all be used polymorphically.
Instances
| Functor (Pointed t b) # | |
| Eq a => Eq (Pointed t b a) # | |
| Ord a => Ord (Pointed t b a) # | |
Defined in Compiler.Hoopl.Pointed Methods compare :: Pointed t b a -> Pointed t b a -> Ordering # (<) :: Pointed t b a -> Pointed t b a -> Bool # (<=) :: Pointed t b a -> Pointed t b a -> Bool # (>) :: Pointed t b a -> Pointed t b a -> Bool # (>=) :: Pointed t b a -> Pointed t b a -> Bool # | |
| Show a => Show (Pointed t b a) # | |
addPoints :: String -> JoinFun a -> DataflowLattice (Pointed t C a) #
Given a join function and a name, creates a semi lattice by
adding a bottom element, and possibly a top element also.
A specialized version of addPoints'.
addPoints' :: forall a t. String -> (Label -> OldFact a -> NewFact a -> (ChangeFlag, Pointed t C a)) -> DataflowLattice (Pointed t C a) #
A more general case for creating a new lattice
addTop :: DataflowLattice a -> DataflowLattice (WithTop a) #
Given a join function and a name, creates a semi lattice by adding a top element but no bottom element. Caller must supply the bottom element.
addTop' :: forall a. String -> a -> (Label -> OldFact a -> NewFact a -> (ChangeFlag, WithTop a)) -> DataflowLattice (WithTop a) #
A more general case for creating a new lattice
liftJoinTop :: JoinFun a -> JoinFun (WithTop a) #
extendJoinDomain :: forall a. (Label -> OldFact a -> NewFact a -> (ChangeFlag, WithTop a)) -> JoinFun (WithTop a) #
type WithTopAndBot a = Pointed C C a #
Type a with top and bottom elements adjoined
thenFwdRw :: forall m n f. Monad m => FwdRewrite m n f -> FwdRewrite m n f -> FwdRewrite m n f #
deepFwdRw3 :: FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> f -> m (Maybe (Graph n O C))) -> FwdRewrite m n f #
deepFwdRw :: FuelMonad m => (forall e x. n e x -> f -> m (Maybe (Graph n e x))) -> FwdRewrite m n f #
iterFwdRw :: forall m n f. Monad m => FwdRewrite m n f -> FwdRewrite m n f #
thenBwdRw :: forall m n f. Monad m => BwdRewrite m n f -> BwdRewrite m n f -> BwdRewrite m n f #
deepBwdRw3 :: FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> FactBase f -> m (Maybe (Graph n O C))) -> BwdRewrite m n f #
deepBwdRw :: FuelMonad m => (forall e x. n e x -> Fact x f -> m (Maybe (Graph n e x))) -> BwdRewrite m n f #
iterBwdRw :: forall m n f. Monad m => BwdRewrite m n f -> BwdRewrite m n f #
pairLattice :: forall f f'. DataflowLattice f -> DataflowLattice f' -> DataflowLattice (f, f') #
data InfiniteFuelMonad m a #
Instances
data CheckingFuelMonad m a #
Instances
class FuelMonadT fm where #
Minimal complete definition
Methods
runWithFuel :: (Monad m, FuelMonad (fm m)) => Fuel -> fm m a -> m a #
Instances
| FuelMonadT InfiniteFuelMonad # | |
Defined in Compiler.Hoopl.Fuel Methods runWithFuel :: (Monad m, FuelMonad (InfiniteFuelMonad m)) => Fuel -> InfiniteFuelMonad m a -> m a # liftFuel :: (Monad m, FuelMonad (InfiniteFuelMonad m)) => m a -> InfiniteFuelMonad m a # | |
| FuelMonadT CheckingFuelMonad # | |
Defined in Compiler.Hoopl.Fuel Methods runWithFuel :: (Monad m, FuelMonad (CheckingFuelMonad m)) => Fuel -> CheckingFuelMonad m a -> m a # liftFuel :: (Monad m, FuelMonad (CheckingFuelMonad m)) => m a -> CheckingFuelMonad m a # | |
class Monad m => FuelMonad m #
Minimal complete definition
getFuel, setFuel
Instances
| Monad m => FuelMonad (InfiniteFuelMonad m) # | |
Defined in Compiler.Hoopl.Fuel | |
| Monad m => FuelMonad (CheckingFuelMonad m) # | |
Defined in Compiler.Hoopl.Fuel | |
fuelRemaining :: FuelMonad m => m Fuel #
Find out how much fuel remains after a computation. Can be subtracted from initial fuel to get total consumption.
infiniteFuel :: Fuel #
data UniqueMonadT m a #
Instances
| Monad m => Monad (UniqueMonadT m) # | |
Defined in Compiler.Hoopl.Unique Methods (>>=) :: UniqueMonadT m a -> (a -> UniqueMonadT m b) -> UniqueMonadT m b # (>>) :: UniqueMonadT m a -> UniqueMonadT m b -> UniqueMonadT m b # return :: a -> UniqueMonadT m a # fail :: String -> UniqueMonadT m a # | |
| Monad m => Functor (UniqueMonadT m) # | |
Defined in Compiler.Hoopl.Unique Methods fmap :: (a -> b) -> UniqueMonadT m a -> UniqueMonadT m b # (<$) :: a -> UniqueMonadT m b -> UniqueMonadT m a # | |
| Monad m => Applicative (UniqueMonadT m) # | |
Defined in Compiler.Hoopl.Unique Methods pure :: a -> UniqueMonadT m a # (<*>) :: UniqueMonadT m (a -> b) -> UniqueMonadT m a -> UniqueMonadT m b # liftA2 :: (a -> b -> c) -> UniqueMonadT m a -> UniqueMonadT m b -> UniqueMonadT m c # (*>) :: UniqueMonadT m a -> UniqueMonadT m b -> UniqueMonadT m b # (<*) :: UniqueMonadT m a -> UniqueMonadT m b -> UniqueMonadT m a # | |
| Monad m => UniqueMonad (UniqueMonadT m) # | |
Defined in Compiler.Hoopl.Unique Methods freshUnique :: UniqueMonadT m Unique # | |
data SimpleUniqueMonad a #
Instances
class Monad m => UniqueMonad m where #
Minimal complete definition
Methods
freshUnique :: m Unique #
Instances
| UniqueMonad SimpleUniqueMonad # | |
Defined in Compiler.Hoopl.Unique Methods | |
| Monad m => UniqueMonad (UniqueMonadT m) # | |
Defined in Compiler.Hoopl.Unique Methods freshUnique :: UniqueMonadT m Unique # | |
| UniqueMonad m => UniqueMonad (InfiniteFuelMonad m) # | |
Defined in Compiler.Hoopl.Fuel Methods | |
| UniqueMonad m => UniqueMonad (CheckingFuelMonad m) # | |
Defined in Compiler.Hoopl.Fuel Methods | |
Instances
Instances
| Eq UniqueSet # | |
| Ord UniqueSet # | |
| Show UniqueSet # | |
| IsSet UniqueSet # | |
Defined in Compiler.Hoopl.Unique Methods setNull :: UniqueSet -> Bool # setMember :: ElemOf UniqueSet -> UniqueSet -> Bool # setSingleton :: ElemOf UniqueSet -> UniqueSet # setInsert :: ElemOf UniqueSet -> UniqueSet -> UniqueSet # setDelete :: ElemOf UniqueSet -> UniqueSet -> UniqueSet # setUnion :: UniqueSet -> UniqueSet -> UniqueSet # setDifference :: UniqueSet -> UniqueSet -> UniqueSet # setIntersection :: UniqueSet -> UniqueSet -> UniqueSet # setIsSubsetOf :: UniqueSet -> UniqueSet -> Bool # setFold :: (ElemOf UniqueSet -> b -> b) -> b -> UniqueSet -> b # setElems :: UniqueSet -> [ElemOf UniqueSet] # setFromList :: [ElemOf UniqueSet] -> UniqueSet # | |
| type ElemOf UniqueSet # | |
Defined in Compiler.Hoopl.Unique | |
intToUnique :: Int -> Unique #
runSimpleUniqueMonad :: SimpleUniqueMonad a -> a #
runUniqueMonadT :: Monad m => UniqueMonadT m a -> m a #
debugFwdJoins :: forall m n f. Show f => TraceFn -> ChangePred -> FwdPass m n f -> FwdPass m n f #
Debugging combinators: Each combinator takes a dataflow pass and produces a dataflow pass that can output debugging messages. You provide the function, we call it with the applicable message.
The most common use case is probably to:
- import
Trace - pass
traceas the 1st argument to the debug combinator - pass 'const true' as the 2nd argument to the debug combinator
There are two kinds of debugging messages for a join,
depending on whether the join is higher in the lattice than the old fact:
1. If the join is higher, we show:
+ JoinL: f1 L: f2 <= f1
where:
_ indicates no change
L is the label where the join takes place
f1 is the old fact at the label (which remains unchanged)
f2 is the new fact we joined with f1join f2 = f'
where:
+ indicates a change
L is the label where the join takes place
f1 is the old fact at the label
f2 is the new fact we are joining to f1
f' is the result of the join
2. _ Join
debugFwdTransfers :: forall m n f. Show f => TraceFn -> ShowN n -> FPred n f -> FwdPass m n f -> FwdPass m n f #
debugBwdTransfers :: forall m n f. Show f => TraceFn -> ShowN n -> BPred n f -> BwdPass m n f -> BwdPass m n f #
showFactBase :: Show f => FactBase f -> String #