Integer constant folding in the presence of new primops
Jan Stolarek
jan.stolarek at p.lodz.pl
Mon May 20 13:34:38 CEST 2013
> If you remove everything but the quotInteger test from
> integerConstantFolding and compile with -ddump-rule-rewrites then you'll
> see that the eqInteger rule fires before quotInteger. This is presumably
> comparing against 0, as the definition of quot for Integer (in GHC.Real)
> is
> _ `quot` 0 = divZeroError
> n `quot` d = n `quotInteger` d
Yes, I noticed these two rules firing together - perhaps that's the explanation why. I created a
small program for testing:
main = print quotInt
quotInt :: Integer
quotInt = 100063 `quot` 156
I noticed that when I define eqInteger wrapper to be NOINLINE, the call to quot is translated to
Core as:
Main.quotInt =
GHC.Real.$fIntegralInteger_$cquot
(__integer 100063) (__integer 156)
but when I change the wrapper to INLINE I get:
Main.quotInt =
GHC.Real.$fNumRatio_$cquot <-------- NumRatio instead of IntegralInteger
(__integer 100063) (__integer 156)
All rule firing happens later (I used -ddump-simpl-iterations -ddump-rule-firings), except that
for $fNumRatio_$cquot the quot rules don't fire.
> Do you also still have eqInteger wired in? It sounds like you might have
> given them both the same unique?
No, they didn't have the same unique. I modified the existing rules to work on the new primops and
ignore their wrappers. At the moment I reverted these changes so that I can make progress and
leave this problem for later.
Janek
More information about the ghc-devs
mailing list