Integer constant folding in the presence of new primops

Ian Lynagh ian at
Mon May 20 13:18:54 CEST 2013

On Fri, May 17, 2013 at 11:49:26AM +0200, Jan Stolarek wrote:
> Now here's the tricky part. I'm testing this with test lib/integer/integerConstantFolding in the 
> testsuite and the test fails because rules for quotRemInteger, divModInteger, quotInteger and 
> remInteger don't fire, leaving the constants unfolded. I noticed that if I mark eqInteger with 
> NOINLINE, then these rules fire, but then obviously comparisons like (100012 :: Integer) == 
> 100012 don't get folded and the test fails anyway. I'm analyzing how the function quotInteger and 
> others use eqInteger, but I don't see anything that would be obvious.

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)
    _ `quot` 0 = divZeroError
    n `quot` d = n `quotInteger` d

> eqIntegerPrimIdKey      = mkPreludeMiscIdUnique 70
> eqIntegerPrimName     = varQual gHC_INTEGER_TYPE (fsLit "eqIntegerPrim")     eqIntegerPrimIdKey

Do you also still have eqInteger wired in? It sounds like you might have
given them both the same unique?

Ian Lynagh, Haskell Consultant
Well-Typed LLP,

More information about the ghc-devs mailing list