Ok, I'll open a ticket. To reproduce: 1. patch GHC head: *git apply StgScopeCheck.patch* 2. make sure every compiled stg is linted: *add -dstg-lint* to GhcStage2HcOpts GhcLibHcOpts GhcRtsHcOpts config vars 3. compile GHC HEAD
On Tue, Nov 6, 2018 at 4:39 PM Simon Peyton Jones <simo...@microsoft.com> wrote: > can you open a Trac ticket, and explain how to reproduce it? Does it > require a patch, or does -ddump-stg show it? > > > > thanks > > > > Simion > > > > *From:* Csaba Hruska <csaba.hru...@gmail.com> > *Sent:* 06 November 2018 15:36 > *To:* Simon Peyton Jones <simo...@microsoft.com> > *Cc:* ghc-devs@haskell.org > *Subject:* Re: StgRhsClosure freevar and argument name duplicates > > > > You can reproduce the error with the GHC HEAD and with the attached patch > for StgLinter. > > The patch adds scope checking for the linter. > > I've also attached the linter's error output against GHC HEAD. > > Compile GHC HEAD with the following settings: > > GhcStage1HcOpts= > GhcStage2HcOpts=-O2 -haddock -dstg-lint > GhcStage3HcOpts=-O2 -haddock -dstg-lint > > > > Regards, > > Csaba > > > > > > On Tue, Nov 6, 2018 at 12:19 PM Csaba Hruska <csaba.hru...@gmail.com> > wrote: > > Correction: I've also noticed that there are two Main.main top-level > binders in the generated STG with different uniques. > > > > On Tue, Nov 6, 2018 at 12:19 PM Csaba Hruska <csaba.hru...@gmail.com> > wrote: > > I've also noticed that there are two Main.main top-level binders in the > generated STG with different uniques? > > And GHC produces a working executable. > > Is Main.main an exception or does top-level names have some kind of > "should be exported" property? > > > > On Tue, Nov 6, 2018 at 12:02 PM Simon Peyton Jones <simo...@microsoft.com> > wrote: > > I think top level names should be unique in occ-names; because those > occ-names generate the symbols in the binary. > > > > Simon > > > > *From:* Csaba Hruska <csaba.hru...@gmail.com> > *Sent:* 06 November 2018 11:01 > *To:* Simon Peyton Jones <simo...@microsoft.com> > *Cc:* ghc-devs@haskell.org > *Subject:* Re: StgRhsClosure freevar and argument name duplicates > > > > My plan is to extend GHC's STG linter to check the following properties: > > - uniqueness of free var and arg list of StgRhsClosure > - top level binding name uniqueness > > I'll patch my local GHC 8.2.2 and GHC HEAD. I'll also attach the patch to > the ticket. > > I have a question regarding top level names. > > Should the top-level names be unique as occ names or just in unique values? > > If not, then what is the rule? > > > > Thanks, > > Csaba > > > > On Tue, Nov 6, 2018 at 11:13 AM Simon Peyton Jones <simo...@microsoft.com> > wrote: > > Does this happen in HEAD with GHC’s own STG printer? If so, could you > file a Trac ticket – it’s clearly wrong. > > > > But I do wonder if it could perhaps be something to do with your branch? > > > > Thanks > > > > Simon > > > > *From:* Csaba Hruska <csaba.hru...@gmail.com> > *Sent:* 05 November 2018 16:33 > *To:* Simon Peyton Jones <simo...@microsoft.com> > *Cc:* ghc-devs@haskell.org > *Subject:* Re: StgRhsClosure freevar and argument name duplicates > > > > Correction! > > The problem happens in integer-gmp: > > https://github.com/ghc/ghc/blob/master/libraries/integer-gmp/src/GHC/Integer/Type.hs#L761-L770 > <https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fghc%2Fghc%2Fblob%2Fmaster%2Flibraries%2Finteger-gmp%2Fsrc%2FGHC%2FInteger%2FType.hs%23L761-L770&data=02%7C01%7Csimonpj%40microsoft.com%7C8ed5614402be4321be6908d643fda441%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636771154034475485&sdata=tglY4lglir%2FKqm3ApXo9gW4gHCWeRIBjP7UMEytNjxQ%3D&reserved=0> > > > > On Mon, Nov 5, 2018 at 5:27 PM Csaba Hruska <csaba.hru...@gmail.com> > wrote: > > An example for the duplication please check the divModInteger > <https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fghc%2Fghc%2Fblob%2Fmaster%2Flibraries%2Finteger-simple%2FGHC%2FInteger%2FType.hs%23L373-L380&data=02%7C01%7Csimonpj%40microsoft.com%7C8ed5614402be4321be6908d643fda441%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636771154034485494&sdata=6u7J6besY3OM9zfcr0x0LRuo7zJRphr6iHOq6xwO7mo%3D&reserved=0> > function from integer-simple GHC.Integer.Type. > > The STG (GHC 8.2.2) generated from *divModInteger* *::** Integer -> > Integer -> (# Integer, Integer #) *contains duplications in a closure > binder list. > > > > Using my custom STG printer it looks like: > > module GHC.Integer.Type where > > > > using GHC.Prim > using GHC.Tuple > using GHC.Types > > > > GHC.Integer.Type.divModInteger {-083-} = > closure (F:) (B: > n.s84123 {-s84123-} > d.s84124 {-s84124-}) { > case GHC.Integer.Type.quotRemInteger {-084-} > n.s84123 {-s84123-} > d.s84124 {-s84124-} > of qr.s84125 {-s84125-} { > GHC.Prim.(#,#) {-86-} ipv.s84126 {-s84126-} ipv1.s84127 {-s84127-} -> > let $j.s84128 {-s84128-} = > closure (F: > d.s84124 {-s84124-} > * ipv.s84126 {-s84126-}* > * ipv1.s84127 {-s84127-}* > * ipv.s84126 {-s84126-}* > *ipv1.s84127 {-s84127-}*) (B: > wild.s84129 {-s84129-}) { > let $j1.s84130 {-s84130-} = > closure (F: > d.s84124 {-s84124-} > ipv.s84126 {-s84126-} > ipv1.s84127 {-s84127-} > ipv.s84126 {-s84126-} > ipv1.s84127 {-s84127-} > wild.s84129 {-s84129-}) (B: > wild1.s84131 {-s84131-}) { > case _stg_prim_negateInt# > wild.s84129 {-s84129-} > of sat.s84132 {-s84132-} { > DEFAULT -> > case _stg_prim_==# > wild1.s84131 {-s84131-} > sat.s84132 {-s84132-} > of sat.s84133 {-s84133-} { > DEFAULT -> > case _stg_prim_tagToEnum# > sat.s84133 {-s84133-} > of wild2.s84134 {-s84134-} { > GHC.Types.False {-612-} -> > GHC.Prim.(#,#) {-86-} > ipv.s84126 {-s84126-} > ipv1.s84127 {-s84127-} > GHC.Types.True {-645-} -> > case GHC.Integer.Type.plusInteger {-066-} > ipv1.s84127 {-s84127-} > d.s84124 {-s84124-} > of r'.s84135 {-s84135-} { > DEFAULT -> > case GHC.Integer.Type.plusInteger {-066-} > ipv.s84126 {-s84126-} > GHC.Integer.Type.lvl11 {-r50574-} > of q'.s84136 {-s84136-} { > DEFAULT -> > GHC.Prim.(#,#) {-86-} > q'.s84136 {-s84136-} > r'.s84135 {-s84135-} > } > } > } > } > }} > > in case ipv1.s84127 {-s84127-} > of wild1.s84137 {-s84137-} { > GHC.Integer.Type.S# {-621-} i#.s84138 {-s84138-} -> > case _stg_prim_<# > i#.s84138 {-s84138-} 0# > of sat.s84140 {-s84140-} { > DEFAULT -> > case _stg_prim_># > i#.s84138 {-s84138-} 0# > of sat.s84139 {-s84139-} { > DEFAULT -> > case _stg_prim_-# > sat.s84139 {-s84139-} > sat.s84140 {-s84140-} > of sat.s84141 {-s84141-} { > DEFAULT -> > $j1.s84130 {-s84130-} > sat.s84141 {-s84141-} > } > } > } > GHC.Integer.Type.Jp# > <https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2FGHC.Integer.Type.Jp%23&data=02%7C01%7Csimonpj%40microsoft.com%7C8ed5614402be4321be6908d643fda441%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636771154034495502&sdata=2WLaJGm7NgH0FvibSDarfwBraI9nn0uAZVUH6CwaMno%3D&reserved=0> > {-r5813-} dt.s84142 {-s84142-} -> > $j1.s84130 {-s84130-} 1# > GHC.Integer.Type.Jn# {-r5814-} dt.s84143 {-s84143-} -> > $j1.s84130 {-s84130-} -1# > }} > > in case d.s84124 {-s84124-} > of wild.s84144 {-s84144-} { > GHC.Integer.Type.S# {-621-} i#.s84145 {-s84145-} -> > case _stg_prim_<# > i#.s84145 {-s84145-} 0# > of sat.s84147 {-s84147-} { > DEFAULT -> > case _stg_prim_># > i#.s84145 {-s84145-} 0# > of sat.s84146 {-s84146-} { > DEFAULT -> > case _stg_prim_-# > sat.s84146 {-s84146-} > sat.s84147 {-s84147-} > of sat.s84148 {-s84148-} { > DEFAULT -> > $j.s84128 {-s84128-} > sat.s84148 {-s84148-} > } > } > } > GHC.Integer.Type.Jp# > <https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2FGHC.Integer.Type.Jp%23&data=02%7C01%7Csimonpj%40microsoft.com%7C8ed5614402be4321be6908d643fda441%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636771154034495502&sdata=2WLaJGm7NgH0FvibSDarfwBraI9nn0uAZVUH6CwaMno%3D&reserved=0> > {-r5813-} dt.s84149 {-s84149-} -> > $j.s84128 {-s84128-} 1# > GHC.Integer.Type.Jn# {-r5814-} dt.s84150 {-s84150-} -> > $j.s84128 {-s84128-} -1# > } > }} > > > > On Mon, Nov 5, 2018 at 2:08 PM Simon Peyton Jones <simo...@microsoft.com> > wrote: > > I don’t think there should be duplicates in either. Do you have a test > case that shows duplicates? > > > > Simon > > > > *From:* ghc-devs <ghc-devs-boun...@haskell.org> *On Behalf Of *Csaba > Hruska > *Sent:* 04 November 2018 11:22 > *To:* ghc-devs@haskell.org > *Subject:* Re: StgRhsClosure freevar and argument name duplicates > > > > Is it possible that GHC generates STG with invalid binding semantics for > certain cases that the Cmm codegen fix or ignore? > > This could explain my observations. > > I've checked the Stg linter source (StgLint.hs ; GHC 8.2.2 and github > master) and it does not check StgRhsClosure free var and binder list at all. > > And the scope checker function (addInScopeVars) does not check for > duplicates. > > > > Any thoughts? > > > > Cheers, > > Csaba > > > > On Sat, Nov 3, 2018 at 9:53 AM Csaba Hruska <csaba.hru...@gmail.com> > wrote: > > Hi, > > > > Can StgRhsClosure's freevar list ([occ]) or argument list ([bndr]) contain > duplicates? > > > > Cheers, > > Csaba > > > > data GenStgRhs bndr occ > = StgRhsClosure > CostCentreStack -- CCS to be attached (default is > CurrentCCS) > StgBinderInfo -- Info about how this binder is used (see > below) > *[occ]* -- non-global free vars; a list, rather > than > -- a set, because order is important > !UpdateFlag -- ReEntrant | Updatable | SingleEntry > *[bndr]* -- arguments; if empty, then not a > function; > -- as above, order is important. > (GenStgExpr bndr occ) -- body > > > >
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs