
All the same issues arise for Int# too, right? | {-# NOINLINE eqIntegerPrim #-} | eqIntegerPrim :: Integer -> Integer -> Int# | eqIntegerPrim ... -- same as before, but uses new primops | | eqInteger :: Integer -> Integer -> Bool | eqInteger a b = tagToEnum# (a `eqIntegerPrim` b) | | I noticed that in some cases this implementation prevents constant | folding for Integers. Why? Because eqInteger is now inlined, so the rule doesn't get a chance to fire? | A add new folding rules for eqIntegerPrim and other functions, leave the | existing rules for | eqInteger. This should fold: (100012 :: Integer) == 100012 to True (as | it does now) | | B add new folding rules for eqIntegerPrim and other functions, remove | the existing rules for | eqInteger. This would fold (100012 :: Integer) == 100012 to tagToEnum# | 1# I'm not sure I understand, but I think that the difference between (A) and (B) is whether the existing rules for eqInteger remain or are removed. I'd remove them if you can; simpler, only one way for things to happen S