Call Arity: In "e x", the result of "x" is not shared
authorJoachim Breitner <mail@joachim-breitner.de>
Fri, 6 Nov 2015 13:04:08 +0000 (14:04 +0100)
committerJoachim Breitner <mail@joachim-breitner.de>
Fri, 6 Nov 2015 14:31:55 +0000 (15:31 +0100)
commita58eeb7febd67c93dab82de7049ef1dcdecd34e9
treebf4a585b5b603436ec16ed242ecb20b13ef9d561
parent10647d4e2e8e3b5eb5486bd6aafbe17cda139577
Call Arity: In "e x", the result of "x" is not shared

in contrast to "e (f x)", where CorePrep will turn it into "let y = f x
in e x". So in
  let f = ...
  in e (f x)
we know that f is called at most once, but in
  let f = ...
  in e f
we do not know that.

Previously Call Arity would assume that in "e x", "x" is evaluated at
most once. This rarely would make a difference (the argument "x" is
analized with an incoming arity of 0, so no eta-expansion would be done
anyways), but of course this should still be fixed.

This fixes #11064.

Note the corresponding code dmdTransformThunkDmd in DmdAnal.
compiler/simplCore/CallArity.hs