Skip to content

Local wrapper function remains in final program; result = extra closure allocation

I have a strange problem with a local function binding that is not being inlined. I've attached the repro code, build it like this:

$ ghc -O2 Haxl/Core/Monad.hs

There are several modules, but the one with the problem is Haxl/Core/Monad.hs. In particular Haxl.Core.Monad.$fApplicativeGenHaxl2, which contains this fragment:

            let {
              $wa4_s6YQ
              $wa4_s6YQ =
                \ w_s6YF _ ww1_s6YM _ _ w1_s6YI ->
                  case GHC.Prim.readMutVar# ipv7_X5Ne w1_s6YI
                  of _ { (# ipv10_X5QO, ipv11_X5QQ #) ->
                  case ipv11_X5QQ of _ {
                    Haxl.Core.Monad.IVarFull a2_a3kK -> case lvl6_r7qi of wild3_00 { };
                    Haxl.Core.Monad.IVarEmpty dt2_d4Vs ->
                      case GHC.Prim.writeMutVar#
                             ipv7_X5Ne (Haxl.Core.Monad.IVarFull w_s6YF) ipv10_X5QO
                      of s2#_a5OR { __DEFAULT ->
                      case GHC.Prim.readMutVar# dt2_d4Vs s2#_a5OR
                      of _ { (# ipv12_X5R0, ipv13_X5R2 #) ->
                      case GHC.Prim.readMutVar# ww1_s6YM ipv12_X5R0
                      of _ { (# ipv14_X5SS, ipv15_X5SU #) ->
                      letrec {
                        go_a5ti
                        go_a5ti =
                          \ ds10_a5tj ->
                            case ds10_a5tj of _ {
                              [] -> ipv15_X5SU;
                              : y_a5to ys_a5tp -> GHC.Types.: (y_a5to w_s6YF) (go_a5ti ys_a5tp)
                            }; } in
                      case go_a5ti ipv13_X5R2 of x'_a5P6 { __DEFAULT ->
                      case GHC.Prim.writeMutVar# ww1_s6YM x'_a5P6 ipv14_X5SS
                      of s2#1_a5P7 { __DEFAULT ->
                      (# s2#1_a5P7, Haxl.Core.Monad.cacheRequest6 #)
                      }
                      }
                      }
                      }
                      }
                  }
                  } } in
            let {
              a2_s6lH
              a2_s6lH =
                \ w_s6YF _ w2_s6YH w3_s6YI ->
                  case w2_s6YH
                  of _
                  { Haxl.Core.Monad.SchedState ww1_s6YL ww2_s6YM ww3_s6YN ww4_s6YO ->
                  $wa4_s6YQ w_s6YF ww1_s6YL ww2_s6YM ww3_s6YN ww4_s6YO w3_s6YI
                  } } in

I want $wa4 to be inlined at its single occurrence in a2. I believe the reason it is not being inlined is that a2 is a wrapper, but the situation seems silly because the wrapper isn't going away either, so we have a redundant closure being built (this is in my inner loop).

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