
#10120: Unnecessary code duplication from case analysis -------------------------------------+------------------------------------- Reporter: bgamari | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.1-rc2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by bgamari): I'm unsure of whether it's reasonable to expect the compiler to know that it's not worth specializing the case analysis on the character `c`. For instance, `do_something` may also branch on the character; if the compiler specialized then it could eliminate the branch inside of `do_something`. However, it would be nice if the compiler gave us the tools to force the sort of behavior we want. For instance, consider an identity-like function `evalThis :: a -> a`. This would prevent the compiler from "breaking up" the term in the course of optimization. For instance, {{{#!hs f c = let pred = evalThis $ c == 'a' || c == 'b' || c == 'c' :: Bool in case pred of True -> ... False -> ... }}} would prevent the compiler from using the "insides" of `pred` in the case analysis, ensuring that somewhere in the resulting executable there would be boolean value `pred` which would then be matched against. This is obviously a pretty big hammer, but it might be nice to have every once in a while. Perhaps such a facility already exists? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10120#comment:10 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler