
#14140: Better treatment for dataToTag -------------------------------------+------------------------------------- Reporter: simonpj | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.1 Resolution: | Keywords: datacon-tags Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): hysl20 is right. Doing stuff in `PrelRules` works if the rewrite we want is something like `dataToTag True ---> 1`. But for this ticket we don't want that. What we know is negative information: `dataToTag x` cannot be `16#`. This is carried by the `OtherCon` uunfolding for `x`. So the place to implement this ticket (if that is behind your question) is `SimplUtils.prepareAlts`. We want to say "if the scrutinee is `dataToTag x` and `x` has an unfolding of `OtherCon [A,B,C]`, then eliminate any alternatives that match those constructors". Something like this in `prepareAlts` {{{ imposs_cons = case scrut of Var v -> otherCons (idUnfolding v) -- as now App dataToTag (Var v) -> map (LitCon . conToTag) (otherCons (idUnfolding v)) _ -> [] }}} That is, * If the scrutinee is `dataToTag v` * And v cannot be `[A,C,F]` * Then we know that `dataToTag v` cannot be `[1#, 3#, 6#]` * And so we can make a suitable `imposs_cons` Does that help? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14140#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler