id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
3772	Methods not inlined	rl		"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."	bug	closed	normal	6.12 branch	Compiler	6.12.1	fixed			Unknown/Multiple	Unknown/Multiple	Runtime performance bug		simplCore/should_compile/T3772			
