[commit: ghc] wip/spj-early-inline4: Tidy up Coercion.mkRuntimeRepCo (56cb725)

git at git.haskell.org git at git.haskell.org
Sun Feb 26 18:06:34 UTC 2017


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/spj-early-inline4
Link       : http://ghc.haskell.org/trac/ghc/changeset/56cb7251ef261a5b5a445d062fb9969a0ab49b4a/ghc

>---------------------------------------------------------------

commit 56cb7251ef261a5b5a445d062fb9969a0ab49b4a
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date:   Fri Feb 24 16:54:34 2017 +0000

    Tidy up Coercion.mkRuntimeRepCo
    
    Summary:
    It was hard to understand, and inefficient in the common case.
    Better now.
    
    Reviewers: austin, goldfire, bgamari
    
    Subscribers: thomie
    
    Differential Revision: https://phabricator.haskell.org/D3208


>---------------------------------------------------------------

56cb7251ef261a5b5a445d062fb9969a0ab49b4a
 compiler/prelude/TysWiredIn.hs-boot |  1 +
 compiler/types/Coercion.hs          | 47 +++++++++++++++++++++----------------
 2 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/compiler/prelude/TysWiredIn.hs-boot b/compiler/prelude/TysWiredIn.hs-boot
index 26e4201..c740690 100644
--- a/compiler/prelude/TysWiredIn.hs-boot
+++ b/compiler/prelude/TysWiredIn.hs-boot
@@ -17,6 +17,7 @@ constraintKind :: Kind
 
 runtimeRepTyCon, vecCountTyCon, vecElemTyCon :: TyCon
 runtimeRepTy :: Type
+liftedRepTy  :: Type
 
 liftedRepDataConTyCon, vecRepDataConTyCon, tupleRepDataConTyCon :: TyCon
 
diff --git a/compiler/types/Coercion.hs b/compiler/types/Coercion.hs
index 353134d..f53968e 100644
--- a/compiler/types/Coercion.hs
+++ b/compiler/types/Coercion.hs
@@ -123,7 +123,7 @@ import Pair
 import SrcLoc
 import PrelNames
 import TysPrim          ( eqPhantPrimTyCon )
-import {-# SOURCE #-} TysWiredIn ( constraintKind )
+import {-# SOURCE #-} TysWiredIn ( liftedRepTy, constraintKind )
 import ListSetOps
 import Maybes
 import UniqFM
@@ -427,42 +427,49 @@ mkHeteroCoercionType Representational = mkHeteroReprPrimEqPred
 mkHeteroCoercionType Phantom          = panic "mkHeteroCoercionType"
 
 constraintIsLifted :: CoAxiomRule
-constraintIsLifted =
-    CoAxiomRule { coaxrName = mkFastString "constraintIsLifted"
+-- constratintIsLifted :: Type ~N Constraint
+constraintIsLifted
+  = CoAxiomRule { coaxrName      = mkFastString "constraintIsLifted"
                 , coaxrAsmpRoles = []
-                , coaxrRole = Nominal
-                , coaxrProves =
-                      const $ Just $ Pair constraintKind liftedTypeKind
+                , coaxrRole      = Nominal
+                , coaxrProves    = const $ Just $
+                                   Pair constraintKind liftedTypeKind
                 }
 
--- | Given a coercion @co1 :: (a :: TYPE r1) ~ (b :: TYPE r2)@,
--- produce a coercion @rep_co :: r1 ~ r2 at .
+-- | Given a coercion @co :: (a :: TYPE r1) ~ (b :: TYPE r2)@,
+-- produce a coercion @rep_co :: r1 ~N r2 at .
+--
+-- HACK for Constraint (which is currently a different kind than TYPE r):
+--    treat Constraint like TYPE LiftedRep, so
+--    if   co :: (a :: Constraint) ~ (b :: TYPE r2)
+--         return rep_co :: LiftedRep ~ r2
 mkRuntimeRepCo :: Coercion -> Coercion
 mkRuntimeRepCo co
     -- This is currently a bit tricky since we can see types of kind Constraint
     -- in addition to the usual things of kind (TYPE rep). We first map
     -- Constraint-kinded types to (TYPE 'LiftedRep).
     -- FIXME: this is terrible
-  | isConstraintKind a && isConstraintKind b
-  = mkNthCo 0 $ constraintToLifted
-  $ mkSymCo $ constraintToLifted $ mkSymCo kind_co
+  | isReflCo kind_co   -- kind_co :: <TYPE r> or <Constraint>
+  = -- If a=b, things are easy
+    if isConstraintKind a
+    then mkNomReflCo liftedRepTy         -- <LiftedTypeRep>
+    else mkNomReflCo (tyConAppArgN 0 a)  -- <r>
 
-  | isConstraintKind a
+  | isConstraintKind a  -- Presumably b = TYPE r2
   = WARN( True, text "mkRuntimeRepCo" )
-    mkNthCo 0
-  $ mkSymCo $ constraintToLifted $ mkSymCo kind_co
+    mkNthCo 0 (mkSymCo cl_co `mkTransCo` kind_co)
 
-  | isConstraintKind b
+  | isConstraintKind b  -- Presumably a = TYPE r1
   = WARN( True, text "mkRuntimeRepCo" )
-    mkNthCo 0 $ constraintToLifted kind_co
+    mkNthCo 0 (kind_co `mkTransCo` cl_co)
 
-  | otherwise
+  | otherwise           -- a = TYPE r1, t = TYPE r2
   = mkNthCo 0 kind_co
   where
-    -- the right side of a coercion from Constraint to TYPE 'LiftedRep
-    constraintToLifted = (`mkTransCo` mkAxiomRuleCo constraintIsLifted [])
+    -- cl_co :: Constraint ~ TYPE LiftedRep
+    cl_co = mkAxiomRuleCo constraintIsLifted []
 
-    kind_co = mkKindCo co  -- kind_co :: TYPE r1 ~ TYPE r2
+    kind_co = mkKindCo co  -- kind_co :: TYPE r1 ~N TYPE r2
                            -- (up to silliness with Constraint)
     Pair a b = coercionKind kind_co  -- Pair of (TYPE r1, TYPE r2)
 



More information about the ghc-commits mailing list