added documentation and info to the change log
[packages/hoopl.git] / src / CHANGES
1 3.7.12.3
2
3   Updates to Hoopl in the last week
4   =================================
5
6
7   Interface changes
8   -----------------
9   The type of AGraph is now abstract.
10   It is now recommended to create AGraphs with just three functions:
11
12     <*>          concatenation
13     |*><*|       splicing at a closed point
14     addBlocks    add C/C blocks out of line
15
16   There are new utility functions in modules Util and XUtil, all
17   exported by Compiler.Hoopl.  Here's a selection:
18
19     -- | A utility function so that a transfer function for a first
20     -- node can be given just a fact; we handle the lookup.  This
21     -- function is planned to be made obsolete by changes in the dataflow
22     -- interface.
23     firstXfer :: Edges n => (n C O -> f -> f) -> (n C O -> FactBase f -> f)
24     firstXfer xfer n fb = xfer n $ fromJust $ lookupFact fb $ entryLabel n
25     
26     -- | This utility function handles a common case in which a transfer function
27     -- produces a single fact out of a last node, which is then distributed
28     -- over the outgoing edges.
29     distributeXfer :: Edges n => (n O C -> f -> f) -> (n O C -> f -> FactBase f)
30     distributeXfer xfer n f = mkFactBase [ (l, xfer n f) | l <- successors n ]
31     
32     -- | This utility function handles a common case in which a transfer function
33     -- for a last node takes the incoming fact unchanged and simply distributes
34     -- that fact over the outgoing edges.
35     distributeFact :: Edges n => n O C -> f -> FactBase f
36
37     -- | Function 'graphMapBlocks' enables a change of representation of blocks,
38     -- nodes, or both.  It lifts a polymorphic block transform into a polymorphic
39     -- graph transform.  When the block representation stabilizes, a similar
40     -- function should be provided for blocks.
41     graphMapBlocks :: forall block n block' n' e x .
42                       (forall e x . block n e x -> block' n' e x)
43                    -> (Graph' block n e x -> Graph' block' n' e x)
44
45     postorder_dfs :: Edges (block n) => Graph' block n O x -> [block n C C]
46
47   There are quite a few other variations related to depth-first traversal.
48
49
50   There is a new module Compiler.Hoopl.Pointed, which uses GADTs to
51   enable you to add a Top or Bot element to a lattice, or both, all
52   using the same type.  (Types 'WithBot' and 'WithTop' in XUtil,
53   exported by Compiler.Hoopl, do similar jobs, but I think they are
54   inferior.  Your opinion is solicited.)
55
56   I added a function showGraph to print Graphs.  Right now it requires a
57   polymorphic node-showing function as argument. When we change the
58   Block representation we may get enough static type information that we
59   can simply have an instance declaration for 
60
61     instance (Show n C O, Show n O O, Show n O C) => Show (Graph n e x)
62
63   At present, I don't see how to achieve such a declaration.
64
65
66   John added new functions 'debugFwdJoins' and 'debugBwdJoins' to extend
67   passes with debugging information.
68
69   We added primed versions of the analyzeAndRewrite functions, which
70   operate on Graph, not Body.  Recommended, at least for first-timers.
71
72   Not all maps keyed by Label are FactBases, so there is now a new set
73   of names of functions to manipulate LabelMaps that do not contain
74   dataflow facts.
75
76
77
78   Implementation changes
79   ----------------------
80   Split pass and rewrite-function combinators into Compiler.Hoopl.Combinators.
81
82   Changed order of blocks for forward and backward analysis.
83   These changes have not been tested, because we don't have a true
84   regression suite yet.
85
86   Graph and Body types now have more polymorphic variants Graph' and Body'.
87
88   Lots of experiments with zippers.
89
90
91
92   Changes ahead
93   -------------
94   ForwardTransfer will become an abstract type, and clients will have
95   two ways to create ForwardTransfers: as now, with a single,
96   polymorphic transfer function; or with a triple of monomorphic
97   transfer functions.  The implementation will use monomorphic
98   functions, which will enable more useful combinators on passes,
99   including adding more debugging information and enabling us to combine
100   passes. 
101
102   Perhaps we should provide splicing and 'addBlocks' on Graph?
103
104   Change of block representation to have three monomorphic unit
105   constructors and one polymorphic concatenation constructor.
106
107   Graph body to be represented by a finite map; add functions to check
108   for duplicate labels.
109
110 3.7.12.1
111
112   - Added a bunch of zipper experiments.
113   - Existing clients should not be affected.
114
115
116 3.7.12.0
117
118   - More expressive debugging support
119   - retract arfGraph and normalization; export analyzeAndRewriterFwd'
120
121 3.7.11.1
122
123   - Expose arfGraph and normalization functions
124
125 3.7.11.0
126
127   - Debugging support
128
129 3.7.8.0
130
131   - Rationalized AGraph splicing functions.
132
133 3.7.7.0
134
135   - Restrict clients so they see much less, including hiding
136     the value constructors for Body.
137
138