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