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