Disappearing case alternative?

Conal Elliott conal at conal.net
Sun Mar 13 03:55:53 UTC 2016


I think you put your finger on the problem here. That `evalP` is a
placeholder to get transformed away later. I thought that my `NOINLINE`
annotation would prevent GHC from noticing that `evalP` evaluates to
bottom. I'll do a better job.

Thank you!

-- Conal


On Fri, Mar 11, 2016 at 4:06 PM, Ömer Sinan Ağacan <omeragacan at gmail.com>
wrote:

> Empty case expressions like `case evalP @ (Pair Int) ds of wild { }` are
> only
> valid if the scrutinee is bottom, see CoreLint.hs for how exprIsBottom is
> used
> and CoreUtils.hs for how it's defined. So it seems like the simplifier
> somehow
> figured that `evalP @ (Pair Int) ds` is bottom, and generated an empty
> case.
>
> Is the linter complaining about this case expression? (you can try it using
> CoreLint.lintExpr)
>
> 2016-03-11 16:49 GMT-05:00 Conal Elliott <conal at conal.net>:
> >
> > I'm working on a GHC plugin, mainly in the form of a "builtin" rewrite
> rule,
> > and I'm seeing a strange disappearance of a case alternative. With
> > -ddump-rule-rewrites, I can see before & after the disappearance: Here's
> one
> > rule firing with the alternative present:
> >
> >     Rule fired
> >         Rule: reify
> >         Before: reifyP
> >                   TyArg Pair Int -> Int
> >                   ValArg \ (ds :: Pair Int) ->
> >                            case ds of _ { :# a b -> $fNumInt_$c+ a b }
> >         After:  lamP
> >                   @ (Pair Int)
> >                   @ Int
> >                   "ds"#
> >                   (\ (ds :: EP (Pair Int)) ->
> >                      reifyP
> >                        @ Int
> >                        (case evalP @ (Pair Int) ds of _ { :# a b ->
> > $fNumInt_$c+ a b }))
> >         Cont:   StrictArg toE
> >                 Stop[BoringCtxt] E Prim (Pair Int -> Int)
> >
> > The next thing I see is the rule firing again on the residual reifyP
> > application, but with the case alternative gone:
> >
> >     Rule fired
> >         Rule: reify
> >         Before: reifyP
> >                   TyArg Int ValArg case evalP @ (Pair Int) ds of wild { }
> >         After:  ...
> >
> > Any ideas what's causing the disappearance?
> >
> > Thanks.  - Conal
> >
> >
> > _______________________________________________
> > ghc-devs mailing list
> > ghc-devs at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20160312/8c53e3b4/attachment.html>


More information about the ghc-devs mailing list