let/app invariant violated by code generated with mkCoreApp

Dr. ÉRDI Gergő gergo at erdi.hu
Wed Nov 12 02:23:47 UTC 2014


Yep, that seems to work. I'll add a note explaining why we need unfoldings
here.
On Nov 11, 2014 10:14 PM, "Simon Peyton Jones" <simonpj at microsoft.com>
wrote:

> Oh bother, that is _so_ tiresome. The desugarer establishes the let/app
> invariant, so we get
>
>         I# x_help
>
> but if x_help has a compulsory unfolding to (x void), returning an Int#,
> that violates the let/app invariant.  Sigh.  This is a ridiculous amount of
> work for a tiny corner (pattern synonyms for unboxed constants).
>
> Harump.  Let's see.  We are talking only of things like this
>
>         pattern P = 4#
>
> correct?  Perhaps it may be simpler to make the psWrapper in PatSyn be
>         psWrapper :: Either Id Literal
> and treat such patterns specially from the moment we first see them?  That
> would eliminate all this void stuff entirely.
>
> Pursuing the current line, though, I suppose that the desugarer could
> inline compulsory unfoldings during desugaring itself.  In this line, add a
> case for when var has a compulsory unfolding.
>
> dsExpr (HsVar var)            = return (varToCoreExpr var)   -- See Note
> [Desugaring vars]
>
> That would, I suppose, be the quickest pathc.
>
> Simon
>
> |  -----Original Message-----
> |  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of Dr.
> |  ERDI Gergo
> |  Sent: 08 November 2014 14:03
> |  To: GHC Devs
> |  Subject: let/app invariant violated by code generated with mkCoreApp
> |
> |  Hi,
> |
> |  I'm trying to attach (f Void#) as a compulsory unfolding to an Id.
> |  Here's what I tried originally:
> |
> |       let unfolding = mkCoreApp (Var worker_id) (Var voidPrimId)
> |           wrapper_id' = setIdUnfolding wrapper_id $
> |  mkCompulsoryUnfolding unfolding
> |
> |  However, when I try to use wrapper_id' in the desugarer, the Core
> |  linter looks at me strange. This is the original Core:
> |
> |  f :: Int
> |  [LclIdX, Str=DmdType]
> |  f = break<1>() GHC.Types.I# Main.$WPAT
> |
> |  and this is the error message ($WPAT is the wrapper_id', PAT is the
> |  worker_id in this example)
> |
> |  <no location info>: Warning:
> |       In the expression: I# (PAT void#)
> |       This argument does not satisfy the let/app invariant: PAT void#
> |
> |  Now, I thought I'd make sure mkCoreApp generated correct Core by
> |  writing it out by hand:
> |
> |       let unfolding = Case (Var voidPrimId) voidArgId pat_ty
> |  [(DEFAULT,[],App (Var worker_id) (Var voidArgId))]
> |
> |  however, bizarrely, this *still* results in *the same* error message,
> |  as if something was transforming it back to a straight App.
> |
> |  Anyone have any hints what I'm doing wrong here?
> |
> |  Bye,
> |       Gergo
> |
> |  --
> |
> |     .--= ULLA! =-----------------.
> |      \     http://gergo.erdi.hu   \
> |       `---= gergo at erdi.hu =-------'
> |  You are in a twisty maze of little install diskettes.
> |  _______________________________________________
> |  ghc-devs mailing list
> |  ghc-devs at haskell.org
> |  http://www.haskell.org/mailman/listinfo/ghc-devs
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/ghc-devs/attachments/20141112/02f47722/attachment.html>


More information about the ghc-devs mailing list