Fixes for OccurAnal bugs (#13221)
authorLuke Maurer <maurerl@cs.uoregon.edu>
Mon, 6 Feb 2017 01:32:20 +0000 (20:32 -0500)
committerBen Gamari <ben@smart-cactus.org>
Mon, 6 Feb 2017 01:32:30 +0000 (20:32 -0500)
commit795bc49ceb12cecf46e0c53a570809c3df85ab9a
tree15e559ced118dab283eec7e1f558fc064ed4a4b7
parent563148cdf6e6560ccf842aa4e2bd6262ea463d66
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
compiler/simplCore/OccurAnal.hs