Optimise nested comparisons
GHC isn't capable of this optimisation:
case (x ># y) of ==> case (x ># y) of
True -> ...(x ==# y)... True -> ...False...
False -> ... False -> ...
That is, knowing that (x>y) we know that the two are not equal.
Also, consider this:
case (x ># y) of ==> case (x >=# y) of
True -> e True -> e
False -> case (x ==# y) of False -> e'
True -> e
False -> e'
Again this needs special knowlege about comparison operators. However, it does arise. Consider this:
data T = MkT Int deriving( Eq, Ord )
The derived (>)
operation looks like this:
Foo.$dm> =
\ (eta_a8q :: Foo.T) (eta1_a8r :: Foo.T) ->
case eta_a8q of wild_B1 { Foo.MkT a1_a60 ->
case eta1_a8r of wild1_XO { Foo.MkT b1_a62 ->
case a1_a60 of wild2_a9I { GHC.Base.I# x#_a9K ->
case b1_a62 of wild11_a9M { GHC.Base.I# y#_a9O ->
case GHC.Prim.<# x#_a9K y#_a9O of wild3_a9W {
GHC.Base.False ->
case GHC.Prim.==# x#_a9K y#_a9O of wild12_a9Z {
GHC.Base.False -> GHC.Base.True; GHC.Base.True -> GHC.Base.False
};
GHC.Base.True -> GHC.Base.False
See also #2130 (closed)
Trac metadata
Trac field | Value |
---|---|
Version | 6.8.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | Unknown |
Architecture | Unknown |