GHC.Cmm.Dataflow.Graph

ghc-lib-parser-9.10.1.20250103: The GHC API, decoupled from GHC versions

Safe Haskell | Ignore
Language | GHC2021

GHC.Cmm.Dataflow.Graph

Synopsis

- type Body (n :: Extensibility -> Extensibility -> Type) = LabelMap (Block n C C)
- type Graph = Graph' Block
- data Graph' (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type) (e :: Extensibility) (x :: Extensibility) where
  - GNil :: forall (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type). Graph' block n 'Open 'Open
  - GUnit :: forall (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type). block n O O -> Graph' block n 'Open 'Open
  - GMany :: forall (e :: Extensibility) (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type) (x :: Extensibility). MaybeO e (block n O C) -> Body' block n -> MaybeO x (block n C O) -> Graph' block n e x
- class NonLocal (thing :: Extensibility -> Extensibility -> Type) where
  - entryLabel :: forall (x :: Extensibility). thing C x -> Label
  - successors :: forall (e :: Extensibility). thing e C -> [Label]
- addBlock :: (NonLocal block, HasDebugCallStack) => block C C -> LabelMap (block C C) -> LabelMap (block C C)
- bodyList :: forall block (n :: Extensibility -> Extensibility -> Type). Body' block n -> [(Label, block n C C)]
- bodyToBlockList :: forall (n :: Extensibility -> Extensibility -> Type). Body n -> [Block n C C]
- emptyBody :: forall block (n :: Extensibility -> Extensibility -> Type). Body' block n
- labelsDefined :: forall (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type) (e :: Extensibility) (x :: Extensibility). NonLocal (block n) => Graph' block n e x -> LabelSet
- mapGraph :: forall n n' (e :: Extensibility) (x :: Extensibility). (forall (e1 :: Extensibility) (x1 :: Extensibility). n e1 x1 -> n' e1 x1) -> Graph n e x -> Graph n' e x
- mapGraphBlocks :: forall block (n :: Extensibility -> Extensibility -> Type) block' (n' :: Extensibility -> Extensibility -> Type) (e :: Extensibility) (x :: Extensibility). (forall (e1 :: Extensibility) (x1 :: Extensibility). block n e1 x1 -> block' n' e1 x1) -> Graph' block n e x -> Graph' block' n' e x
- revPostorderFrom :: NonLocal block => LabelMap (block C C) -> Label -> [block C C]

# Documentation

type Body (n :: Extensibility -> Extensibility -> Type) = LabelMap (Block n C C) #

A (possibly empty) collection of closed/closed blocks

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.

data Graph' (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type) (e :: Extensibility) (x :: Extensibility) 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 :: forall (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type). Graph' block n 'Open 'Open |
GUnit :: forall (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type). block n O O -> Graph' block n 'Open 'Open |
GMany :: forall (e :: Extensibility) (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type) (x :: Extensibility). MaybeO e (block n O C) -> Body' block n -> MaybeO x (block n C O) -> Graph' block n e x |

#### Instances

Instances details

OutputableP Platform (Graph CmmNode e x) # |
Instance details Defined in GHC.Cmm.Node Methods pdoc :: Platform -> Graph CmmNode e x -> SDoc #

class NonLocal (thing :: Extensibility -> Extensibility -> Type) where #

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

Methods

entryLabel #

Arguments

:: forall (x :: Extensibility). thing C x |
-> Label | The label of a first node or block

successors #

Arguments

:: forall (e :: Extensibility). thing e C |
-> [Label] | Gives control-flow successors

#### Instances

Instances details

NonLocal CmmNode # |
Instance details Defined in GHC.Cmm.Node Methods entryLabel :: forall (x :: Extensibility). CmmNode C x -> Label # successors :: forall (e :: Extensibility). CmmNode e C -> [Label] #
NonLocal n => NonLocal (Block n) # |
Instance details Defined in GHC.Cmm.Dataflow.Graph Methods entryLabel :: forall (x :: Extensibility). Block n C x -> Label # successors :: forall (e :: Extensibility). Block n e C -> [Label] #

addBlock :: (NonLocal block, HasDebugCallStack) => block C C -> LabelMap (block C C) -> LabelMap (block C C) #

bodyList :: forall block (n :: Extensibility -> Extensibility -> Type). Body' block n -> [(Label, block n C C)] #

bodyToBlockList :: forall (n :: Extensibility -> Extensibility -> Type). Body n -> [Block n C C] #

emptyBody :: forall block (n :: Extensibility -> Extensibility -> Type). Body' block n #

labelsDefined :: forall (block :: (Extensibility -> Extensibility -> Type) -> Extensibility -> Extensibility -> Type) (n :: Extensibility -> Extensibility -> Type) (e :: Extensibility) (x :: Extensibility). NonLocal (block n) => Graph' block n e x -> LabelSet #

mapGraph :: forall n n' (e :: Extensibility) (x :: Extensibility). (forall (e1 :: Extensibility) (x1 :: Extensibility). n e1 x1 -> n' e1 x1) -> Graph n e x -> Graph n' e x #

Maps over all nodes in a graph.

mapGraphBlocks :: forall block (n :: Extensibility -> Extensibility -> Type) block' (n' :: Extensibility -> Extensibility -> Type) (e :: Extensibility) (x :: Extensibility). (forall (e1 :: Extensibility) (x1 :: Extensibility). block n e1 x1 -> block' n' e1 x1) -> 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.

revPostorderFrom :: NonLocal block => LabelMap (block C C) -> Label -> [block C C] #

Returns a list of blocks reachable from the provided Labels in the reverse postorder.

This is the most important traversal over this data structure. It drops unreachable code and puts blocks in an order that is good for solving forward dataflow problems quickly. The reverse order is good for solving backward dataflow problems quickly. The forward order is also reasonably good for emitting instructions, except that it will not usually exploit Forrest Baskett's trick of eliminating the unconditional branch from a loop. For that you would need a more serious analysis, probably based on dominators, to identify loop headers.

For forward analyses we want reverse postorder visitation, consider: `A -> [B,C] B -> D C -> D` Postorder: [D, C, B, A] (or [D, B, C, A]) Reverse postorder: [A, B, C, D] (or [A, C, B, D]) This matters for, e.g., forward analysis, because we want to analyze *both* B and C before we analyze D.