[GHC] #14688: Note [Lone variables] leads to missing a case-of-case opportunity

GHC ghc-devs at haskell.org
Fri Jan 19 13:19:46 UTC 2018


#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
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 After the simplifier, my program ends up in the following state.

 {{{
 foo = \f s -> let x = case s of { T1 a b -> a :> b :> Nil }
               in fmap (\v -> case x of
                               { _v1 :> vs -> T1 v (case vs of {v2 :> _ ->
 v2}) })
                       (f (case x of {v1 :> _ -> v1}))
 }}}

 Now if I understand `Note [Lone variables]` correctly, `x` is NOT inlined
 into
 the call sites, no matter what I do as `x` is work-free. However,
 this is bad as if we were to inline `x` we get a case-of-case opportunity.

 {{{
 => Inline
 foo = \f s -> let x = case s of { T1 a b -> a :> b :> Nil }
               in fmap (\v -> case (case s of { T1 a b -> a :> b :> Nil })
 of
                               { _v1 :> vs -> T1 v (case vs of {v2 :> _ ->
 v2}) })
                       (f (case x of {v1 :> _ -> v1}))
 => case of case
 foo = \f s -> let x = case s of { T1 a b -> a :> b :> Nil }
               in fmap (\v -> case s of { T1 a b -> case (a :> b :> Nil) of
                                                         { _v1 :> vs -> T1
 v (case vs of {v2 :> _ -> v2}) })
                       (f (case x of {v1 :> _ -> v1}))
 => case of known constructor
 foo = \f s -> let x = case s of { T1 a b -> a :> b :> Nil }
               in fmap (\v -> case s of { T1 a b -> T1 v b})
                       (f (case x of {v1 :> _ -> v1}))
 => Same for the other branch
 foo = \f s -> fmap (\v -> case s of { T1 a b -> T1 v b})
                    (case s of T1 a b -> a)

 }}}

 Which no longer mentions the intermediate representation.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14688>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list