bizarre strictness analysis bug
This module:
module Test where
f :: Int -> Int -> Int
f 0 t = t
f i t = f (i-1) (t+1)
g :: Int -> Int -> Int
g 0 t = t
g i t = g (i-1) (t+1)
contains two identical functions, f and g. If we compile with -O2 -dverbose-core2core using HEAD, GHC derives different strictness for them:
Test.f [Occ=LoopBreaker]
:: GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int
...
Str=DmdType U(L)U(L)m,
Test.g [Occ=LoopBreaker]
:: GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int
...
Str=DmdType U(L)L,
The strictness on g is wrong (it should be strict in both arguments).
What is even more bizarre is that if you DELETE f, then g gets the correct strictness!
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | high |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |