[GHC] #14140: Better treatment for dataToTag
GHC
ghc-devs at haskell.org
Sun Aug 20 22:16:18 UTC 2017
#14140: Better treatment for dataToTag
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.2.1
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
In `libraries/Cabal/Cabal/Distribution/System.hs` I found
{{{
eqOS :: OS -> OS -> Bool
eqOS (OtherOS s1) (OtherOS s2) = s1 == (s2 :: String)
eqOs a b = dataToTag a == dataTag b
}}}
(actually it's not called `eqOS`; it's the derived equality for `OS`).
By the time this gets to Core it looks something like this
{{{
eqOS a b
= case a of
OtherOS s1 -> case b of
OtherOS s2 -> eqString s1 s2
_ -> case dataToTag b of
16# -> True
r -> False
_ -> dataToTag a == dataToTag b
}}}
The `dataToTag` code has been duplicated; and in the `OtherOS s1` branch
GHC can constant-fold the `dataToTag` on `a` to `16#`, the tag of
`OtherOS`. But GHC is no so clever for the `dataToTag b`. We know that
`b` is not `OtherOS`, so we know its tag is not `16#`, so the innermost
case is entirely redundant. But we don't spot that.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14140>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list