Prevent optimization from tempering with unsafePerformIO
David Sabel
sabel at ki.informatik.uni-frankfurt.de
Tue Oct 16 12:01:25 EDT 2007
Hi,
I think it's the let floating (out) together with common subexpression
elimination:
> ghc --make -O2 -no-recomp -fno-cse -o curry-no-cse curry.hs
[1 of 1] Compiling Main ( curry.hs, curry.o )
Linking curry-no-cse ...
> ghc --make -O2 -no-recomp -fno-full-laziness -o curry-no-fll curry.hs
[1 of 1] Compiling Main ( curry.hs, curry.o )
Linking curry-no-fll ...
> ghc --make -O2 -no-recomp -fno-full-laziness -fno-cse -o
curry-no-cse-no-fll curry.hs
[1 of 1] Compiling Main ( curry.hs, curry.o )
Linking curry-no-cse-no-fll ...
> ./curry-no-cse
3 possibilities: [True,False]
2 possibilities: [True,False]
> ./curry-no-fll
3 possibilities: [True,False]
2 possibilities: [True,False]
> ./curry-no-cse-no-fll
3 possibilities: [True,True,False]
2 possibilities: [True,False]
Regards,
David
ps.: Maybe it is interesting to look at HasFuse [1] (somewhat outdated),
but it exactly forbids both transformations
[1] http://www.ki.informatik.uni-frankfurt.de/research/diamond/hasfuse/
Bernd Brassel wrote:
> Hi Neil, hi Don!
>
> Nice meeting you at ICFP by the way.
>
>
>> Can you give a specific example of what you have tried to do, and how it
>> failed?
>>
>
> I have attached a short synopsis of what our Curry to Haskell
> conceptually does. I could explain what all the parts mean and why they
> are defined this way, if it is important. On first glance it looks
> as if we were doing unsafe things in the very worst way. But the
> invariants within the generated code clean up things again. E.g., the
> result of main does not at all depend on whether or not the program is
> evaluated eagerly or lazily.
>
> I hope it is okay that I did not add any no-inline pragmata or something
> like that. Unfortunately, I forgot all the things we have tried more
> than a year ago to make optimization work.
>
> But this is the way it should work:
>
> $ ghc --make -O0 -o curry-no-opt curry.hs
> [1 of 1] Compiling Main ( curry.hs, curry.o )
> Linking curry-no-opt ...
> $ curry-no-opt
> 3 possibilities: [True,True,False]
> 2 possibilities: [True,False]
>
> and this is what happens after optimization:
>
> $ rm curry.hi curry.o
> $ ghc --make -O2 -o curry-opt curry.hs
> [1 of 1] Compiling Main ( curry.hs, curry.o )
> Linking curry-opt ...
> $ curry-opt
> 3 possibilities: [True,False]
> 2 possibilities: [True,False]
>
> As the code is now that is no surprise. But how can I prevent this from
> happening by adding pragmata?
>
> Thanks a lot for your time!
>
> Bernd
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
More information about the Glasgow-haskell-users
mailing list