
#10012: Cheap-to-compute values aren't pushed into case branches inducing unnecessary register pressure -------------------------------------+------------------------------------- Reporter: bgamari | Owner: bgamari Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.4 Resolution: | 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: | -------------------------------------+------------------------------------- Comment (by bgamari): Here's a very bare-bones example, {{{#!hs {-# LANGUAGE BangPatterns #-} {-# LANGUAGE RankNTypes #-} module TestCase3 where data Buffer = Buffer data BufferRange = BufferRange Buffer Int data BuildSignal a = BufferFull (BuildStep a) | Done a type BuildStep a = BufferRange -> IO (BuildSignal a) newtype Builder = Builder (forall r. BuildStep r -> BuildStep r) write16Bytes :: Int -> Int -> Builder write16Bytes a b = Builder $ \cont rng@(BufferRange Buffer rem) -> let !fa = f a !fb = f b -- doWrite :: BufferRange -> IO (BuildSignal r) doWrite rng' = writeInt fa >> writeInt fb >> cont rng' in if rem < 16 then return $ BufferFull doWrite else doWrite rng where f x = x + 42 writeInt :: Int -> IO () writeInt = print {-# NOINLINE writeInt #-} }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10012#comment:13 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler