Worker-wrapper optimization working in GHC 8.8 no longer works in 8.10
Summary
For a particular case in the streamly library, worker wrapper that was working well in GHC 8.8 does not seem to be working in 8.10.
Steps to reproduce
- Clone the streamly repo from https://github.com/composewell/streamly . checkout the
ghc-8.10-worker-wrapper
branch. - Have ghc-8.8 in your PATH and use
cabal build streamly
to build - from the repo root run
ghc -O2 -fmax-worker-args=16 -ddump-simpl -ddump-to-file -dsuppress-all src/Streamly/Internal/Data/Stream/SVar.hs
- Save src/Streamly/Internal/Data/Stream/SVar.dump-simpl
Repeat these steps for ghc-8.10 and compare the resulting Core files. Look at the core of the function fromStreamVar
. In GHC 8.8 the worker function $wfromStreamVar
has calls to itself, whereas in GHC 8.10 it calls the wrapped function fromStreamVar
.
I did a phase wise comparison of GHC 8.8 and 8.10 output and found that the code has almost no difference before the worker-wrapper bind phase, the above mentioned difference starts from that phase onwards. I am attaching the cores before and after worker-wrapper bind phase for both GHC 8.8 and 8.10 in this issue for quick look.
- ghc-8.8-After-Demand-analysis.hs
- ghc-8.8-After-Worker-Wrapper-binds.hs
- ghc-8.10-After-Demand-analysis.hs
- ghc-8.10-After-Worker-Wrapper-binds.hs
Expected behavior
Worker wrapper should work in 8.10 in the same way as it works in 8.8 . If not what is the reason behind it why it cannot work?
Environment
GHC 8.8 and GHC 8.10 comparison.
Optional:
Mac OS X x86_64