diff options
author | Andrey Mokhov <andrey.mokhov@gmail.com> | 2018-08-29 15:16:51 +0200 |
---|---|---|
committer | Krzysztof Gogolewski <krz.gogolewski@gmail.com> | 2018-08-29 15:16:52 +0200 |
commit | 65eec9cfd4410c0e30b0ed06116c15f8ce3de49d (patch) | |
tree | 2ea9f0df724a4955ad7523718b44b7ca6d937d34 /rts/sm/Compact.c | |
parent | 36c1431d9d2d06049190cc0888dbfaee8e2179d6 (diff) | |
download | haskell-65eec9cfd4410c0e30b0ed06116c15f8ce3de49d.tar.gz |
Fix a constant folding rule
Summary:
One of the constant folding rules introduced in D2858 is:
```
(L y :-: v) :-: (L x :-: w) -> return $ mkL (y-x) `add` (w `add` v)
```
Or, after removing syntactic noise: `(y - v) - (x - w) ==> (y - x) + (w + v)`.
This is incorrect, since the sign of `v` is changed from negative to positive.
As a consequence, the following program prints `3` when compiled with `-O`:
```
-- This is just subtraction in disguise
minus :: Int -> Int -> Int
minus x y = (8 - y) - (8 - x)
{-# NOINLINE minus #-}
main :: IO ()
main = print (2 `minus` 1)
```
The correct rule is: `(y - v) - (x - w) ==> (y - x) + (w - v)`.
This commit does the fix. I haven't found any other issues with the constant
folding code, but it's difficult to be certain without some automated checking.
Reviewers: bgamari, tdammers
Subscribers: hsyl20, tdammers, rwbarton, carter
GHC Trac Issues: #15569
Differential Revision: https://phabricator.haskell.org/D5109
Diffstat (limited to 'rts/sm/Compact.c')
0 files changed, 0 insertions, 0 deletions