Skip to content

Methods not inlined

This affects both 6.12 and the HEAD (albeit differently) but works fine with 6.10. It also works if everything is in one module. We are interested in the function U.foo; in particular, we want the call to deepSeq (resulting from inlining T.apply) to be inlined. This is what we get with 6.10 (compiling with -O2):

go_riA :: [GHC.Types.Double] -> ()
go_riA =
  \ (ds_agP :: [GHC.Types.Double]) ->
    case ds_agP of wild_agQ {
      [] -> GHC.Unit.();
      : y_agU ys_agV ->
        case y_agU of tpl2_ah1 { GHC.Types.D# ipv_ah3 -> go_riA ys_agV }
    }

U.foo :: GHC.Types.Int -> ()
U.foo =
  \ (n_afR :: GHC.Types.Int) ->
    case n_afR of w_Xhn { GHC.Types.I# ww_ahi ->
    go_riA (T.$wgen @ GHC.Types.Double T.$f2 ww_ahi)
    }

Everything has been nicely inlined. With 6.12, we get this:

U.foo [NEVER Nothing] :: GHC.Types.Int -> ()
U.foo =
  \ (n_adD :: GHC.Types.Int) ->
    case n_adD of _ { GHC.Types.I# ww_afv ->
    let {
      eta_sgc :: [GHC.Types.Double]
      eta_sgc = T.$wgen @ GHC.Types.Double T.$fCDouble ww_afv } in
    __inline_me (GHC.Base.foldr
                   @ GHC.Types.Double @ () (T.$fCDouble1 @ ()) GHC.Unit.() eta_sgc)
    }

The deepSeq call has been inlined but hasn't been optimised, I guess because GHC retained the __inline_me for some reason. Things are even worse with the HEAD:

U.foo :: GHC.Types.Int -> ()
U.foo =
  \ (n_aaO :: GHC.Types.Int) ->
    case n_aaO of _ { GHC.Types.I# ww_abR ->
    T.$fC[]1
      @ GHC.Types.Double
      T.$fCDouble
      @ ()
      (T.$w$cgen @ GHC.Types.Double T.$fCDouble ww_abR)
      GHC.Unit.()
    }

Here, deepSeq hasn't even been inlined. But let's add a dummy method to DeepSeq:

class DeepSeq a where
  deepSeq :: a -> b -> b

  dummy :: a
  dummy = undefined

Now, the HEAD actually inlines the call:

go_rcM :: [GHC.Types.Double] -> ()
go_rcM =
  \ (ds_acl :: [GHC.Types.Double]) ->
    case ds_acl of _ {
      [] -> GHC.Unit.();
      : y_acq ys_acr ->
        case y_acq of _ { GHC.Types.D# _ -> go_rcM ys_acr }
    }

U.foo :: GHC.Types.Int -> ()
U.foo =
  \ (n_aaQ :: GHC.Types.Int) ->
    case n_aaQ of _ { GHC.Types.I# ww_abI ->
    go_rcM (T.$w$cgen @ GHC.Types.Double T.$fCDouble ww_abI)
    }

Unfortunately, 6.12 still doesn't.

Trac metadata
Trac field Value
Version 6.12.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information