[GHC] #9701: GADTs not specialized properly

GHC ghc-devs at haskell.org
Sat Oct 18 20:25:30 UTC 2014


#9701: GADTs not specialized properly
-------------------------------------+-------------------------------------
              Reporter:  dfeuer      |            Owner:
                  Type:  bug         |           Status:  new
              Priority:  normal      |        Milestone:
             Component:  Compiler    |          Version:  7.9
            Resolution:              |         Keywords:
      Operating System:              |     Architecture:  Unknown/Multiple
  Unknown/Multiple                   |       Difficulty:  Unknown
       Type of failure:  Runtime     |       Blocked By:
  performance bug                    |  Related Tickets:
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------

Comment (by dfeuer):

 I think I've figured out what goes wrong here. As the comments in
 [https://ghc.haskell.org/trac/ghc/browser/ghc/compiler/specialise/Specialise.lhs
 the source] explain, there's a certain amount of redundancy between type
 arguments and dictionary arguments in general. The algorithm therefore
 ignores the type arguments and focuses on the dictionary arguments. For
 GADTs, this is not good enough. In particular, we can get something that
 looks (for a different `isItSilly` definition than the one above) like

 {{{
 GADTDict.isItSillyInt
   :: GADTDict.Silly GHC.Types.Int
      -> GADTDict.Silly GHC.Types.Int -> GADTDict.Silly GHC.Types.Int
 GADTDict.isItSillyInt =
   \ (ds_dsS :: GADTDict.Silly GHC.Types.Int)
     (ds1_dsT :: GADTDict.Silly GHC.Types.Int) ->
     case ds_dsS of _ { GADTDict.Silly $dNum_apb a_ao9 ->
     case ds1_dsT of _ { GADTDict.Silly $dNum1_apc x_aoa ->
     GADTDict.Silly
       @ GHC.Types.Int
       $dNum1_apc
       (GHC.Num.+ @ GHC.Types.Int $dNum1_apc a_ao9 x_aoa)
     }
     }
 }}}

 Here, the compiler doesn't (currently) know what `$dNum1_apc` is; it's
 something it pulled out of a GADT constructor. But there's more
 information available: the `GHC.Types.Int` argument forces `$dNum1_apc` to
 be the `Num` dictionary for `Int`! The fix, presumably, is to recognize
 when a known (or collected) type argument corresponds to an unknown
 dictionary—when this happens, replace the dictionary with the right one.
 What I don't know is whether the necessary information about the
 correspondence is still readily available at this point.

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


More information about the ghc-tickets mailing list