
#8472: Primitive string literals prevent optimization --------------------------------------------+------------------------------ Reporter: akio | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.6.3 Resolution: | Keywords: Operating System: Linux | Architecture: x86_64 Type of failure: Runtime performance bug | (amd64) Test Case: | Difficulty: Unknown Blocking: | Blocked By: | Related Tickets: --------------------------------------------+------------------------------ Comment (by simonpj): Great example. It's an example of #2840. The problem is that we get something like this: {{{ f = let a::Addr# = "foo"# in \x -> blah g y = ...(f e)... }}} We can't float the binding for `a` to the top level because Core doesn't allow top-level bindings. But by not floating it we prevent `f` being inlined, which is pretty terrible. I think the solution is simply to '''allow top level bindings of form `a::Addr# = "foo"#`'''. That is: * The type is `Addr#` * The RHS is a string literal; in particular NOT a string computation Things that would need doing: * Modify the test `isUnLiftedType ty` in `SetLevels.lvlMFE`, which stops unlifted things getting floated to top level. * Similarly `Simplify.bindingOk`. * Make `CmmLint` check the new invariant. * The STG->Cmm code generator would need to generate some suitable `CmmData` stuff. This is a fairly easy job. Any volunteers? Simon -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8472#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler