[GHC] #15569: Constant folding optimises 1 into 3
GHC
ghc-devs at haskell.org
Wed Aug 29 14:46:06 UTC 2018
#15569: Constant folding optimises 1 into 3
-------------------------------------+-------------------------------------
Reporter: snowleopard | Owner: (none)
Type: bug | Status: new
Priority: highest | Milestone: 8.6.1
Component: Compiler | Version: 8.6.1-beta1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: #9136 | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by Krzysztof Gogolewski <krz.gogolewski@…>):
In [changeset:"65eec9cfd4410c0e30b0ed06116c15f8ce3de49d/ghc"
65eec9cf/ghc]:
{{{
#!CommitTicketReference repository="ghc"
revision="65eec9cfd4410c0e30b0ed06116c15f8ce3de49d"
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
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15569#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list