summaryrefslogtreecommitdiff
path: root/compiler/cmm/README
blob: c0d1c68f0ce7967a5fd12b12076207d2371056d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Sketch of the new arrivals:

  MkZipCfg       Constructor functions for control-flow graphs.
                 Not understandable in its entirety without reference
                 to ZipCfg, but nevertheless a worthy starting point,
                 as it is a good deal simpler than full ZipCfg.
                 MkZipCfg is polymorphic in the types of middle and last
                 nodes. 

  ZipCfg         Describes a zipper-like representation for true basic-block
                 control-flow graphs.  A block has a single entry point,
                 which is a always a label, followed by zero or mode 'middle
                 nodes', each of which represents an uninterruptible
                 single-entry, single-exit computation, then finally a 'last
                 node', which may have zero or more successors.  A special
                 'exit node' is used for splicing together graphs.

                 In addition to three representations of flow graphs, the
                 module provides a surfeit of functions for observing and
                 modifying graphs and related data:
                   - Block IDs, sets and environments thereof
                   - supply of fresh block IDS (as String -> UniqSM BlockId)
                   - myriad functions for splicing graphs
                   - postorder_dfs layout of blocks
                   - folding, mapping, and translation functions

                 ZipCFG is polymorphic in the type of middle and last nodes.

  CmmExpr        Code for C-- expressions, which is shared among old and new
                 representations of flow graphs.  Of primary interest is the
                 type class UserOfLocalRegs and its method foldRegsUsed,
                 which is sufficiently overloaded to be used against
                 expressions, statements, formals, hinted formals, and so
                 on.  This overloading greatly clarifies the computation of
                 liveness as well as some other analyses.

  ZipCfgCmm      Types to instantiate ZipCfg for C--: middle and last nodes,
                 and a bunch of abbreviations of types in ZipCfg and Cmm.
                 Also provides suitable constructor functions for building
                 graphs from Cmm statements.

  CmmLiveZ       A good example of a very simple dataflow analysis.  It
                 computes the set of live local registers at each point.

  DFMonad        Support for dataflow analysis and dataflow-based
                 transformation.   This module needs work.  Includes 
                   DataflowLattice - for tracking dataflow facts (good)
                   DFA - monad for iterative dataflow analysis (OK)
                   DFM - monad for iterative dataflow analysis and rewriting (OK)
                   DFTx - monad to track Whalley/Davidson transactions (ugly)
                   type class DataflowAnalysis - operations common to DFA, DFM
                 Some dodgy bits are 
                   subAnalysis, which may not be right

  ZipDataflow    Iteratively solve forward and backward dataflow problems over
                 flow graphs.  Polymorphic in the type of graph and in the
                 lattice of dataflow facts.   Supports the incremental
                 rewriting technique described by Lerner, Grove, and Chambers
                 in POPL 2002.  The code is a mess and is still being
                 sorted out.


  CmmTx          A simple monad for tracking when a transformation has
                 occurred (something has changed).

  CmmCvt         Converts between Cmm and ZipCfgCmm representations.

  CmmProcPointZ  One module that performs three analyses and
                 transformations:

                    1. Using Michael Adams's iterative algorithm, computes a
                       minimal set of proc points that enable code to be
                       generated without copying any basic blocks.

                    2. Assigns a protocol to each proc point.  The assigner
                       is rigged to enable the 'Adams optimization' whereby
                       we attempt to eliminate return continuations by
                       making procedures return directly to join points.
                       Arguably this could be done by a separate rewriting
                       pass to perform earlier.

                    3. Insert CopyIn and CopyOut nodes where needed
                       according to the protocols.

  CmmSpillReload Inserts spills and reloads to establish the invariant that
                 at a safe call, there are no live variables in registers.

  CmmCPSZ        The CPS transformation so far.

  CmmContFlowOpt Branch-chain elimination and elimination of unreachable code.

  CmmCvt         Conversion to and from the new format.

  CmmOpt         Changed optimization to use 'foldRegsUsed'; eliminated
                 significant duplication of code.

  PprCmmZ        Prettyprinting functions related to ZipCfg and ZipCfgCmm