hoopl-3.10.2.2: A library to support dataflow analysis and optimization

Safe HaskellSafe
LanguageHaskell2010

Compiler.Hoopl

Contents

Synopsis

Documentation

class LabelsPtr l where #

Minimal complete definition

targetLabels

Methods

targetLabels :: l -> [Label] #

Instances
LabelsPtr LabelSet # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

targetLabels :: LabelSet -> [Label] #

LabelsPtr Label # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

targetLabels :: Label -> [Label] #

LabelsPtr l => LabelsPtr [l] # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

targetLabels :: [l] -> [Label] #

NonLocal n => LabelsPtr (n e C) # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

targetLabels :: n e C -> [Label] #

class NonLocal thing where #

Gives access to the anchor points for nonlocal edges as well as the edges themselves

Minimal complete definition

entryLabel, successors

Methods

entryLabel #

Arguments

:: thing C x 
-> Label

The label of a first node or block

successors #

Arguments

:: thing e C 
-> [Label]

Gives control-flow successors

Instances
NonLocal n => NonLocal (Block n) # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

entryLabel :: Block n C x -> Label #

successors :: Block n e C -> [Label] #

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).

Constructors

GNil :: Graph' block n O O 
GUnit :: block n O O -> Graph' block n O O 
GMany :: MaybeO e (block n O C) -> Body' block n -> MaybeO x (block n C O) -> Graph' block n e x 

type Graph = Graph' Block #

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.

type Body' block (n :: * -> * -> *) = LabelMap (block n C C) #

Body abstracted over block

type Body n = LabelMap (Block n C C) #

A (possibly empty) collection of closed/closed blocks

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 #

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.)

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 #

Shapes

data O #

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 # 
Instance details

Defined in Compiler.Hoopl.MkGraph

Methods

mkIfThenElse :: HooplNode n => (Label -> Label -> AGraph n O C) -> AGraph n O O -> AGraph n O O -> AGraph n O O #

type Fact O f # 
Instance details

Defined in Compiler.Hoopl.Dataflow

type Fact O f = f
type IndexedCO O _a b # 
Instance details

Defined in Compiler.Hoopl.Block

type IndexedCO O _a b = b

data C #

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 # 
Instance details

Defined in Compiler.Hoopl.MkGraph

Methods

mkIfThenElse :: HooplNode n => (Label -> Label -> AGraph n O C) -> AGraph n O C -> AGraph n O C -> AGraph n O C #

NonLocal n => LabelsPtr (n e C) # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

targetLabels :: n e C -> [Label] #

type Fact C f # 
Instance details

Defined in Compiler.Hoopl.Dataflow

type Fact C f = FactBase f
type IndexedCO C a _b # 
Instance details

Defined in Compiler.Hoopl.Block

type IndexedCO C a _b = a

data MaybeO ex t where #

Maybe type indexed by open/closed

Constructors

JustO :: t -> MaybeO O t 
NothingO :: MaybeO C t 
Instances
Functor (MaybeO ex) # 
Instance details

Defined in Compiler.Hoopl.Block

Methods

fmap :: (a -> b) -> MaybeO ex a -> MaybeO ex b #

(<$) :: a -> MaybeO ex b -> MaybeO ex a #

data MaybeC ex t where #

Maybe type indexed by closed/open

Constructors

JustC :: t -> MaybeC C t 
NothingC :: MaybeC O t 
Instances
Functor (MaybeC ex) # 
Instance details

Defined in Compiler.Hoopl.Block

Methods

fmap :: (a -> b) -> MaybeC ex a -> MaybeC ex b #

(<$) :: a -> MaybeC ex b -> MaybeC ex a #

type family IndexedCO ex a b :: * #

Either type indexed by closed/open using type families

Instances
type IndexedCO C a _b # 
Instance details

Defined in Compiler.Hoopl.Block

type IndexedCO C a _b = a
type IndexedCO O _a b # 
Instance details

Defined in Compiler.Hoopl.Block

type IndexedCO O _a b = b

data Shape ex where #

Dynamic shape value

Constructors

Closed :: Shape C 
Open :: Shape O 

Blocks

data Block n e x where #

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) # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

entryLabel :: Block n C x -> Label #

successors :: Block n e C -> [Label] #

Predicates on Blocks

isEmptyBlock :: Block n e x -> Bool #

Constructing blocks

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 #

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.

blockAppend :: Block n e O -> Block n O x -> Block n e x #

Deconstructing blocks

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) #

