
#14626: No need to enter a scrutinised value -------------------------------------+------------------------------------- Reporter: heisenbug | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.2 Keywords: performance | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: #13861 Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- While analysing the output of #13861 I stumbled over an unnecessary pessimisation in handling of scrutinised values. With words of Simon (from https://phabricator.haskell.org/D4267 with minor edits added): Interesting. Yes, please make a ticket! (And transfer the info below into it.) I think the issue is this. Given (the STG-ish code) {{{#!hs data Colour = Red | Green | Blue f x = case x of y Red -> Green DEFAULT -> y }}} (here `y` is the case binder) we can just return `x` rather than entering it in DEFAULT branch, because `y` will be fully evaluated and its pointer will be correctly tagged. You absolutely can't check for an `OccName` of `"wild"`!! That is neither necessary nor sufficient :-). Instead, check `isEvaldUnfolding (idUnfolding y)`. See `Note [Preserve evaluatedness]` in `CoreTidy.hs`. And be sure to augment that note if you make the change. I would expect perf benefits to be small on average, but it's simple to implement. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14626 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler