
#15696: Derived Ord instance for enumerations with more than 8 elements seems to be incorrect -------------------------------------+------------------------------------- Reporter: mrkkrp | Owner: (none) Type: bug | Status: patch Priority: highest | Milestone: 8.6.2 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): Phab:D5196, Wiki Page: | Phab:D5201 -------------------------------------+------------------------------------- Comment (by osa1): Simon, what do you think about marking `dataToTag#` as can't fail? I thought it makes sense, but when I do that I get this lint error: (add type annotation on scrutinee) {{{ <no location info>: warning: In the expression: tagToEnum# @ Bool (case (ds :: Instr) of lwild { __DEFAULT -> 0#; C_ALabel_1 ipv -> 1# }) This argument does not satisfy the let/app invariant: case ds of lwild { __DEFAULT -> 0#; C_ALabel_1 ipv -> 1# } }}} Note that the expression does not actually have `dataToTag#`. Apparently making `dataToTag#` can't fail enables some transformations, which leads to this. (Type of `ds` is a lifted sum type named `Instr`) If I don't make it "can't fail", I get this expression instead {{{ case GHC.Prim.dataToTag# @ Instr ds of b# { __DEFAULT -> GHC.Prim.tagToEnum# @ Bool (case b# of { __DEFAULT -> 0#; 0# -> 1# }) }; }}} The version with "can't fail" is better because we eliminate a redundant `dataToTag#` call, but apparently the resulting expression is not "OK for speculation". I think this expression is not OK for speculation because the scrutinee is lifted, but I'm not sure. I also don't know why lifted scrutinee is a problem for speculation.. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15696#comment:49 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler