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