#13172: scrutinee constant folding produces wrong answer when remapped values are out of bounds -------------------------------------+------------------------------------- Reporter: rwbarton | Owner: Type: bug | Status: new Priority: highest | Milestone: Component: Compiler | Version: 8.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: -------------------------------------+------------------------------------- This program should output 2, but in 8.1 with `-O` enabled it outputs 3. The problem is with the way that scrutinee constant folding rewrites the case. {{{#!hs f :: Word -> Word f n = case n+1 of 0 -> 2 _ -> 3 {-# NOINLINE f #-} main = print (f (-1)) }}} Core with 8.1 and `-O`: {{{ f [InlPrag=NOINLINE] :: Word -> Word [GblId, Arity=1, Caf=NoCafRefs, Str=<S(S),1*U(1*U)>m] f = \ (n_ay2 :: Word) -> case n_ay2 of { GHC.Types.W# x#_a1SL -> case x#_a1SL of { __DEFAULT -> lvl_r4lD; -1## -> lvl1_r4mD } } }}} Apparently `-1##` isn't okay: it needs to be `9223372036854775807##`. -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13172> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler