
#13339: Arbitrarily large expressions built out of cheap primops are not floated out -------------------------------------+------------------------------------- Reporter: rwbarton | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- While investigating #13338 I was tripped up by the fact that GHC won't float out even a large expression like the product in {{{#!hs \i# -> magic# (x# *# 2# *# 2# *# 2# *# 2# *# 2# *# 2# *# 2# *# 2# -# i#) }}} The test involved here is `exprIsCheap`. The fact that `*#` is a cheap primop makes `exprIsCheap` think the whole expression is cheap; but clearly there must come some point where it would be better to float out the expression. Perhaps `exprIsCheap` should work more like `exprIsDupable`, and take the size of the expression into account. See related comments on `primOpIsCheap`, though this ticket is about saving runtime work, not code size. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13339 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler