bug in ghc specialiser?

Simon Peyton-Jones simonpj at microsoft.com
Wed Feb 11 12:34:43 EST 2009


That should not happen.  Can you boil out a test case and make a Trac ticket?

When I try the same thing it works:

 Spec.hs:       f :: Num a => a -> a
                {-# SPECIALISE f :: Int -> Int #-}
                f x = x+2

ghc -c -ddump-rules -O Spec.hs

==================== Top-level specialisations ====================
"SPEC Foo.f" ALWAYS
    forall {$dNum :: GHC.Num.Num GHC.Types.Int}
      Foo.f @ GHC.Types.Int $dNum
      = f


Note the quantification over $dNum.


Simon


| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-users-
| bounces at haskell.org] On Behalf Of Malcolm Wallace
| Sent: 11 February 2009 16:58
| To: glasgow-haskell-users at haskell.org
| Subject: bug in ghc specialiser?
|
| Here is an apparent bug in ghc's specialisation rules.  The rewrite rule
| generated by a SPECIALISE pragma seems to want to pattern-match on exact
| dictionaries (as well as types).  But the compiler is not necessarily
| able to fully resolve dictionaries before the rules are supposed to
| fire.
|
| First, the source code we want to specialise:
|
|     {-# SPECIALISE
|         hedgehog :: Float -> Vector3 Float
|                           -> [Cell_8 (Coord3 Float)]
|                           -> [Cell_8 (Vector3 Float)]
|                           -> [(Coord3 Float, Coord3 Float)]
|       #-}
|     hedgehog  :: ( Fractional a, Cell cell vert, Eq vert
|                  , Geom coord, Geom vector, Embed vector coord ) =>
|                  a -> vector a
|                    -> [cell (coord a)]
|                    -> [cell (vector a)]
|                    -> [(coord a, coord a)]
|
| And the core + interface generated for this module contains the rule:
|
|     "SPEC Hedgehog.hedgehog" ALWAYS forall
|       Hedgehog.hedgehog @ GHC.Float.Float
|                         @ RectGrid.Cell_8
|                         @ CellTypes.MyVertex
|                         @ Geometries.Coord3
|                         @ Graphics.Rendering.OpenGL.GL.CoordTrans.Vector3
|                         GHC.Float.$f16
|                         RectGrid.$f2
|                         CellTypes.$f1
|                         Geometries.$f5
|                         Geometries.$f3
|                         Geometries.$f1
|       = Hedgehog.hedgehog1
|
| But in a different module, here is what the usage site looks like just
| before the specialisation rules are supposed to fire:
|
|     hedgehog_a4wy =
|       Hedgehog.hedgehog
|         @ GHC.Float.Float
|         @ RectGrid.Cell_8
|         @ CellTypes.MyVertex
|         @ Geometries.Coord3
|         @ Graphics.Rendering.OpenGL.GL.CoordTrans.Vector3
|         $dFractional_a4xP
|         RectGrid.$f2
|         CellTypes.$f1
|         (Dataset.$p2Embed
|            @ Graphics.Rendering.OpenGL.GL.CoordTrans.Vector3
|            @ Geometries.Coord3
|            Geometries.$f1)
|         (Dataset.$p1Embed
|            @ Graphics.Rendering.OpenGL.GL.CoordTrans.Vector3
|            @ Geometries.Coord3
|            Geometries.$f1)
|         Geometries.$f1
|
| Notice how there are several dictionary selector functions sitting
| there, so although some of the dictionaries match, not all do, and the
| rule does not fire.  However, later the worker-wrapper transformation
| is able to resolve those outstanding dictionaries, giving:
|
|     hedgehog_a4wy =
|       Hedgehog.$whedgehog
|         @ GHC.Float.Float
|         @ RectGrid.Cell_8
|         @ CellTypes.MyVertex
|         @ Geometries.Coord3
|         @ Graphics.Rendering.OpenGL.GL.CoordTrans.Vector3
|         GHC.Float.$f16
|         RectGrid.$f2
|         Geometries.$f5
|         Geometries.$f3
|         Geometries.$f1
|
| So I'm left calling the worker for the polymorphic version of the
| function, rather than the specialised monomorphic code I wanted.  Given
| how many dictionaries are involved, and that this is the inner loop of
| the program, I'm hoping there is a big performance win waiting for me,
| if only I can get that specialised code to run!
|
| Regards,
|     Malcolm
| _______________________________________________
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users



More information about the Glasgow-haskell-users mailing list