Needless call to fromInteger for literals
For the code below, ghc 6.7 puts the literal 65 in a static closure (S#) and calls fromInteger on it.
import Foreign.C ( CChar )
foreign import ccall putchar :: CChar -> IO ()
main = putchar 65
GHC 6.7 generates the following code; note the static closure Main.lvl and the call to fromInteger:
==================== STG syntax: ====================
Main.lvl = NO_CCS GHC.Num.S#! [65];
SRT(Main.lvl): []
Main.main =
\u []
case GHC.Int.fromInteger Main.lvl of ds_sSd {
GHC.Int.I8# ds1_sS2 ->
let {
sat_sSf =
\r [ds2_sS3]
case __ccall_GC putchar [ds1_sS2 ds2_sS3] of wild_sSe {
(##) ds3_sS7 -> (#,#) [ds3_sS7 GHC.Base.()];
};
} in sat_sSf;
};
SRT(Main.main): []
:Main.main =
\r srt:(0,*bitmap*) [eta_sSc] GHC.TopHandler.runMainIO Main.main eta_sSc;
SRT(:Main.main): [GHC.TopHandler.runMainIO, Main.main]
GHC 6.6 just passes the 65 to putchar as an unboxed constant.
Trac metadata
Trac field | Value |
---|---|
Version | 6.7 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | Multiple |
Architecture | Multiple |