Split a closed block into its entry node, open middle block, and exit node.

blockSplitAny :: Block n e x -> (MaybeC e (n C O), Block n O O, MaybeC x (n O C)) #

Modifying blocks

replaceFirstNode :: Block n C x -> n C O -> Block n C x #

replaceLastNode :: Block n x C -> n O C -> Block n x C #

Converting to and from lists

blockToList :: Block n O O -> [n O O] #

blockFromList :: [n O O] -> Block n O O #

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

mapBlock' :: (forall e x. n e x -> n' e x) -> Block n e x -> Block n' e x #

A strict mapBlock

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.

data AGraph n e x #

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) #

Take an abstract AGraph and make a concrete (if monadic) Graph.

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 |*><*|.

withFresh :: Uniques u => (u -> AGraph n e x) -> AGraph n e x #

mkFirst :: GraphRep g => n C O -> g n C O #

Create a graph from a first node

mkMiddle :: GraphRep g => n O O -> g n O O #

Create a graph from a middle node

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.

mkLast :: GraphRep g => n O C -> g n O C #

Create a graph from a last node

mkBranch :: (GraphRep g, HooplNode n) => Label -> g n O C #

Create a graph that branches to a label

mkLabel :: (GraphRep g, HooplNode n) => Label -> g n C O #

Create a graph that defines a label

mkWhileDo #

Arguments

:: HooplNode n 
=> (Label -> Label -> AGraph n O C)

loop condition

-> AGraph n O O

body of the loop

-> AGraph n O O

the final while loop

class IfThenElseable x where #

Minimal complete definition

mkIfThenElse

Methods

mkIfThenElse #

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 # 
Instance details

Defined in Compiler.Hoopl.MkGraph

Methods

mkIfThenElse :: HooplNode n => (Label -> Label -> AGraph n O C) -> AGraph n O C -> AGraph n O C -> AGraph n O C #

IfThenElseable O # 
Instance details

Defined in Compiler.Hoopl.MkGraph

Methods

mkIfThenElse :: HooplNode n => (Label -> Label -> AGraph n O C) -> AGraph n O O -> AGraph n O O -> AGraph n O O #

mkEntry :: GraphRep g => Block n O C -> g n O C #

Create a graph containing only an entry sequence

mkExit :: GraphRep g => Block n C O -> g n C O #

Create a graph containing only an exit sequence

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

mkBranchNode, mkLabelNode

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.

class IsSet set where #

Associated Types

type ElemOf set #

Methods

setNull :: set -> Bool #

setSize :: set -> Int #

setMember :: ElemOf set -> set -> Bool #

setEmpty :: set #

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
IsSet UniqueSet # 
Instance details

Defined in Compiler.Hoopl.Unique

Associated Types

type ElemOf UniqueSet :: * #

IsSet LabelSet # 
Instance details

Defined in Compiler.Hoopl.Label

Associated Types

type ElemOf LabelSet :: * #

setInsertList :: IsSet set => [ElemOf set] -> set -> set #

setDeleteList :: IsSet set => [ElemOf set] -> set -> set #

setUnions :: IsSet set => [set] -> set #

class IsMap map where #

Associated Types

type KeyOf map #

Methods

mapNull :: map a -> Bool #

mapSize :: map a -> Int #

mapMember :: KeyOf map -> map a -> Bool #

mapLookup :: KeyOf map -> map a -> Maybe a #

mapFindWithDefault :: a -> KeyOf map -> map a -> a #

mapEmpty :: map 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 #

