GHC optimisation flag ignored when importing a local module with derived type classes
Given Foo.hs and Bar.hs:
module Foo where
data Food = Food -- deriving Eq
{-# OPTIONS_GHC -O2 -ddump-simpl #-}
module Bar where
import Foo
bar :: Int -> Bool
bar x = x == 72
If I run:
ghc --make Bar -fforce-recomp
I get (snipped):
Bar.bar =
\ (x_afk :: GHC.Types.Int) ->
case x_afk of _ { GHC.Types.I# x1_alo ->
case x1_alo of _ {
__DEFAULT -> GHC.Types.False;
72 -> GHC.Types.True
}
}
bar
now looks pretty well optimised. However, if I uncomment the deriving Eq
I get:
Bar.bar1 = GHC.Types.I# 72
Bar.bar2 = GHC.Classes.== @ GHC.Types.Int GHC.Classes.$fEqInt
Bar.bar = \ (x_amD :: GHC.Types.Int) -> Bar.bar2 x_amD Bar.bar1
Now bar
looks like terrible code, using dictionaries, boxing etc. It seems adding deriving
in the imported and unused module makes it ignore the optimisation level.