
I'm finishing my patches for T6135, but I still have some work to do on integer-gmp and integer-simpl libraries. I changed the previously existing functions that compare Integers: {-# NOINLINE #-} eqInteger :: Integer -> Integer -> Bool eqInteger = ... to something like this: {-# 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. I'm trying to figure out the proper way to fix this. I am considering two ways of doing it: - 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) - add new folding rules for eqIntegerPrim and other functions, remove the existing rules for eqInteger. This would fold (100012 :: Integer) == 100012 to tagToEnum# 1# Which approach is better? Another question related to this: how do I run validation with integer-simpl enabled? Wiki describes how to enable integer-simpl for the build, but I think that validation is always run against integer-gmp? Or am I wrong here? Janek