mapElems :: map a -> [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
IsMap UniqueMap # 
Instance details

Defined in Compiler.Hoopl.Unique

Associated Types

type KeyOf UniqueMap :: * #

IsMap LabelMap # 
Instance details

Defined in Compiler.Hoopl.Label

Associated Types

type KeyOf LabelMap :: * #

Methods

mapNull :: LabelMap a -> Bool #

mapSize :: LabelMap a -> Int #

mapMember :: KeyOf LabelMap -> LabelMap a -> Bool #

mapLookup :: KeyOf LabelMap -> LabelMap a -> Maybe a #

mapFindWithDefault :: a -> KeyOf LabelMap -> LabelMap a -> a #

mapEmpty :: LabelMap a #

mapSingleton :: KeyOf LabelMap -> a -> LabelMap a #

mapInsert :: KeyOf LabelMap -> a -> LabelMap a -> LabelMap a #

mapInsertWith :: (a -> a -> a) -> KeyOf LabelMap -> a -> LabelMap a -> LabelMap a #

mapDelete :: KeyOf LabelMap -> LabelMap a -> LabelMap a #

mapUnion :: LabelMap a -> LabelMap a -> LabelMap a #

mapUnionWithKey :: (KeyOf LabelMap -> a -> a -> a) -> LabelMap a -> LabelMap a -> LabelMap a #

mapDifference :: LabelMap a -> LabelMap a -> LabelMap a #

mapIntersection :: LabelMap a -> LabelMap a -> LabelMap a #

mapIsSubmapOf :: Eq a => LabelMap a -> LabelMap a -> Bool #

mapMap :: (a -> b) -> LabelMap a -> LabelMap b #

mapMapWithKey :: (KeyOf LabelMap -> a -> b) -> LabelMap a -> LabelMap b #

mapFold :: (a -> b -> b) -> b -> LabelMap a -> b #

mapFoldWithKey :: (KeyOf LabelMap -> a -> b -> b) -> b -> LabelMap a -> b #

mapFilter :: (a -> Bool) -> LabelMap a -> LabelMap a #

mapElems :: LabelMap a -> [a] #

mapKeys :: LabelMap a -> [KeyOf LabelMap] #

mapToList :: LabelMap a -> [(KeyOf LabelMap, a)] #

mapFromList :: [(KeyOf LabelMap, a)] -> LabelMap a #

mapFromListWith :: (a -> a -> a) -> [(KeyOf LabelMap, a)] -> LabelMap a #

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 #

Obeys the following law: for all m do { s <- checkpoint; m; restart s } == return ()

Minimal complete definition

checkpoint, restart

Associated Types

type Checkpoint m #

Methods

checkpoint :: m (Checkpoint m) #

restart :: Checkpoint m -> m () #

newtype BwdRewrite m n f #

Constructors

BwdRewrite3 

Fields

newtype BwdTransfer n f #

Constructors

BwdTransfer3 

Fields

data BwdPass m n f #

Constructors

BwdPass 

type family Fact x f :: * #

Instances
type Fact C f # 
Instance details

Defined in Compiler.Hoopl.Dataflow

type Fact C f = FactBase f
type Fact O f # 
Instance details

Defined in Compiler.Hoopl.Dataflow

type Fact O f = f

newtype FwdRewrite m n f #

Constructors

FwdRewrite3 

Fields

newtype FwdTransfer n f #

Constructors

FwdTransfer3 

Fields

data FwdPass m n f #

Constructors

FwdPass 

newtype NewFact a #

Constructors

NewFact a 

newtype OldFact a #

Constructors

OldFact a 

type JoinFun a = Label -> OldFact a -> NewFact a -> (ChangeFlag, a) #

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.

Constructors

DataflowLattice 

Fields

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.

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.

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

type FactBase f = LabelMap f #

data LabelMap v #

Instances
Functor LabelMap # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

fmap :: (a -> b) -> LabelMap a -> LabelMap b #

(<$) :: a -> LabelMap b -> LabelMap a #

Foldable LabelMap # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

fold :: Monoid m => LabelMap m -> m #

foldMap :: Monoid m => (a -> m) -> LabelMap a -> m #

foldr :: (a -> b -> b) -> b -> LabelMap a -> b #

foldr' :: (a -> b -> b) -> b -> LabelMap a -> b #

foldl :: (b -> a -> b) -> b -> LabelMap a -> b #

foldl' :: (b -> a -> b) -> b -> LabelMap a -> b #

foldr1 :: (a -> a -> a) -> LabelMap a -> a #

foldl1 :: (a -> a -> a) -> LabelMap a -> a #

toList :: LabelMap a -> [a] #

null :: LabelMap a -> Bool #

length :: LabelMap a -> Int #

elem :: Eq a => a -> LabelMap a -> Bool #

maximum :: Ord a => LabelMap a -> a #

minimum :: Ord a => LabelMap a -> a #

sum :: Num a => LabelMap a -> a #

product :: Num a => LabelMap a -> a #

Traversable LabelMap # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

traverse :: Applicative f => (a -> f b) -> LabelMap a -> f (LabelMap b) #

sequenceA :: Applicative f => LabelMap (f a) -> f (LabelMap a) #

mapM :: Monad m => (a -> m b) -> LabelMap a -> m (LabelMap b) #

sequence :: Monad m => LabelMap (m a) -> m (LabelMap a) #

IsMap LabelMap # 
Instance details

Defined in Compiler.Hoopl.Label

Associated Types

type KeyOf LabelMap :: * #

Methods

mapNull :: LabelMap a -> Bool #

mapSize :: LabelMap a -> Int #

mapMember :: KeyOf LabelMap -> LabelMap a -> Bool #

mapLookup :: KeyOf LabelMap -> LabelMap a -> Maybe a #

mapFindWithDefault :: a -> KeyOf LabelMap -> LabelMap a -> a #

mapEmpty :: LabelMap a #

mapSingleton :: KeyOf LabelMap -> a -> LabelMap a #

mapInsert :: KeyOf LabelMap -> a -> LabelMap a -> LabelMap a #

mapInsertWith :: (a -> a -> a) -> KeyOf LabelMap -> a -> LabelMap a -> LabelMap a #

mapDelete :: KeyOf LabelMap -> LabelMap a -> LabelMap a #

mapUnion :: LabelMap a -> LabelMap a -> LabelMap a #

mapUnionWithKey :: (KeyOf LabelMap -> a -> a -> a) -> LabelMap a -> LabelMap a -> LabelMap a #

mapDifference :: LabelMap a -> LabelMap a -> LabelMap a #

mapIntersection :: LabelMap a -> LabelMap a -> LabelMap a #

mapIsSubmapOf :: Eq a => LabelMap a -> LabelMap a -> Bool #

mapMap :: (a -> b) -> LabelMap a -> LabelMap b #

mapMapWithKey :: (KeyOf LabelMap -> a -> b) -> LabelMap a -> LabelMap b #

mapFold :: (a -> b -> b) -> b -> LabelMap a -> b #

mapFoldWithKey :: (KeyOf LabelMap -> a -> b -> b) -> b -> LabelMap a -> b #

mapFilter :: (a -> Bool) -> LabelMap a -> LabelMap a #

mapElems :: LabelMap a -> [a] #

mapKeys :: LabelMap a -> [KeyOf LabelMap] #

mapToList :: LabelMap a -> [(KeyOf LabelMap, a)] #

mapFromList :: [(KeyOf LabelMap, a)] -> LabelMap a #

mapFromListWith :: (a -> a -> a) -> [(KeyOf LabelMap, a)] -> LabelMap a #

Eq v => Eq (LabelMap v) # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

(==) :: LabelMap v -> LabelMap v -> Bool #

(/=) :: LabelMap v -> LabelMap v -> Bool #

Ord v => Ord (LabelMap v) # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

compare :: LabelMap v -> LabelMap v -> Ordering #

(<) :: LabelMap v -> LabelMap v -> Bool #

(<=) :: LabelMap v -> LabelMap v -> Bool #

(>) :: LabelMap v -> LabelMap v -> Bool #

(>=) :: LabelMap v -> LabelMap v -> Bool #

max :: LabelMap v -> LabelMap v -> LabelMap v #

min :: LabelMap v -> LabelMap v -> LabelMap v #

Show v => Show (LabelMap v) # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

showsPrec :: Int -> LabelMap v -> ShowS #

show :: LabelMap v -> String #

showList :: [LabelMap v] -> ShowS #

type KeyOf LabelMap # 
Instance details

Defined in Compiler.Hoopl.Label

data LabelSet #

Instances
Eq LabelSet # 
Instance details

Defined in Compiler.Hoopl.Label

Ord LabelSet # 
Instance details

Defined in Compiler.Hoopl.Label

Show LabelSet # 
Instance details

Defined in Compiler.Hoopl.Label

IsSet LabelSet # 
Instance details

Defined in Compiler.Hoopl.Label

Associated Types

type ElemOf LabelSet :: * #

LabelsPtr LabelSet # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

targetLabels :: LabelSet -> [Label] #

type ElemOf LabelSet # 
Instance details

Defined in Compiler.Hoopl.Label

data Label #

Instances
Eq Label # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

(==) :: Label -> Label -> Bool #

(/=) :: Label -> Label -> Bool #

Ord Label # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

compare :: Label -> Label -> Ordering #

(<) :: Label -> Label -> Bool #

(<=) :: Label -> Label -> Bool #

(>) :: Label -> Label -> Bool #

(>=) :: Label -> Label -> Bool #

max :: Label -> Label -> Label #

min :: Label -> Label -> Label #

Show Label # 
Instance details

Defined in Compiler.Hoopl.Label

Methods

showsPrec :: Int -> Label -> ShowS #

show :: Label -> String #

showList :: [Label] -> ShowS #

LabelsPtr Label # 
Instance details

Defined in Compiler.Hoopl.Graph

Methods

targetLabels :: Label -> [Label] #

data Pointed t b a where #

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 Block is closed at the entry if and only if it has a first node; a Pointed is closed at the top if and only if it has a top element.
  • A Block is closed at the exit if and only if it has a last node; a Pointed is 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 a extended with both top and bottom elements.
Pointed C O a
Type a extended with a top element only. (Presumably a comes equipped with a bottom element of its own.)
Pointed O C a
Type a extended 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.

A 'Pointed t b' type is an instance of Functor and Show.

Constructors

Bot :: Pointed t C a 
PElem :: a -> Pointed t b a 
Top :: Pointed C b a 
Instances
Functor (Pointed t b) # 
Instance details

Defined in Compiler.Hoopl.Pointed

Methods

fmap :: (a -> b0) -> Pointed t b a -> Pointed t b b0 #

(<$) :: a -> Pointed t b b0 -> Pointed t b a #

Eq a => Eq (Pointed t b a) # 
Instance details

Defined in Compiler.Hoopl.Pointed

Methods

(==) :: Pointed t b a -> Pointed t b a -> Bool #

(/=) :: Pointed t b a -> Pointed t b a -> Bool #

Ord a => Ord (Pointed t b a) # 
Instance details

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 #

max :: Pointed t b a -> Pointed t b a -> Pointed t b a #

min :: Pointed t b a -> Pointed t b a -> Pointed t b a #

Show a => Show (Pointed t b a) # 
Instance details

Defined in Compiler.Hoopl.Pointed

Methods

showsPrec :: Int -> Pointed t b a -> ShowS #

show :: Pointed t b a -> String #

showList :: [Pointed t b a] -> ShowS #

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

extendJoinDomain :: forall a. (Label -> OldFact a -> NewFact a -> (ChangeFlag, WithTop a)) -> JoinFun (WithTop a) #

type WithTop a = Pointed C O a #

Type a with a top element adjoined

type WithBot a = Pointed O C a #

Type a with a bottom element adjoined

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 #

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') #

data InfiniteFuelMonad m a #

Instances
FuelMonadT InfiniteFuelMonad # 
Instance details

Defined in Compiler.Hoopl.Fuel

Monad m => Monad (InfiniteFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Monad m => Functor (InfiniteFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Methods

fmap :: (a -> b) -> InfiniteFuelMonad m a -> InfiniteFuelMonad m b #

(<$) :: a -> InfiniteFuelMonad m b -> InfiniteFuelMonad m a #

Monad m => Applicative (InfiniteFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

CheckpointMonad m => CheckpointMonad (InfiniteFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Associated Types

type Checkpoint (InfiniteFuelMonad m) :: * #

UniqueMonad m => UniqueMonad (InfiniteFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Monad m => FuelMonad (InfiniteFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

type Checkpoint (InfiniteFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

data CheckingFuelMonad m a #

Instances
FuelMonadT CheckingFuelMonad # 
Instance details

Defined in Compiler.Hoopl.Fuel

Monad m => Monad (CheckingFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Monad m => Functor (CheckingFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Methods

fmap :: (a -> b) -> CheckingFuelMonad m a -> CheckingFuelMonad m b #

(<$) :: a -> CheckingFuelMonad m b -> CheckingFuelMonad m a #

Monad m => Applicative (CheckingFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

CheckpointMonad m => CheckpointMonad (CheckingFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Associated Types

type Checkpoint (CheckingFuelMonad m) :: * #

UniqueMonad m => UniqueMonad (CheckingFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Monad m => FuelMonad (CheckingFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

type Checkpoint (CheckingFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

type Fuel = Int #

class FuelMonadT fm where #

Minimal complete definition

runWithFuel, liftFuel

Methods

runWithFuel :: (Monad m, FuelMonad (fm m)) => Fuel -> fm m a -> m a #

liftFuel :: (Monad m, FuelMonad (fm m)) => m a -> fm m a #

class Monad m => FuelMonad m #

Minimal complete definition

getFuel, setFuel

Instances
Monad m => FuelMonad (InfiniteFuelMonad m) # 
Instance details

Defined in Compiler.Hoopl.Fuel

Monad m => FuelMonad (CheckingFuelMonad m) # 
Instance details

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.

data UniqueMonadT m a #

Instances
Monad m => Monad (UniqueMonadT m) # 
Instance details

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) # 
Instance details

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) # 
Instance details

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) # 
Instance details

Defined in Compiler.Hoopl.Unique

data SimpleUniqueMonad a #

Instances
Monad SimpleUniqueMonad # 
Instance details

Defined in Compiler.Hoopl.Unique

Functor SimpleUniqueMonad # 
Instance details

Defined in Compiler.Hoopl.Unique

Applicative SimpleUniqueMonad # 
Instance details

Defined in Compiler.Hoopl.Unique

CheckpointMonad SimpleUniqueMonad # 
Instance details

Defined in Compiler.Hoopl.Unique

Associated Types

type Checkpoint SimpleUniqueMonad :: * #

UniqueMonad SimpleUniqueMonad # 
Instance details

Defined in Compiler.Hoopl.Unique

type Checkpoint SimpleUniqueMonad # 
Instance details

Defined in Compiler.Hoopl.Unique

class Monad m => UniqueMonad m where #

Minimal complete definition

freshUnique

Methods

freshUnique :: m Unique #

data UniqueMap v #

Instances
Functor UniqueMap # 
Instance details

Defined in Compiler.Hoopl.Unique

Methods

fmap :: (a -> b) -> UniqueMap a -> UniqueMap b #

(<$) :: a -> UniqueMap b -> UniqueMap a #

Foldable UniqueMap # 
Instance details

Defined in Compiler.Hoopl.Unique

Methods

fold :: Monoid m => UniqueMap m -> m #

foldMap :: Monoid m => (a -> m) -> UniqueMap a -> m #

foldr :: (a -> b -> b) -> b -> UniqueMap a -> b #

foldr' :: (a -> b -> b) -> b -> UniqueMap a -> b #

foldl :: (b -> a -> b) -> b -> UniqueMap a -> b #

foldl' :: (b -> a -> b) -> b -> UniqueMap a -> b #

foldr1 :: (a -> a -> a) -> UniqueMap a -> a #

foldl1 :: (a -> a -> a) -> UniqueMap a -> a #

toList :: UniqueMap a -> [a] #

null :: UniqueMap a -> Bool #

length :: UniqueMap a -> Int #

elem :: Eq a => a -> UniqueMap a -> Bool #

maximum :: Ord a => UniqueMap a -> a #

minimum :: Ord a => UniqueMap a -> a #

sum :: Num a => UniqueMap a -> a #

product :: Num a => UniqueMap a -> a #

Traversable UniqueMap # 
Instance details

Defined in Compiler.Hoopl.Unique

Methods

traverse :: Applicative f => (a -> f b) -> UniqueMap a -> f (UniqueMap b) #

sequenceA :: Applicative f => UniqueMap (f a) -> f (UniqueMap a) #

mapM :: Monad m => (a -> m b) -> UniqueMap a -> m (UniqueMap b) #

sequence :: Monad m => UniqueMap (m a) -> m (UniqueMap a) #

IsMap UniqueMap # 
Instance details

Defined in Compiler.Hoopl.Unique

Associated Types

type KeyOf UniqueMap :: * #

Eq v => Eq (UniqueMap v) # 
Instance details

Defined in Compiler.Hoopl.Unique

Methods

(==) :: UniqueMap v -> UniqueMap v -> Bool #

(/=) :: UniqueMap v -> UniqueMap v -> Bool #

Ord v => Ord (UniqueMap v) # 
Instance details

Defined in Compiler.Hoopl.Unique

Show v => Show (UniqueMap v) # 
Instance details

Defined in Compiler.Hoopl.Unique

type KeyOf UniqueMap # 
Instance details

Defined in Compiler.Hoopl.Unique

data UniqueSet #

Instances
Eq UniqueSet # 
Instance details

Defined in Compiler.Hoopl.Unique

Ord UniqueSet # 
Instance details

Defined in Compiler.Hoopl.Unique

Show UniqueSet # 
Instance details

Defined in Compiler.Hoopl.Unique

IsSet UniqueSet # 
Instance details

Defined in Compiler.Hoopl.Unique

Associated Types

type ElemOf UniqueSet :: * #

type ElemOf UniqueSet # 
Instance details

Defined in Compiler.Hoopl.Unique

type Unique = Int #

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 #

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:

  1. import Trace
  2. pass trace as the 1st argument to the debug combinator
  3. 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 join 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. _ JoinL: 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 f1

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 #

type Showing n = forall e x. n e x -> String #