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


_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs

Reply via email to