#13221: OccurAnal fails to rediscover join points -------------------------------------+------------------------------------- Reporter: lukemaurer | Owner: lukemaurer Type: bug | Status: patch Priority: high | Milestone: 8.2.1 Component: Compiler | Version: 8.1 Resolution: | Keywords: JoinPoints Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): D3080 Wiki Page: | -------------------------------------+------------------------------------- Comment (by Ben Gamari <ben@…>): In [changeset:"795bc49ceb12cecf46e0c53a570809c3df85ab9a/ghc" 795bc49c/ghc]: {{{ #!CommitTicketReference repository="ghc" revision="795bc49ceb12cecf46e0c53a570809c3df85ab9a" Fixes for OccurAnal bugs (#13221) - OccurAnal: When checking tail calls, count rule's LHS args, not bndrs Pretty obvious error in retrospect: ``` let $sj = \y ys -> ... {-# RULES "SC:j" forall y ys. j (y:ys) = $sj y ys #-} j = \xs -> ... in ... ``` A jump on the RHS of a rule for a join point is only okay if the rule's LHS is saturated - in this case, since the LHS is j (y:ys) and j takes one argument, both j and $sj can become join points. See Note [Rules and join points] in OccurAnal. By mistake, OccAnal was counting the rule's binders (y and ys) rather than the args in its LHS, so $sj wasn't being made a join point. - Don't zap tail calls in unfoldings This was causing T7796 to squeal about join points not being rediscovered. Reviewers: bgamari, austin Reviewed By: bgamari Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D3080 }}} -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13221#comment:4> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler