[GHC] #16039: 'GHC.Magic.noinline <var>' should not float out

GHC ghc-devs at haskell.org
Thu Dec 13 13:27:44 UTC 2018


#16039: 'GHC.Magic.noinline <var>' should not float out
-------------------------------------+-------------------------------------
        Reporter:  heisenbug         |                Owner:  heisenbug
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.8.1
       Component:  Compiler          |              Version:  8.2.1
      Resolution:                    |             Keywords:  FloatOut
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #15155            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by heisenbug):

 I have a one-liner patch that now correctly judges `ghc-
 prim-0.5.3:GHC.Magic.noinline @ Kind liftedTypeKind` as not-worth-for-
 floating, but I have found another context (floating of specialised class
 dicts) when this is not enough.

 To diagnose this, I have instrumented my stage2 with traces and get (while
 compiling `TcHsType.hs`) :


 {{{
 lvlMFE WORTH
   (noinline
      @ (HasDebugCallStack => Role -> TyCon -> [Coercion] -> Coercion)
      mkTyConAppCo
      C:(%%),
    noinline @ (Coercion -> Coercion -> Coercion) mkAppCo,
    noinline
      @ (CoAxiom Branched -> BranchIndex -> [Coercion] -> Coercion)
      mkAxiomInstCo,
    noinline
      @ (UnivCoProvenance -> Role -> Type -> Type -> Coercion) mkUnivCo,
    noinline @ (Coercion -> Coercion) mkSymCo,
    noinline @ (Coercion -> Coercion -> Coercion) mkTransCo,
    noinline
      @ (HasDebugCallStack => Role -> Int -> Coercion -> Coercion)
      mkNthCo
      C:(%%),
    noinline @ (LeftOrRight -> Coercion -> Coercion) mkLRCo,
    noinline @ (Coercion -> Coercion -> Coercion) mkInstCo,
    noinline @ (Coercion -> Coercion) mkKindCo,
    noinline @ (Coercion -> Coercion) mkSubCo,
    noinline
      @ (TyCoVar -> Coercion -> Coercion -> Coercion) mkForAllCo,
    noinline @ (Role -> Type -> MCoercionN -> Coercion) mkGReflCo)
 lvlMFE WORTH
   noinline
     @ (HasDebugCallStack => Role -> TyCon -> [Coercion] -> Coercion)
     mkTyConAppCo
     C:(%%)
 lvlMFE NOTWORTH mkTyConAppCo
 lvlMFE NOTWORTH C:(%%)
 lvlMFE NOTWORTH
   noinline @ (Coercion -> Coercion -> Coercion) mkAppCo
 lvlMFE NOTWORTH mkAppCo
 lvlMFE NOTWORTH
   noinline
     @ (CoAxiom Branched -> BranchIndex -> [Coercion] -> Coercion)
     mkAxiomInstCo
 lvlMFE NOTWORTH mkAxiomInstCo
 lvlMFE NOTWORTH
   noinline
     @ (UnivCoProvenance -> Role -> Type -> Type -> Coercion) mkUnivCo
 lvlMFE NOTWORTH mkUnivCo
 lvlMFE NOTWORTH noinline @ (Coercion -> Coercion) mkSymCo
 lvlMFE NOTWORTH mkSymCo
 lvlMFE NOTWORTH
   noinline @ (Coercion -> Coercion -> Coercion) mkTransCo
 lvlMFE NOTWORTH mkTransCo
 lvlMFE WORTH
   noinline
     @ (HasDebugCallStack => Role -> Int -> Coercion -> Coercion)
     mkNthCo
     C:(%%)
 lvlMFE NOTWORTH mkNthCo
 lvlMFE NOTWORTH C:(%%)
 lvlMFE NOTWORTH
   noinline @ (LeftOrRight -> Coercion -> Coercion) mkLRCo
 lvlMFE NOTWORTH mkLRCo
 lvlMFE NOTWORTH
   noinline @ (Coercion -> Coercion -> Coercion) mkInstCo
 lvlMFE NOTWORTH mkInstCo
 lvlMFE NOTWORTH noinline @ (Coercion -> Coercion) mkKindCo
 lvlMFE NOTWORTH mkKindCo
 lvlMFE NOTWORTH noinline @ (Coercion -> Coercion) mkSubCo
 lvlMFE NOTWORTH mkSubCo
 lvlMFE NOTWORTH
   noinline @ (TyCoVar -> Coercion -> Coercion -> Coercion) mkForAllCo
 lvlMFE NOTWORTH mkForAllCo
 lvlMFE NOTWORTH
   noinline @ (Role -> Type -> MCoercionN -> Coercion) mkGReflCo
 lvlMFE NOTWORTH mkGReflCo
 }}}

 Here `noinline @ (Role -> Type -> MCoercionN -> Coercion) mkGReflCo` is
 considered NOTWORTH for floating, but even with that the algorithm
 descends into it, and eventually the expression gets floated.

 I have to figure out why this is the case.

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


More information about the ghc-tickets mailing list