<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>IdInfo</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[ window.onload = function () {pageLoad();setSynopsis("mini_IdInfo.html");}; //]]> </script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">ghc-7.4.2: The GHC API</p></div><div id="content"><div id="module-header"><table class="info"><tr><th>Safe Haskell</th><td>None</td></tr></table><p class="caption">IdInfo</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">The IdDetails type </a></li><li><a href="#g:2">The IdInfo type </a><ul><li><a href="#g:3">Zapping various forms of Info </a></li><li><a href="#g:4">The ArityInfo type </a></li><li><a href="#g:5">Demand and strictness Info </a></li><li><a href="#g:6">Unfolding Info </a></li><li><a href="#g:7">The InlinePragInfo type </a></li><li><a href="#g:8">The OccInfo type </a></li><li><a href="#g:9">The SpecInfo type </a></li><li><a href="#g:10">The CAFInfo type </a></li><li><a href="#g:11">The LBVarInfo type </a></li><li><a href="#g:12">Tick-box Info </a></li></ul></li></ul></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><span class="keyword">data</span> <a href="#t:IdDetails">IdDetails</a> <ul class="subs"><li>= <a href="#v:VanillaId">VanillaId</a> </li><li>| <a href="#v:RecSelId">RecSelId</a> { <ul class="subs"><li><a href="#v:sel_tycon">sel_tycon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a></li><li><a href="#v:sel_naughty">sel_naughty</a> :: <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li></ul> }</li><li>| <a href="#v:DataConWorkId">DataConWorkId</a> <a href="DataCon.html#t:DataCon">DataCon</a> </li><li>| <a href="#v:DataConWrapId">DataConWrapId</a> <a href="DataCon.html#t:DataCon">DataCon</a> </li><li>| <a href="#v:ClassOpId">ClassOpId</a> <a href="Class.html#t:Class">Class</a> </li><li>| <a href="#v:PrimOpId">PrimOpId</a> <a href="PrimOp.html#t:PrimOp">PrimOp</a> </li><li>| <a href="#v:FCallId">FCallId</a> <a href="ForeignCall.html#t:ForeignCall">ForeignCall</a> </li><li>| <a href="#v:TickBoxOpId">TickBoxOpId</a> <a href="IdInfo.html#t:TickBoxOp">TickBoxOp</a> </li><li>| <a href="#v:DFunId">DFunId</a> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a> </li></ul></li><li class="src short"><a href="#v:pprIdDetails">pprIdDetails</a> :: <a href="IdInfo.html#t:IdDetails">IdDetails</a> -> <a href="Outputable.html#t:SDoc">SDoc</a></li><li class="src short"><a href="#v:coVarDetails">coVarDetails</a> :: <a href="IdInfo.html#t:IdDetails">IdDetails</a></li><li class="src short"><span class="keyword">data</span> <a href="#t:IdInfo">IdInfo</a> </li><li class="src short"><a href="#v:vanillaIdInfo">vanillaIdInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><a href="#v:noCafIdInfo">noCafIdInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><a href="#v:seqIdInfo">seqIdInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> ()</li><li class="src short"><a href="#v:megaSeqIdInfo">megaSeqIdInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> ()</li><li class="src short"><a href="#v:zapLamInfo">zapLamInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><a href="#v:zapDemandInfo">zapDemandInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><a href="#v:zapFragileInfo">zapFragileInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><span class="keyword">type</span> <a href="#t:ArityInfo">ArityInfo</a> = <a href="BasicTypes.html#t:Arity">Arity</a></li><li class="src short"><a href="#v:unknownArity">unknownArity</a> :: <a href="BasicTypes.html#t:Arity">Arity</a></li><li class="src short"><a href="#v:arityInfo">arityInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:ArityInfo">ArityInfo</a></li><li class="src short"><a href="#v:setArityInfo">setArityInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:ArityInfo">ArityInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><a href="#v:ppArityInfo">ppArityInfo</a> :: <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a> -> <a href="Outputable.html#t:SDoc">SDoc</a></li><li class="src short"><a href="#v:strictnessInfo">strictnessInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:StrictSig">StrictSig</a></li><li class="src short"><a href="#v:setStrictnessInfo">setStrictnessInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:StrictSig">StrictSig</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><a href="#v:demandInfo">demandInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:Demand">Demand</a></li><li class="src short"><a href="#v:setDemandInfo">setDemandInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:Demand">Demand</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><a href="#v:pprStrictness">pprStrictness</a> :: <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:StrictSig">StrictSig</a> -> <a href="Outputable.html#t:SDoc">SDoc</a></li><li class="src short"><a href="#v:unfoldingInfo">unfoldingInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="CoreSyn.html#t:Unfolding">Unfolding</a></li><li class="src short"><a href="#v:setUnfoldingInfo">setUnfoldingInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="CoreSyn.html#t:Unfolding">Unfolding</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><a href="#v:setUnfoldingInfoLazily">setUnfoldingInfoLazily</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="CoreSyn.html#t:Unfolding">Unfolding</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><span class="keyword">type</span> <a href="#t:InlinePragInfo">InlinePragInfo</a> = <a href="BasicTypes.html#t:InlinePragma">InlinePragma</a></li><li class="src short"><a href="#v:inlinePragInfo">inlinePragInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="BasicTypes.html#t:InlinePragma">InlinePragma</a></li><li class="src short"><a href="#v:setInlinePragInfo">setInlinePragInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="BasicTypes.html#t:InlinePragma">InlinePragma</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><span class="keyword">data</span> <a href="#t:OccInfo">OccInfo</a> <ul class="subs"><li>= <a href="#v:NoOccInfo">NoOccInfo</a> </li><li>| <a href="#v:IAmDead">IAmDead</a> </li><li>| <a href="#v:OneOcc">OneOcc</a> !<a href="IdInfo.html#t:InsideLam">InsideLam</a> !<a href="IdInfo.html#t:OneBranch">OneBranch</a> !<a href="BasicTypes.html#t:InterestingCxt">InterestingCxt</a> </li><li>| <a href="#v:IAmALoopBreaker">IAmALoopBreaker</a> !RulesOnly </li></ul></li><li class="src short"><a href="#v:isDeadOcc">isDeadOcc</a> :: <a href="IdInfo.html#t:OccInfo">OccInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isStrongLoopBreaker">isStrongLoopBreaker</a> :: <a href="IdInfo.html#t:OccInfo">OccInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isWeakLoopBreaker">isWeakLoopBreaker</a> :: <a href="IdInfo.html#t:OccInfo">OccInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:occInfo">occInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:OccInfo">OccInfo</a></li><li class="src short"><a href="#v:setOccInfo">setOccInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:OccInfo">OccInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><span class="keyword">type</span> <a href="#t:InsideLam">InsideLam</a> = <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><span class="keyword">type</span> <a href="#t:OneBranch">OneBranch</a> = <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:insideLam">insideLam</a> :: <a href="IdInfo.html#t:InsideLam">InsideLam</a></li><li class="src short"><a href="#v:notInsideLam">notInsideLam</a> :: <a href="IdInfo.html#t:InsideLam">InsideLam</a></li><li class="src short"><a href="#v:oneBranch">oneBranch</a> :: <a href="IdInfo.html#t:OneBranch">OneBranch</a></li><li class="src short"><a href="#v:notOneBranch">notOneBranch</a> :: <a href="IdInfo.html#t:OneBranch">OneBranch</a></li><li class="src short"><span class="keyword">data</span> <a href="#t:SpecInfo">SpecInfo</a> = <a href="#v:SpecInfo">SpecInfo</a> [<a href="CoreSyn.html#t:CoreRule">CoreRule</a>] <a href="VarSet.html#t:VarSet">VarSet</a></li><li class="src short"><a href="#v:emptySpecInfo">emptySpecInfo</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a></li><li class="src short"><a href="#v:isEmptySpecInfo">isEmptySpecInfo</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:specInfoFreeVars">specInfoFreeVars</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> <a href="VarSet.html#t:VarSet">VarSet</a></li><li class="src short"><a href="#v:specInfoRules">specInfoRules</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> [<a href="CoreSyn.html#t:CoreRule">CoreRule</a>]</li><li class="src short"><a href="#v:seqSpecInfo">seqSpecInfo</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> ()</li><li class="src short"><a href="#v:setSpecInfoHead">setSpecInfoHead</a> :: <a href="Name.html#t:Name">Name</a> -> <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> <a href="IdInfo.html#t:SpecInfo">SpecInfo</a></li><li class="src short"><a href="#v:specInfo">specInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:SpecInfo">SpecInfo</a></li><li class="src short"><a href="#v:setSpecInfo">setSpecInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><span class="keyword">data</span> <a href="#t:CafInfo">CafInfo</a> <ul class="subs"><li>= <a href="#v:MayHaveCafRefs">MayHaveCafRefs</a> </li><li>| <a href="#v:NoCafRefs">NoCafRefs</a> </li></ul></li><li class="src short"><a href="#v:ppCafInfo">ppCafInfo</a> :: <a href="IdInfo.html#t:CafInfo">CafInfo</a> -> <a href="Outputable.html#t:SDoc">SDoc</a></li><li class="src short"><a href="#v:mayHaveCafRefs">mayHaveCafRefs</a> :: <a href="IdInfo.html#t:CafInfo">CafInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:cafInfo">cafInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:CafInfo">CafInfo</a></li><li class="src short"><a href="#v:setCafInfo">setCafInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:CafInfo">CafInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><span class="keyword">data</span> <a href="#t:LBVarInfo">LBVarInfo</a> <ul class="subs"><li>= <a href="#v:NoLBVarInfo">NoLBVarInfo</a> </li><li>| <a href="#v:IsOneShotLambda">IsOneShotLambda</a> </li></ul></li><li class="src short"><a href="#v:noLBVarInfo">noLBVarInfo</a> :: <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a></li><li class="src short"><a href="#v:hasNoLBVarInfo">hasNoLBVarInfo</a> :: <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:lbvarInfo">lbvarInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a></li><li class="src short"><a href="#v:setLBVarInfo">setLBVarInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></li><li class="src short"><span class="keyword">data</span> <a href="#t:TickBoxOp">TickBoxOp</a> = <a href="#v:TickBox">TickBox</a> <a href="Module.html#t:Module">Module</a> !<a href="IdInfo.html#t:TickBoxId">TickBoxId</a></li><li class="src short"><span class="keyword">type</span> <a href="#t:TickBoxId">TickBoxId</a> = <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a></li></ul></div><div id="interface"><h1 id="g:1">The IdDetails type </h1><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:IdDetails" class="def">IdDetails</a> </p><div class="doc"><p>The <code><a href="IdInfo.html#t:IdDetails">IdDetails</a></code> of an <code>Id</code> give stable, and necessary, information about the Id. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:VanillaId" class="def">VanillaId</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a name="v:RecSelId" class="def">RecSelId</a></td><td class="doc"><p>The <code>Id</code> for a record selector </p></td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:sel_tycon" class="def">sel_tycon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a></dt><dd class="doc"><p>For a data type family, this is the <em>instance</em> <code><a href="TyCon.html#t:TyCon">TyCon</a></code> not the family <code><a href="TyCon.html#t:TyCon">TyCon</a></code> </p></dd><dt class="src"><a name="v:sel_naughty" class="def">sel_naughty</a> :: <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></dt><dd class="doc empty"> </dd></dl><div class="clear"></div></div></td></tr><tr><td class="src"><a name="v:DataConWorkId" class="def">DataConWorkId</a> <a href="DataCon.html#t:DataCon">DataCon</a></td><td class="doc"><p>The <code>Id</code> is for a data constructor <em>worker</em> </p></td></tr><tr><td class="src"><a name="v:DataConWrapId" class="def">DataConWrapId</a> <a href="DataCon.html#t:DataCon">DataCon</a></td><td class="doc"><p>The <code>Id</code> is for a data constructor <em>wrapper</em> </p></td></tr><tr><td class="src"><a name="v:ClassOpId" class="def">ClassOpId</a> <a href="Class.html#t:Class">Class</a></td><td class="doc"><p>The <code>Id</code> is an superclass selector or class operation of a class </p></td></tr><tr><td class="src"><a name="v:PrimOpId" class="def">PrimOpId</a> <a href="PrimOp.html#t:PrimOp">PrimOp</a></td><td class="doc"><p>The <code>Id</code> is for a primitive operator </p></td></tr><tr><td class="src"><a name="v:FCallId" class="def">FCallId</a> <a href="ForeignCall.html#t:ForeignCall">ForeignCall</a></td><td class="doc"><p>The <code>Id</code> is for a foreign call </p></td></tr><tr><td class="src"><a name="v:TickBoxOpId" class="def">TickBoxOpId</a> <a href="IdInfo.html#t:TickBoxOp">TickBoxOp</a></td><td class="doc"><p>The <code>Id</code> is for a HPC tick box (both traditional and binary) </p></td></tr><tr><td class="src"><a name="v:DFunId" class="def">DFunId</a> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></td><td class="doc"><p>A dictionary function. Bool = True <a href="=">=</a> the class has only one method, so may be implemented with a newtype, so it might be bad to be strict on this dictionary </p></td></tr></table></div><div class="subs instances"><p id="control.i:IdDetails" class="caption collapser" onclick="toggleSection('i:IdDetails')">Instances</p><div id="section.i:IdDetails" class="show"><table><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="IdInfo.html#t:IdDetails">IdDetails</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:pprIdDetails" class="def">pprIdDetails</a> :: <a href="IdInfo.html#t:IdDetails">IdDetails</a> -> <a href="Outputable.html#t:SDoc">SDoc</a></p></div><div class="top"><p class="src"><a name="v:coVarDetails" class="def">coVarDetails</a> :: <a href="IdInfo.html#t:IdDetails">IdDetails</a></p></div><h1 id="g:2">The IdInfo type </h1><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:IdInfo" class="def">IdInfo</a> </p><div class="doc"><p>An <code><a href="IdInfo.html#t:IdInfo">IdInfo</a></code> gives <em>optional</em> information about an <code>Id</code>. If present it never lies, but it may not be present, in which case there is always a conservative assumption which can be made. </p><p>Two <code>Id</code>s may have different info even though they have the same <code>Unique</code> (and are hence the same <code>Id</code>); for example, one might lack the properties attached to the other. </p><p>The <code><a href="IdInfo.html#t:IdInfo">IdInfo</a></code> gives information about the value, or definition, of the <code>Id</code>. It does not contain information about the <code>Id'</code>s usage, except for <code><a href="IdInfo.html#v:demandInfo">demandInfo</a></code> and <code><a href="IdInfo.html#v:lbvarInfo">lbvarInfo</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:vanillaIdInfo" class="def">vanillaIdInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a></p><div class="doc"><p>Basic <code><a href="IdInfo.html#t:IdInfo">IdInfo</a></code> that carries no useful information whatsoever </p></div></div><div class="top"><p class="src"><a name="v:noCafIdInfo" class="def">noCafIdInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a></p><div class="doc"><p>More informative <code><a href="IdInfo.html#t:IdInfo">IdInfo</a></code> we can use when we know the <code>Id</code> has no CAF references </p></div></div><div class="top"><p class="src"><a name="v:seqIdInfo" class="def">seqIdInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> ()</p><div class="doc"><p>Just evaluate the <code><a href="IdInfo.html#t:IdInfo">IdInfo</a></code> to WHNF </p></div></div><div class="top"><p class="src"><a name="v:megaSeqIdInfo" class="def">megaSeqIdInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> ()</p><div class="doc"><p>Evaluate all the fields of the <code><a href="IdInfo.html#t:IdInfo">IdInfo</a></code> that are generally demanded by the compiler </p></div></div><h2 id="g:3">Zapping various forms of Info </h2><div class="top"><p class="src"><a name="v:zapLamInfo" class="def">zapLamInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p><div class="doc"><p>This is used to remove information on lambda binders that we have setup as part of a lambda group, assuming they will be applied all at once, but turn out to be part of an unsaturated lambda as in e.g: </p><pre> (\x1. \x2. e) arg1 </pre></div></div><div class="top"><p class="src"><a name="v:zapDemandInfo" class="def">zapDemandInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p><div class="doc"><p>Remove demand info on the <code><a href="IdInfo.html#t:IdInfo">IdInfo</a></code> if it is present, otherwise return <code>Nothing</code> </p></div></div><div class="top"><p class="src"><a name="v:zapFragileInfo" class="def">zapFragileInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p><div class="doc"><p>Zap info that depends on free variables </p></div></div><h2 id="g:4">The ArityInfo type </h2><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:ArityInfo" class="def">ArityInfo</a> = <a href="BasicTypes.html#t:Arity">Arity</a></p><div class="doc"><p>An <code><a href="IdInfo.html#t:ArityInfo">ArityInfo</a></code> of <code>n</code> tells us that partial application of this <code>Id</code> to up to <code>n-1</code> value arguments does essentially no work. </p><p>That is not necessarily the same as saying that it has <code>n</code> leading lambdas, because coerces may get in the way. </p><p>The arity might increase later in the compilation process, if an extra lambda floats up to the binding site. </p></div></div><div class="top"><p class="src"><a name="v:unknownArity" class="def">unknownArity</a> :: <a href="BasicTypes.html#t:Arity">Arity</a></p><div class="doc"><p>It is always safe to assume that an <code>Id</code> has an arity of 0 </p></div></div><div class="top"><p class="src"><a name="v:arityInfo" class="def">arityInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:ArityInfo">ArityInfo</a></p><div class="doc"><p><code>Id</code> arity </p></div></div><div class="top"><p class="src"><a name="v:setArityInfo" class="def">setArityInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:ArityInfo">ArityInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><div class="top"><p class="src"><a name="v:ppArityInfo" class="def">ppArityInfo</a> :: <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a> -> <a href="Outputable.html#t:SDoc">SDoc</a></p></div><h2 id="g:5">Demand and strictness Info </h2><div class="top"><p class="src"><a name="v:strictnessInfo" class="def">strictnessInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:StrictSig">StrictSig</a></p><div class="doc"><p>Id strictness information. Reason for Maybe: the DmdAnal phase needs to know whether this is the first visit, so it can assign botSig. Other customers want topSig. So <code>Nothing</code> is good. </p></div></div><div class="top"><p class="src"><a name="v:setStrictnessInfo" class="def">setStrictnessInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:StrictSig">StrictSig</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><div class="top"><p class="src"><a name="v:demandInfo" class="def">demandInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:Demand">Demand</a></p><div class="doc"><p>Id demand information. Similarly we want to know if there's no known demand yet, for when we are looking for CPR info </p></div></div><div class="top"><p class="src"><a name="v:setDemandInfo" class="def">setDemandInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:Demand">Demand</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><div class="top"><p class="src"><a name="v:pprStrictness" class="def">pprStrictness</a> :: <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Demand.html#t:StrictSig">StrictSig</a> -> <a href="Outputable.html#t:SDoc">SDoc</a></p></div><h2 id="g:6">Unfolding Info </h2><div class="top"><p class="src"><a name="v:unfoldingInfo" class="def">unfoldingInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="CoreSyn.html#t:Unfolding">Unfolding</a></p><div class="doc"><p>The <code>Id</code>s unfolding </p></div></div><div class="top"><p class="src"><a name="v:setUnfoldingInfo" class="def">setUnfoldingInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="CoreSyn.html#t:Unfolding">Unfolding</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><div class="top"><p class="src"><a name="v:setUnfoldingInfoLazily" class="def">setUnfoldingInfoLazily</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="CoreSyn.html#t:Unfolding">Unfolding</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><h2 id="g:7">The InlinePragInfo type </h2><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:InlinePragInfo" class="def">InlinePragInfo</a> = <a href="BasicTypes.html#t:InlinePragma">InlinePragma</a></p><div class="doc"><p>Tells when the inlining is active. When it is active the thing may be inlined, depending on how big it is. </p><p>If there was an <code>INLINE</code> pragma, then as a separate matter, the RHS will have been made to look small with a Core inline <code>Note</code> </p><p>The default <code><a href="IdInfo.html#t:InlinePragInfo">InlinePragInfo</a></code> is <code><a href="BasicTypes.html#v:AlwaysActive">AlwaysActive</a></code>, so the info serves entirely as a way to inhibit inlining until we want it </p></div></div><div class="top"><p class="src"><a name="v:inlinePragInfo" class="def">inlinePragInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="BasicTypes.html#t:InlinePragma">InlinePragma</a></p><div class="doc"><p>Any inline pragma atached to the <code>Id</code> </p></div></div><div class="top"><p class="src"><a name="v:setInlinePragInfo" class="def">setInlinePragInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="BasicTypes.html#t:InlinePragma">InlinePragma</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><h2 id="g:8">The OccInfo type </h2><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:OccInfo" class="def">OccInfo</a> </p><div class="doc"><p>Identifier occurrence information </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:NoOccInfo" class="def">NoOccInfo</a></td><td class="doc"><p>There are many occurrences, or unknown occurences </p></td></tr><tr><td class="src"><a name="v:IAmDead" class="def">IAmDead</a></td><td class="doc"><p>Marks unused variables. Sometimes useful for lambda and case-bound variables. </p></td></tr><tr><td class="src"><a name="v:OneOcc" class="def">OneOcc</a> !<a href="IdInfo.html#t:InsideLam">InsideLam</a> !<a href="IdInfo.html#t:OneBranch">OneBranch</a> !<a href="BasicTypes.html#t:InterestingCxt">InterestingCxt</a></td><td class="doc"><p>Occurs exactly once, not inside a rule </p></td></tr><tr><td class="src"><a name="v:IAmALoopBreaker" class="def">IAmALoopBreaker</a> !RulesOnly</td><td class="doc"><p>This identifier breaks a loop of mutually recursive functions. The field marks whether it is only a loop breaker due to a reference in a rule </p></td></tr></table></div><div class="subs instances"><p id="control.i:OccInfo" class="caption collapser" onclick="toggleSection('i:OccInfo')">Instances</p><div id="section.i:OccInfo" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Text-Show.html#t:Show">Show</a> <a href="IdInfo.html#t:OccInfo">OccInfo</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="IdInfo.html#t:OccInfo">OccInfo</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:isDeadOcc" class="def">isDeadOcc</a> :: <a href="IdInfo.html#t:OccInfo">OccInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:isStrongLoopBreaker" class="def">isStrongLoopBreaker</a> :: <a href="IdInfo.html#t:OccInfo">OccInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:isWeakLoopBreaker" class="def">isWeakLoopBreaker</a> :: <a href="IdInfo.html#t:OccInfo">OccInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:occInfo" class="def">occInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:OccInfo">OccInfo</a></p><div class="doc"><p>How the <code>Id</code> occurs in the program </p></div></div><div class="top"><p class="src"><a name="v:setOccInfo" class="def">setOccInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:OccInfo">OccInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:InsideLam" class="def">InsideLam</a> = <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:OneBranch" class="def">OneBranch</a> = <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:insideLam" class="def">insideLam</a> :: <a href="IdInfo.html#t:InsideLam">InsideLam</a></p></div><div class="top"><p class="src"><a name="v:notInsideLam" class="def">notInsideLam</a> :: <a href="IdInfo.html#t:InsideLam">InsideLam</a></p></div><div class="top"><p class="src"><a name="v:oneBranch" class="def">oneBranch</a> :: <a href="IdInfo.html#t:OneBranch">OneBranch</a></p></div><div class="top"><p class="src"><a name="v:notOneBranch" class="def">notOneBranch</a> :: <a href="IdInfo.html#t:OneBranch">OneBranch</a></p></div><h2 id="g:9">The SpecInfo type </h2><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:SpecInfo" class="def">SpecInfo</a> </p><div class="doc"><p>Records the specializations of this <code>Id</code> that we know about in the form of rewrite <code><a href="CoreSyn.html#t:CoreRule">CoreRule</a></code>s that target them </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:SpecInfo" class="def">SpecInfo</a> [<a href="CoreSyn.html#t:CoreRule">CoreRule</a>] <a href="VarSet.html#t:VarSet">VarSet</a></td><td class="doc empty"> </td></tr></table></div></div><div class="top"><p class="src"><a name="v:emptySpecInfo" class="def">emptySpecInfo</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a></p><div class="doc"><p>Assume that no specilizations exist: always safe </p></div></div><div class="top"><p class="src"><a name="v:isEmptySpecInfo" class="def">isEmptySpecInfo</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:specInfoFreeVars" class="def">specInfoFreeVars</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> <a href="VarSet.html#t:VarSet">VarSet</a></p><div class="doc"><p>Retrieve the locally-defined free variables of both the left and right hand sides of the specialization rules </p></div></div><div class="top"><p class="src"><a name="v:specInfoRules" class="def">specInfoRules</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> [<a href="CoreSyn.html#t:CoreRule">CoreRule</a>]</p></div><div class="top"><p class="src"><a name="v:seqSpecInfo" class="def">seqSpecInfo</a> :: <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> ()</p></div><div class="top"><p class="src"><a name="v:setSpecInfoHead" class="def">setSpecInfoHead</a> :: <a href="Name.html#t:Name">Name</a> -> <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> <a href="IdInfo.html#t:SpecInfo">SpecInfo</a></p><div class="doc"><p>Change the name of the function the rule is keyed on on all of the <code><a href="CoreSyn.html#t:CoreRule">CoreRule</a></code>s </p></div></div><div class="top"><p class="src"><a name="v:specInfo" class="def">specInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:SpecInfo">SpecInfo</a></p><div class="doc"><p>Specialisations of the <code>Id</code>s function which exist See Note [Specialisations and RULES in IdInfo] </p></div></div><div class="top"><p class="src"><a name="v:setSpecInfo" class="def">setSpecInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:SpecInfo">SpecInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><h2 id="g:10">The CAFInfo type </h2><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:CafInfo" class="def">CafInfo</a> </p><div class="doc"><p>Records whether an <code>Id</code> makes Constant Applicative Form references </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:MayHaveCafRefs" class="def">MayHaveCafRefs</a></td><td class="doc"><p>Indicates that the <code>Id</code> is for either: </p><ol><li> A function or static constructor that refers to one or more CAFs, or </li><li> A real live CAF </li></ol></td></tr><tr><td class="src"><a name="v:NoCafRefs" class="def">NoCafRefs</a></td><td class="doc"><p>A function or static constructor that refers to no CAFs. </p></td></tr></table></div><div class="subs instances"><p id="control.i:CafInfo" class="caption collapser" onclick="toggleSection('i:CafInfo')">Instances</p><div id="section.i:CafInfo" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Data-Eq.html#t:Eq">Eq</a> <a href="IdInfo.html#t:CafInfo">CafInfo</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="../base-4.5.1.0/Data-Ord.html#t:Ord">Ord</a> <a href="IdInfo.html#t:CafInfo">CafInfo</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="IdInfo.html#t:CafInfo">CafInfo</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:ppCafInfo" class="def">ppCafInfo</a> :: <a href="IdInfo.html#t:CafInfo">CafInfo</a> -> <a href="Outputable.html#t:SDoc">SDoc</a></p></div><div class="top"><p class="src"><a name="v:mayHaveCafRefs" class="def">mayHaveCafRefs</a> :: <a href="IdInfo.html#t:CafInfo">CafInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:cafInfo" class="def">cafInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:CafInfo">CafInfo</a></p><div class="doc"><p><code>Id</code> CAF info </p></div></div><div class="top"><p class="src"><a name="v:setCafInfo" class="def">setCafInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:CafInfo">CafInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><h2 id="g:11">The LBVarInfo type </h2><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:LBVarInfo" class="def">LBVarInfo</a> </p><div class="doc"><p>If the <code>Id</code> is a lambda-bound variable then it may have lambda-bound variable info. Sometimes we know whether the lambda binding this variable is a "one-shot" lambda; that is, whether it is applied at most once. </p><p>This information may be useful in optimisation, as computations may safely be floated inside such a lambda without risk of duplicating work. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:NoLBVarInfo" class="def">NoLBVarInfo</a></td><td class="doc"><p>No information </p></td></tr><tr><td class="src"><a name="v:IsOneShotLambda" class="def">IsOneShotLambda</a></td><td class="doc"><p>The lambda is applied at most once). </p></td></tr></table></div><div class="subs instances"><p id="control.i:LBVarInfo" class="caption collapser" onclick="toggleSection('i:LBVarInfo')">Instances</p><div id="section.i:LBVarInfo" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Text-Show.html#t:Show">Show</a> <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:noLBVarInfo" class="def">noLBVarInfo</a> :: <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a></p><div class="doc"><p>It is always safe to assume that an <code>Id</code> has no lambda-bound variable information </p></div></div><div class="top"><p class="src"><a name="v:hasNoLBVarInfo" class="def">hasNoLBVarInfo</a> :: <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a> -> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:lbvarInfo" class="def">lbvarInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a></p><div class="doc"><p>Info about a lambda-bound variable, if the <code>Id</code> is one </p></div></div><div class="top"><p class="src"><a name="v:setLBVarInfo" class="def">setLBVarInfo</a> :: <a href="IdInfo.html#t:IdInfo">IdInfo</a> -> <a href="IdInfo.html#t:LBVarInfo">LBVarInfo</a> -> <a href="IdInfo.html#t:IdInfo">IdInfo</a></p></div><h2 id="g:12">Tick-box Info </h2><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:TickBoxOp" class="def">TickBoxOp</a> </p><div class="doc"><p>Tick box for Hpc-style coverage </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:TickBox" class="def">TickBox</a> <a href="Module.html#t:Module">Module</a> !<a href="IdInfo.html#t:TickBoxId">TickBoxId</a></td><td class="doc empty"> </td></tr></table></div><div class="subs instances"><p id="control.i:TickBoxOp" class="caption collapser" onclick="toggleSection('i:TickBoxOp')">Instances</p><div id="section.i:TickBoxOp" class="show"><table><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="IdInfo.html#t:TickBoxOp">TickBoxOp</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:TickBoxId" class="def">TickBoxId</a> = <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a></p></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.11.0</p></div></body></html>