
#15696: Derived Ord instance for enumerations with more than 8 elements seems to be incorrect -------------------------------------+------------------------------------- Reporter: mrkkrp | Owner: (none) Type: bug | Status: new Priority: highest | Milestone: 8.6.1 Component: Compiler | Version: 8.6.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Incorrect result | Unknown/Multiple at runtime | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by osa1): * cc: osa1 (added) Comment: The problem is in this Core generated for this program: {{{ -- RHS size: {terms: 5, types: 2, coercions: 0, joins: 0/0} f_r6li f_r6li = \ ds_d3M6 -> case ds_d3M6 of { () -> T2 } -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} lvl_r6lj lvl_r6lj = f_r6li () main2 main2 = case dataToTag# lvl_r6lj of a#_a2rY { __DEFAULT -> case dataToTag# lvl_r6lj of b#_a2rZ { __DEFAULT -> ... }}} We get the tag of a CAF (`lvl_r6lj`) before evaluating it, so we get tag of a thunk. The need for evaluating argument of `dataToTag#` is explained in `Note [dataToTag#]` in primops.txt.pp. It seems like we're inlining `getTag`, and then somehow eliminating the case expression in `getTag` (to evaluate its argument). If I change the `INLINE` annotation of `getTag` to `NOINLINE` this works as expected. I don't know why we're elminating the `case` in `getTag` after inlining it yet. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15696#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler