Does Hoopl handle Bottom internally? By "Bottom" I mean the loop-breaking thing that means "this predecessor does not execute". From the debugging output I added to my code it looks that it in fact does because it doesn't do a join when first analyzing a block with two predecessors. If this is really the case then what is the purpose of defining bottom in DataflowLattice? Janek ----- Oryginalna wiadomość ----- Od: "Edward Z. Yang" <ezyang@MIT.EDU> Do: "Jan Stolarek" <jan.stolarek@p.lodz.pl> DW: "Simon Peyton-Jones" <simonpj@microsoft.com>, "ghc-devs" <ghc-devs@haskell.org> Wysłane: wtorek, 30 lipiec 2013 20:40:53 Temat: Re: Two Hoopl questions What happens when you put a loop in your code? Edward Excerpts from Jan Stolarek's message of Tue Jul 30 08:34:44 -0700 2013:
I'll allow myself to ask my second question again:
2) In my algorithm I need to initialize all of the blocks in a graph with bottom element of a lattice, except for the entry block, which needs some other initial values. I've written something like this:
cmmCopyPropagation dflags graph = do let entry_blk = g_entry graph g' <- dataflowPassFwd graph [(entry_blk, (Top, Top))] $ analRewFwd cpLattice cpTransfer cpRewrite return . fst $ g'
cpLattice = DataflowLattice "copy propagation" (Bottom, Bottom) cpJoin
However, it seems that Bottom values passed to cpLattice are ignored - I could replace second parameter to DataflowLattice with `undefined` and the code would still run without causing an error. Is there something obviously wrong in the way I pass initial fact values to dataflowPassFwd, or should I look for the problem in other parts of my code?
Janek