diff options
author | Joachim Breitner <mail@joachim-breitner.de> | 2022-04-07 22:02:46 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-04-09 13:02:19 -0400 |
commit | dcf30da8ff3ddcea9db3369870039f1b2c5d7b2c (patch) | |
tree | 588c1dea5790df294158f096d1d21af81a5baff3 /.git-ignore-revs | |
parent | 27362265e50b59aee9a0ae17560ce091f5501985 (diff) | |
download | haskell-dcf30da8ff3ddcea9db3369870039f1b2c5d7b2c.tar.gz |
Drop the app invariantghc-9.5-start
previously, GHC had the "let/app-invariant" which said that the RHS of a
let or the argument of an application must be of lifted type or ok for
speculation. We want this on let to freely float them around, and we
wanted that on app to freely convert between the two (e.g. in
beta-reduction or inlining).
However, the app invariant meant that simple code didn't stay simple and
this got in the way of rules matching. By removing the app invariant,
this thus fixes #20554.
The new invariant is now called "let-can-float invariant", which is
hopefully easier to guess its meaning correctly.
Dropping the app invariant means that everywhere where we effectively do
beta-reduction (in the two simplifiers, but also in `exprIsConApp_maybe`
and other innocent looking places) we now have to check if the argument
must be evaluated (unlifted and side-effecting), and analyses have to be
adjusted to the new semantics of `App`.
Also, `LetFloats` in the simplifier can now also carry such non-floating
bindings.
The fix for DmdAnal, refine by Sebastian, makes functions with unlifted
arguments strict in these arguments, which changes some signatures.
This causes some extra calls to `exprType` and `exprOkForSpeculation`,
so some perf benchmarks regress a bit (while others improve).
Metric Decrease:
T9020
Metric Increase:
LargeRecord
T12545
T15164
T16577
T18223
T5642
T9961
Co-authored-by: Sebastian Graf <sebastian.graf@kit.edu>
Diffstat (limited to '.git-ignore-revs')
0 files changed, 0 insertions, 0 deletions