
#15127: Unbox around runRW# -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: (none) Type: bug | Status: new Priority: low | Milestone: 8.8.1 Component: Compiler | Version: 8.4.2 Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: Runtime Unknown/Multiple | performance bug Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- Because `runRW#` inlines so late, we don't end up unboxing around it. For example, suppose we write {{{#!hs f x = runST $ do mar <- newArray 100 x unsafeFreeze mar }}} This will compile to something like {{{#!hs f x = case runRW# (\s -> case newArray# 100# x s of { (# s', mar #) -> case unsafeFreezeArray# mar s' of { (# s'', ar# #) -> (# s'', Array ar# #) }}) of (# _, ar #) -> ar }}} We generally want to pull the constructor application out of the `runRW#` argument: {{{#!hs f x = case runRW# (\s -> case newArray# 100# x s of { (# s', mar #) -> unsafeFreezeArray# mar s' }) of (# _, ar# #) -> Array ar# }}} This exposes the `Array` constructor to case-of-case. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15127 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler