<div dir="ltr"><div>So if I understand correctly, OtherCon is only created here: <a href="https://gitlab.haskell.org/ghc/ghc/-/blob/a952dd80d40bf6b67194a44ff71d7bf75957d29e/compiler/GHC/Core/Opt/Simplify.hs#L3071-3077">https://gitlab.haskell.org/ghc/ghc/-/blob/a952dd80d40bf6b67194a44ff71d7bf75957d29e/compiler/GHC/Core/Opt/Simplify.hs#L3071-3077</a></div><div><br></div><div>simplAlt env _ imposs_deflt_cons case_bndr' cont' (Alt DEFAULT bndrs rhs)<br>  = assert (null bndrs) $<br>    do  { let env' = addBinderUnfolding env case_bndr'<br>                                        (mkOtherCon imposs_deflt_cons)<br>                -- Record the constructors that the case-binder *can't* be.<br>        ; rhs' <- simplExprC env' rhs cont'<br>        ; return (Alt DEFAULT [] rhs') }<br><br></div><div>What you should know is that in Core case-expressions are actually more like:<br><br></div><div>case scrut as b of alts</div><div><br></div><div>where `b` binds the evaluated result of `scrut.</div><div><br></div><div>So if I am to understand the `simplAlt` code correctly, `case_bndr'` is the binder for the evaluated result of `scrut`.</div><div>And what is recorded in the unfolding is that once we get to the DEFAULT pattern, we know that `case_bndr'` cannot be the constructors in `imposs_deflt_cons` (probably the constructor matched by the other alternatives).</div><div><br></div><div>Now... there's also a FloutOut pass, which might have floated that `case_bndr'` to the TopLevel.</div><div>And I think that is what you're seeing, and I think you can simply ignore them.<br></div><div><br></div><div><br></div><div>Also... another thing that you should know is that -fexpose-all-unfoldings doesn't actually expose *all* unfoldings.</div><div>Bottoming bindings are never exposed.</div><div>That's why in the Clash compiler we have the following code when loading core-expressions from .hi files <a href="https://github.com/clash-lang/clash-compiler/blob/cb93b418865e244da50e1d2bc85fbc01bf761f3f/clash-ghc/src-ghc/Clash/GHC/LoadInterfaceFiles.hs#L473-L481">https://github.com/clash-lang/clash-compiler/blob/cb93b418865e244da50e1d2bc85fbc01bf761f3f/clash-ghc/src-ghc/Clash/GHC/LoadInterfaceFiles.hs#L473-L481</a></div><div><br></div><div>loadExprFromTyThing :: CoreSyn.CoreBndr -> GHC.TyThing -> Maybe CoreSyn.CoreExpr<br>loadExprFromTyThing bndr tyThing = case tyThing of<br>  GHC.AnId _id | Var.isId _id -><br>    let _idInfo    = Var.idInfo _id<br>        unfolding  = IdInfo.unfoldingInfo _idInfo<br>    in case unfolding of<br>      CoreSyn.CoreUnfolding {} -><br>        Just (CoreSyn.unfoldingTemplate unfolding)<br>      CoreSyn.DFunUnfolding dfbndrs dc es -><br>        Just (MkCore.mkCoreLams dfbndrs (MkCore.mkCoreConApps dc es))<br>      CoreSyn.NoUnfolding<br>#if MIN_VERSION_ghc(9,0,0)<br>        | Demand.isDeadEndSig $ IdInfo.strictnessInfo _idInfo<br>#else<br>        | Demand.isBottomingSig $ IdInfo.strictnessInfo _idInfo<br>#endif<br>        -> do<br>          let noUnfoldingErr = "no_unfolding " ++ showPpr unsafeGlobalDynFlags bndr<br>          Just (MkCore.mkAbsentErrorApp (Var.varType _id) noUnfoldingErr)<br>      _ -> Nothing<br>  _ -> Nothing</div><div><br></div><div>i.e. when we encounter a NoUnfolding with a bottoming demand signature, we conjure an absentError out of thin air.<br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 1 Apr 2022 at 10:05, ÉRDI Gergő <<a href="mailto:gergo@erdi.hu">gergo@erdi.hu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
I'm CC-ing the Clash mailing list because I believe they should have <br>
encountered the same problem (and perhaps have found a solution to it <br>
already!).<br>
<br>
I'm trying to use `.hi` files compiled with `ExposeAllUnfoldings` set to <br>
reconstruct full Core bindings for further processing. By and large, this <br>
works, but I get tripped up on identifiers whose unfolding is only given <br>
as `OtherCon []`. It is unclear to me what is causing this -- some of them <br>
are recursive bindings while others are not.<br>
<br>
The problem, of course, is that if all I know about an identifier is that <br>
it is `OtherCon []`, that doesn't allow me to restore its definition. So <br>
is there a way to tell GHC to put "full" unfoldings everywhere in <br>
`ExposeAllUnfoldings` mode?<br>
<br>
Thanks,<br>
        Gergo<br>
<br>
-- <br>
You received this message because you are subscribed to the Google Groups "Clash - Hardware Description Language" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="mailto:clash-language%2Bunsubscribe@googlegroups.com" target="_blank">clash-language+unsubscribe@googlegroups.com</a>.<br>
To view this discussion on the web visit <a href="https://groups.google.com/d/msgid/clash-language/alpine.DEB.2.22.394.2204011556570.3183073%40galaxy" rel="noreferrer" target="_blank">https://groups.google.com/d/msgid/clash-language/alpine.DEB.2.22.394.2204011556570.3183073%40galaxy</a>.<br>
</blockquote></div>