Identical alts/bad divInt# code
This may be the same as #7360 (closed), but it may also be a problem in the code generation for divInt#. I've reduced it to the following minimal test case:
When compiling
fun :: Int -> Int
fun i = i `div` 2
with ghc -O2 -funfolding-use-threshold=150, the generated core becomes
Div2.fun =
\ (i_aeH :: GHC.Types.Int) ->
case i_aeH of _ { GHC.Types.I# ww_aiV ->
case GHC.Prim.># ww_aiV 0 of _ {
GHC.Types.False ->
case GHC.Prim.<# ww_aiV 0 of _ {
GHC.Types.False -> GHC.Types.I# (GHC.Prim.quotInt# ww_aiV 2);
GHC.Types.True ->
GHC.Types.I#
(GHC.Prim.-# (GHC.Prim.quotInt# (GHC.Prim.+# ww_aiV 1) 2) 1)
};
GHC.Types.True ->
case GHC.Prim.<# ww_aiV 0 of _ {
GHC.Types.False -> GHC.Types.I# (GHC.Prim.quotInt# ww_aiV 2);
GHC.Types.True ->
GHC.Types.I#
(GHC.Prim.-# (GHC.Prim.quotInt# (GHC.Prim.+# ww_aiV 1) 2) 1)
}
}
}
with two identical case alternatives, and in the True case, the next comparison is guaranteed to return False.
The generated core is good if the divisor is negative, though, so that speaks for taking a look at divInt#.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.6.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | #7360 (closed) |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |