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