Yet Another Hoopl Question

Edward Z. Yang ezyang at MIT.EDU
Tue Aug 13 15:32:00 CEST 2013

Forgive me for asking the classic question: "What are you really trying to do?"


Excerpts from Simon Marlow's message of Tue Aug 13 09:25:51 -0400 2013:
> On 13/08/13 13:03, Jan Stolarek wrote:
> > I have yet another Hoopl question. One of my rewrites allocates a new unique local register and this register is later added as a fact. So I have Cmm code that looks like this:
> >
> >    I32[(old + 4)] = complicated_expr
> >
> > which is rewritten to:
> >
> >    newReg1 = complicated_expr
> >    I32[(old + 4)] = newReg1
> >
> > and then I add { I32[(old + 4)] = newReg1 } as a fact. When Hoopl reaches end of the iteration it realizes it has learned some new facts, so it keeps the facts (including fact about a new unique register) and discards rewritten graph (including said new register). In the next iteration it performs the rewrite again, allocating a different new register and adding fact about this different register. At the end of this iteration same thing happens again: facts are kept, rewrite is discarded. And so my code falls into an infinite loop, because every time I'm allocating a different register and every time hoopl thinks it learned sth new and discards the rewritten graph. How can I perform this rewrite and avoid falling into a loop?
> Your transfer function is not monotonic, because each time you apply it 
> it gives a different result.
> The next question is "well how do I do this then?". I'm not quite sure, 
> maybe you need to use a deterministic name supply monad.
> Cheers,
>     Simon

More information about the ghc-devs mailing list