
#14688: Note [Lone variables] leads to missing a case-of-case opportunity -------------------------------------+------------------------------------- Reporter: mpickering | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by mpickering): I tried to get to the bottom of what was going on here this afternoon. Here's a nice self-contained program now. https://gist.github.com/mpickering/37b7119561e825ba895ac2b014d178d7 `foo` is the example from the original ticket. `x` is not work-free or expandable. `foo2` is a modified example where `x` is work-free and expandable but still doesn't get inlined even with the modified test (changing `is_wf` to `is_exp`). 1. Something is definitely wrong in `tryUnfolding` as if `lone_variable` then either `some_benefit` or `is_wf` is going to be `False` so it won't get inlined. (Case 1: `is_wf` is False; trivial, Case 2: `is_wf` is True then `not (lone_variable && is_wf)` will be `False` and hence `some_benefit` is `False`.) 2. Changing it to `is_exp` doesn't help `foo2` as `x` is reported to be expandable as well as work-free. 3. Using a GADT means that GHC concludes that the `x` binding is no longer expandable or work-free which I found very surprising. Adding the type index shouldn't affect the optimiser like this? 4. Changing the call to `is_exp` doesn't look like it would work anyway as there is no case for `Case` in `expandUnfolding_maybe` and so it will still return `Nothing`. Have you got any more hints Simon :) ? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14688#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler