[GHC] #8635: GHC optimisation flag ignored when importing a local module with derived type classes

GHC ghc-devs at haskell.org
Sun Feb 12 14:51:29 UTC 2017


#8635: GHC optimisation flag ignored when importing a local module with derived
type classes
-------------------------------------+-------------------------------------
        Reporter:  Neil Mitchell     |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  7.6.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Runtime           |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #9370             |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by Ben Gamari:

Old description:

> 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.

New description:

 Given Foo.hs and Bar.hs:

 {{{#!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.

--

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8635#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list