Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1752

ghc-ghc-devel-6.12.3-5.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>basicTypes/IdInfo.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
%
\section[IdInfo]{@IdInfos@: Non-essential information about @Ids@}

(And a pretty good illustration of quite a few things wrong with
Haskell. [WDP 94/11])

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>IdInfo</span> <span class='hs-layout'>(</span>
<a name="line-2"></a>        <span class='hs-comment'>-- * The IdDetails type</span>
<a name="line-3"></a>	<span class='hs-conid'>IdDetails</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprIdDetails</span><span class='hs-layout'>,</span>
<a name="line-4"></a>
<a name="line-5"></a>        <span class='hs-comment'>-- * The IdInfo type</span>
<a name="line-6"></a>	<span class='hs-conid'>IdInfo</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- Abstract</span>
<a name="line-7"></a>	<span class='hs-varid'>vanillaIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>noCafIdInfo</span><span class='hs-layout'>,</span>
<a name="line-8"></a>	<span class='hs-varid'>seqIdInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>megaSeqIdInfo</span><span class='hs-layout'>,</span>
<a name="line-9"></a>
<a name="line-10"></a>	<span class='hs-comment'>-- ** Zapping various forms of Info</span>
<a name="line-11"></a>	<span class='hs-varid'>zapLamInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapDemandInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>zapFragileInfo</span><span class='hs-layout'>,</span>
<a name="line-12"></a>
<a name="line-13"></a>	<span class='hs-comment'>-- ** The ArityInfo type</span>
<a name="line-14"></a>	<span class='hs-conid'>ArityInfo</span><span class='hs-layout'>,</span>
<a name="line-15"></a>	<span class='hs-varid'>unknownArity</span><span class='hs-layout'>,</span> 
<a name="line-16"></a>	<span class='hs-varid'>arityInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setArityInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppArityInfo</span><span class='hs-layout'>,</span> 
<a name="line-17"></a>
<a name="line-18"></a>	<span class='hs-comment'>-- ** Demand and strictness Info</span>
<a name="line-19"></a> 	<span class='hs-varid'>newStrictnessInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setNewStrictnessInfo</span><span class='hs-layout'>,</span> 
<a name="line-20"></a>  	<span class='hs-varid'>newDemandInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setNewDemandInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprNewStrictness</span><span class='hs-layout'>,</span>
<a name="line-21"></a>	<span class='hs-varid'>setAllStrictnessInfo</span><span class='hs-layout'>,</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-24"></a>	<span class='hs-comment'>-- ** Old strictness Info</span>
<a name="line-25"></a>	<span class='hs-conid'>StrictnessInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-26"></a>	<span class='hs-varid'>mkStrictnessInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>noStrictnessInfo</span><span class='hs-layout'>,</span>
<a name="line-27"></a>	<span class='hs-varid'>ppStrictnessInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>isBottomingStrictness</span><span class='hs-layout'>,</span> 
<a name="line-28"></a>	<span class='hs-varid'>strictnessInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setStrictnessInfo</span><span class='hs-layout'>,</span>
<a name="line-29"></a>	
<a name="line-30"></a>        <span class='hs-varid'>oldStrictnessFromNew</span><span class='hs-layout'>,</span> <span class='hs-varid'>newStrictnessFromOld</span><span class='hs-layout'>,</span>
<a name="line-31"></a>
<a name="line-32"></a>	<span class='hs-comment'>-- ** Old demand Info</span>
<a name="line-33"></a>	<span class='hs-varid'>demandInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setDemandInfo</span><span class='hs-layout'>,</span> 
<a name="line-34"></a>	<span class='hs-varid'>oldDemand</span><span class='hs-layout'>,</span> <span class='hs-varid'>newDemand</span><span class='hs-layout'>,</span>
<a name="line-35"></a>
<a name="line-36"></a>        <span class='hs-comment'>-- ** Old Constructed Product Result Info</span>
<a name="line-37"></a>        <span class='hs-conid'>CprInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-38"></a>        <span class='hs-varid'>cprInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setCprInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppCprInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>noCprInfo</span><span class='hs-layout'>,</span>
<a name="line-39"></a>        <span class='hs-varid'>cprInfoFromNewStrictness</span><span class='hs-layout'>,</span>
<a name="line-40"></a><span class='hs-cpp'>#endif</span>
<a name="line-41"></a>
<a name="line-42"></a>        <span class='hs-comment'>-- ** The WorkerInfo type</span>
<a name="line-43"></a>        <span class='hs-conid'>WorkerInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-44"></a>        <span class='hs-varid'>workerExists</span><span class='hs-layout'>,</span> <span class='hs-varid'>wrapperArity</span><span class='hs-layout'>,</span> <span class='hs-varid'>workerId</span><span class='hs-layout'>,</span>
<a name="line-45"></a>        <span class='hs-varid'>workerInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setWorkerInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppWorkerInfo</span><span class='hs-layout'>,</span>
<a name="line-46"></a>
<a name="line-47"></a>	<span class='hs-comment'>-- ** Unfolding Info</span>
<a name="line-48"></a>	<span class='hs-varid'>unfoldingInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setUnfoldingInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setUnfoldingInfoLazily</span><span class='hs-layout'>,</span>
<a name="line-49"></a>
<a name="line-50"></a>	<span class='hs-comment'>-- ** The InlinePragInfo type</span>
<a name="line-51"></a>	<span class='hs-conid'>InlinePragInfo</span><span class='hs-layout'>,</span>
<a name="line-52"></a>	<span class='hs-varid'>inlinePragInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setInlinePragInfo</span><span class='hs-layout'>,</span>
<a name="line-53"></a>
<a name="line-54"></a>	<span class='hs-comment'>-- ** The OccInfo type</span>
<a name="line-55"></a>	<span class='hs-conid'>OccInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-56"></a>	<span class='hs-varid'>isFragileOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDeadOcc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isLoopBreaker</span><span class='hs-layout'>,</span>
<a name="line-57"></a>	<span class='hs-varid'>occInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setOccInfo</span><span class='hs-layout'>,</span>
<a name="line-58"></a>
<a name="line-59"></a>	<span class='hs-conid'>InsideLam</span><span class='hs-layout'>,</span> <span class='hs-conid'>OneBranch</span><span class='hs-layout'>,</span>
<a name="line-60"></a>	<span class='hs-varid'>insideLam</span><span class='hs-layout'>,</span> <span class='hs-varid'>notInsideLam</span><span class='hs-layout'>,</span> <span class='hs-varid'>oneBranch</span><span class='hs-layout'>,</span> <span class='hs-varid'>notOneBranch</span><span class='hs-layout'>,</span>
<a name="line-61"></a>	
<a name="line-62"></a>	<span class='hs-comment'>-- ** The SpecInfo type</span>
<a name="line-63"></a>	<span class='hs-conid'>SpecInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-64"></a>	<span class='hs-varid'>isEmptySpecInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>specInfoFreeVars</span><span class='hs-layout'>,</span>
<a name="line-65"></a>	<span class='hs-varid'>specInfoRules</span><span class='hs-layout'>,</span> <span class='hs-varid'>seqSpecInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setSpecInfoHead</span><span class='hs-layout'>,</span>
<a name="line-66"></a>        <span class='hs-varid'>specInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setSpecInfo</span><span class='hs-layout'>,</span>
<a name="line-67"></a>
<a name="line-68"></a>	<span class='hs-comment'>-- ** The CAFInfo type</span>
<a name="line-69"></a>	<span class='hs-conid'>CafInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-70"></a>	<span class='hs-varid'>ppCafInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>mayHaveCafRefs</span><span class='hs-layout'>,</span>
<a name="line-71"></a>	<span class='hs-varid'>cafInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setCafInfo</span><span class='hs-layout'>,</span>
<a name="line-72"></a>
<a name="line-73"></a>        <span class='hs-comment'>-- ** The LBVarInfo type</span>
<a name="line-74"></a>        <span class='hs-conid'>LBVarInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-75"></a>        <span class='hs-varid'>noLBVarInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>hasNoLBVarInfo</span><span class='hs-layout'>,</span>
<a name="line-76"></a>        <span class='hs-varid'>lbvarInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>setLBVarInfo</span><span class='hs-layout'>,</span>
<a name="line-77"></a>
<a name="line-78"></a>        <span class='hs-comment'>-- ** Tick-box Info</span>
<a name="line-79"></a>        <span class='hs-conid'>TickBoxOp</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>TickBoxId</span><span class='hs-layout'>,</span>
<a name="line-80"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-81"></a>
<a name="line-82"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreSyn</span> <span class='hs-layout'>(</span> <span class='hs-conid'>CoreRule</span><span class='hs-layout'>,</span> <span class='hs-varid'>setRuleIdName</span><span class='hs-layout'>,</span> <span class='hs-varid'>seqRules</span><span class='hs-layout'>,</span> <span class='hs-conid'>Unfolding</span><span class='hs-layout'>,</span> <span class='hs-varid'>noUnfolding</span> <span class='hs-layout'>)</span>
<a name="line-83"></a>
<a name="line-84"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>
<a name="line-85"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrimOp</span>
<a name="line-86"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-87"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span>
<a name="line-88"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>VarSet</span>
<a name="line-89"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-90"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span>
<a name="line-91"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-92"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ForeignCall</span>
<a name="line-93"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NewDemand</span>
<a name="line-94"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>	
<a name="line-95"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Module</span>
<a name="line-96"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-97"></a>
<a name="line-98"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
<a name="line-99"></a>
<a name="line-100"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-101"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Demand</span>
<a name="line-102"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Demand</span>
<a name="line-103"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>
<a name="line-104"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
<a name="line-105"></a><span class='hs-cpp'>#endif</span>
<a name="line-106"></a>
<a name="line-107"></a><span class='hs-comment'>-- infixl so you can say (id `set` a `set` b)</span>
<a name="line-108"></a><span class='hs-keyword'>infixl</span> 	<span class='hs-num'>1</span> <span class='hs-varop'>`setSpecInfo`</span><span class='hs-layout'>,</span>
<a name="line-109"></a>	  <span class='hs-varop'>`setArityInfo`</span><span class='hs-layout'>,</span>
<a name="line-110"></a>	  <span class='hs-varop'>`setInlinePragInfo`</span><span class='hs-layout'>,</span>
<a name="line-111"></a>	  <span class='hs-varop'>`setUnfoldingInfo`</span><span class='hs-layout'>,</span>
<a name="line-112"></a>	  <span class='hs-varop'>`setWorkerInfo`</span><span class='hs-layout'>,</span>
<a name="line-113"></a>	  <span class='hs-varop'>`setLBVarInfo`</span><span class='hs-layout'>,</span>
<a name="line-114"></a>	  <span class='hs-varop'>`setOccInfo`</span><span class='hs-layout'>,</span>
<a name="line-115"></a>	  <span class='hs-varop'>`setCafInfo`</span><span class='hs-layout'>,</span>
<a name="line-116"></a>	  <span class='hs-varop'>`setNewStrictnessInfo`</span><span class='hs-layout'>,</span>
<a name="line-117"></a>	  <span class='hs-varop'>`setAllStrictnessInfo`</span><span class='hs-layout'>,</span>
<a name="line-118"></a>	  <span class='hs-varop'>`setNewDemandInfo`</span>
<a name="line-119"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-120"></a>	  <span class='hs-layout'>,</span> <span class='hs-varop'>`setCprInfo`</span>
<a name="line-121"></a>	  <span class='hs-layout'>,</span> <span class='hs-varop'>`setDemandInfo`</span>
<a name="line-122"></a>	  <span class='hs-layout'>,</span> <span class='hs-varop'>`setStrictnessInfo`</span>
<a name="line-123"></a><span class='hs-cpp'>#endif</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{New strictness info}
%*									*
%************************************************************************

To be removed later

\begin{code}
<pre><a name="line-1"></a><a name="setAllStrictnessInfo"></a><span class='hs-comment'>-- | Set old and new strictness information together</span>
<a name="line-2"></a><span class='hs-definition'>setAllStrictnessInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>StrictSig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-3"></a><span class='hs-definition'>setAllStrictnessInfo</span> <span class='hs-varid'>info</span> <span class='hs-conid'>Nothing</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>newStrictnessInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-5"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-6"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>strictnessInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoStrictnessInfo</span>
<a name="line-7"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>cprInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoCPRInfo</span>
<a name="line-8"></a><span class='hs-cpp'>#endif</span>
<a name="line-9"></a>         <span class='hs-layout'>}</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-definition'>setAllStrictnessInfo</span> <span class='hs-varid'>info</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>sig</span><span class='hs-layout'>)</span>
<a name="line-12"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>newStrictnessInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>sig</span>
<a name="line-13"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-14"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>strictnessInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oldStrictnessFromNew</span> <span class='hs-varid'>sig</span>
<a name="line-15"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>cprInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cprInfoFromNewStrictness</span> <span class='hs-varid'>sig</span>
<a name="line-16"></a><span class='hs-cpp'>#endif</span>
<a name="line-17"></a>         <span class='hs-layout'>}</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="seqNewStrictnessInfo"></a><span class='hs-definition'>seqNewStrictnessInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>StrictSig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-20"></a><span class='hs-definition'>seqNewStrictnessInfo</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span>
<a name="line-21"></a><span class='hs-definition'>seqNewStrictnessInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seqStrictSig</span> <span class='hs-varid'>ty</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="pprNewStrictness"></a><span class='hs-definition'>pprNewStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>StrictSig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-24"></a><span class='hs-definition'>pprNewStrictness</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-25"></a><span class='hs-definition'>pprNewStrictness</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>sig</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ftext</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"Str:"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>sig</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-28"></a><a name="oldStrictnessFromNew"></a><span class='hs-definition'>oldStrictnessFromNew</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>StrictSig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>StrictnessInfo</span>
<a name="line-29"></a><span class='hs-definition'>oldStrictnessFromNew</span> <span class='hs-varid'>sig</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkStrictnessInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>oldDemand</span> <span class='hs-varid'>dmds</span><span class='hs-layout'>,</span> <span class='hs-varid'>isBotRes</span> <span class='hs-varid'>res_info</span><span class='hs-layout'>)</span>
<a name="line-30"></a>			 <span class='hs-keyword'>where</span>
<a name="line-31"></a>			   <span class='hs-layout'>(</span><span class='hs-varid'>dmds</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_info</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitStrictSig</span> <span class='hs-varid'>sig</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="cprInfoFromNewStrictness"></a><span class='hs-definition'>cprInfoFromNewStrictness</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>StrictSig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CprInfo</span>
<a name="line-34"></a><span class='hs-definition'>cprInfoFromNewStrictness</span> <span class='hs-varid'>sig</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>strictSigResInfo</span> <span class='hs-varid'>sig</span> <span class='hs-keyword'>of</span>
<a name="line-35"></a>				  <span class='hs-conid'>RetCPR</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReturnsCPR</span>
<a name="line-36"></a>				  <span class='hs-varid'>other</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NoCPRInfo</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="newStrictnessFromOld"></a><span class='hs-definition'>newStrictnessFromOld</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Arity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>StrictnessInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CprInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>StrictSig</span>
<a name="line-39"></a><span class='hs-definition'>newStrictnessFromOld</span> <span class='hs-varid'>name</span> <span class='hs-varid'>arity</span> <span class='hs-layout'>(</span><span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>StrictnessInfo</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>res</span><span class='hs-layout'>)</span> <span class='hs-varid'>cpr</span>
<a name="line-40"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>listLengthCmp</span> <span class='hs-varid'>ds</span> <span class='hs-varid'>arity</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>GT</span> <span class='hs-comment'>-- length ds &lt;= arity</span>
<a name="line-41"></a>	<span class='hs-comment'>-- Sometimes the old strictness analyser has more</span>
<a name="line-42"></a>	<span class='hs-comment'>-- demands than the arity justifies</span>
<a name="line-43"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_strict_sig</span> <span class='hs-varid'>name</span> <span class='hs-varid'>arity</span> <span class='hs-varop'>$</span>
<a name="line-44"></a>    <span class='hs-varid'>mkTopDmdType</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>newDemand</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>newRes</span> <span class='hs-varid'>res</span> <span class='hs-varid'>cpr</span><span class='hs-layout'>)</span>
<a name="line-45"></a>
<a name="line-46"></a><span class='hs-definition'>newStrictnessFromOld</span> <span class='hs-varid'>name</span> <span class='hs-varid'>arity</span> <span class='hs-varid'>other</span> <span class='hs-varid'>cpr</span>
<a name="line-47"></a>  <span class='hs-keyglyph'>=</span>	<span class='hs-comment'>-- Either no strictness info, or arity is too small</span>
<a name="line-48"></a>	<span class='hs-comment'>-- In either case we can't say anything useful</span>
<a name="line-49"></a>    <span class='hs-varid'>mk_strict_sig</span> <span class='hs-varid'>name</span> <span class='hs-varid'>arity</span> <span class='hs-varop'>$</span>
<a name="line-50"></a>    <span class='hs-varid'>mkTopDmdType</span> <span class='hs-layout'>(</span><span class='hs-varid'>replicate</span> <span class='hs-varid'>arity</span> <span class='hs-varid'>lazyDmd</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>newRes</span> <span class='hs-conid'>False</span> <span class='hs-varid'>cpr</span><span class='hs-layout'>)</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="mk_strict_sig"></a><span class='hs-definition'>mk_strict_sig</span> <span class='hs-varid'>name</span> <span class='hs-varid'>arity</span> <span class='hs-varid'>dmd_ty</span>
<a name="line-53"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WARN</span><span class='hs-layout'>(</span> <span class='hs-varid'>arity</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>dmdTypeDepth</span> <span class='hs-varid'>dmd_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>arity</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>dmd_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-54"></a>    <span class='hs-varid'>mkStrictSig</span> <span class='hs-varid'>dmd_ty</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="newRes"></a><span class='hs-definition'>newRes</span> <span class='hs-conid'>True</span>  <span class='hs-keyword'>_</span> 	        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BotRes</span>
<a name="line-57"></a><span class='hs-definition'>newRes</span> <span class='hs-conid'>False</span> <span class='hs-conid'>ReturnsCPR</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>retCPR</span>
<a name="line-58"></a><span class='hs-definition'>newRes</span> <span class='hs-conid'>False</span> <span class='hs-conid'>NoCPRInfo</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TopRes</span>
<a name="line-59"></a>
<a name="line-60"></a><a name="newDemand"></a><span class='hs-definition'>newDemand</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span>
<a name="line-61"></a><span class='hs-definition'>newDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>WwLazy</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Abs</span>
<a name="line-62"></a><span class='hs-definition'>newDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>WwLazy</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lazyDmd</span>
<a name="line-63"></a><span class='hs-definition'>newDemand</span> <span class='hs-conid'>WwStrict</span>	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>evalDmd</span>
<a name="line-64"></a><span class='hs-definition'>newDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>WwUnpack</span> <span class='hs-varid'>unpk</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Prod</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>newDemand</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-65"></a><span class='hs-definition'>newDemand</span> <span class='hs-conid'>WwPrim</span>	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lazyDmd</span>
<a name="line-66"></a><span class='hs-definition'>newDemand</span> <span class='hs-conid'>WwEnum</span>	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>evalDmd</span>
<a name="line-67"></a>
<a name="line-68"></a><a name="oldDemand"></a><span class='hs-definition'>oldDemand</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NewDemand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span>
<a name="line-69"></a><span class='hs-definition'>oldDemand</span> <span class='hs-conid'>Abs</span>	     	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwLazy</span> <span class='hs-conid'>True</span>
<a name="line-70"></a><span class='hs-definition'>oldDemand</span> <span class='hs-conid'>Top</span>	     	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwLazy</span> <span class='hs-conid'>False</span>
<a name="line-71"></a><span class='hs-definition'>oldDemand</span> <span class='hs-conid'>Bot</span>	     	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwStrict</span>
<a name="line-72"></a><span class='hs-definition'>oldDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>Box</span> <span class='hs-conid'>Bot</span><span class='hs-layout'>)</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwStrict</span>
<a name="line-73"></a><span class='hs-definition'>oldDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>Box</span> <span class='hs-conid'>Abs</span><span class='hs-layout'>)</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwLazy</span> <span class='hs-conid'>False</span>
<a name="line-74"></a><span class='hs-definition'>oldDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>Box</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eval</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwStrict</span>	<span class='hs-comment'>-- Pass box only</span>
<a name="line-75"></a><span class='hs-definition'>oldDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>Defer</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwLazy</span> <span class='hs-conid'>False</span>
<a name="line-76"></a><span class='hs-definition'>oldDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Prod</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwUnpack</span> <span class='hs-conid'>True</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>oldDemand</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span>
<a name="line-77"></a><span class='hs-definition'>oldDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eval</span> <span class='hs-layout'>(</span><span class='hs-conid'>Poly</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwStrict</span>
<a name="line-78"></a><span class='hs-definition'>oldDemand</span> <span class='hs-layout'>(</span><span class='hs-conid'>Call</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WwStrict</span>
<a name="line-79"></a>
<a name="line-80"></a><span class='hs-cpp'>#endif /* OLD_STRICTNESS */</span>
</pre>\end{code}


\begin{code}
<pre><a name="line-1"></a><a name="seqNewDemandInfo"></a><span class='hs-definition'>seqNewDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Demand</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-2"></a><span class='hs-definition'>seqNewDemandInfo</span> <span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span>
<a name="line-3"></a><span class='hs-definition'>seqNewDemandInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>dmd</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seqDemand</span> <span class='hs-varid'>dmd</span>
</pre>\end{code}


%************************************************************************
%*									*
                     IdDetails
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="IdDetails"></a><span class='hs-comment'>-- | The 'IdDetails' of an 'Id' give stable, and necessary, </span>
<a name="line-2"></a><a name="IdDetails"></a><span class='hs-comment'>-- information about the Id. </span>
<a name="line-3"></a><a name="IdDetails"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>IdDetails</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VanillaId</span>	
<a name="line-5"></a>
<a name="line-6"></a>  <span class='hs-comment'>-- | The 'Id' for a record selector</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>RecSelId</span>                 
<a name="line-8"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>sel_tycon</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyCon</span>	<span class='hs-comment'>-- ^ For a data type family, this is the /instance/ 'TyCon'</span>
<a name="line-9"></a>				<span class='hs-comment'>--   not the family 'TyCon'</span>
<a name="line-10"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>sel_naughty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>       <span class='hs-comment'>-- True &lt;=&gt; a "naughty" selector which can't actually exist, for example @x@ in:</span>
<a name="line-11"></a>                                <span class='hs-comment'>--    data T = forall a. MkT { x :: a }</span>
<a name="line-12"></a>    <span class='hs-layout'>}</span>				<span class='hs-comment'>-- See Note [Naughty record selectors] in TcTyClsDecls</span>
<a name="line-13"></a>
<a name="line-14"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DataConWorkId</span> <span class='hs-conid'>DataCon</span>	<span class='hs-comment'>-- ^ The 'Id' is for a data constructor /worker/</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DataConWrapId</span> <span class='hs-conid'>DataCon</span>	<span class='hs-comment'>-- ^ The 'Id' is for a data constructor /wrapper/</span>
<a name="line-16"></a>				
<a name="line-17"></a>				<span class='hs-comment'>-- [the only reasons we need to know is so that</span>
<a name="line-18"></a>				<span class='hs-comment'>--  a) to support isImplicitId</span>
<a name="line-19"></a>				<span class='hs-comment'>--  b) when desugaring a RecordCon we can get </span>
<a name="line-20"></a>				<span class='hs-comment'>--     from the Id back to the data con]</span>
<a name="line-21"></a>
<a name="line-22"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ClassOpId</span> <span class='hs-conid'>Class</span>		<span class='hs-comment'>-- ^ The 'Id' is an operation of a class</span>
<a name="line-23"></a>
<a name="line-24"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PrimOpId</span> <span class='hs-conid'>PrimOp</span>		<span class='hs-comment'>-- ^ The 'Id' is for a primitive operator</span>
<a name="line-25"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FCallId</span> <span class='hs-conid'>ForeignCall</span>		<span class='hs-comment'>-- ^ The 'Id' is for a foreign call</span>
<a name="line-26"></a>
<a name="line-27"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TickBoxOpId</span> <span class='hs-conid'>TickBoxOp</span>	<span class='hs-comment'>-- ^ The 'Id' is for a HPC tick box (both traditional and binary)</span>
<a name="line-28"></a>
<a name="line-29"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DFunId</span>			<span class='hs-comment'>-- ^ A dictionary function.  We don't use this in an essential way,</span>
<a name="line-30"></a>    				<span class='hs-comment'>-- currently, but it's kind of nice that we can keep track of</span>
<a name="line-31"></a>				<span class='hs-comment'>-- which Ids are DFuns, across module boundaries too</span>
<a name="line-32"></a>
<a name="line-33"></a>
<a name="line-34"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>IdDetails</span> <span class='hs-keyword'>where</span>
<a name="line-35"></a>    <span class='hs-varid'>ppr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprIdDetails</span>
<a name="line-36"></a>
<a name="line-37"></a><a name="pprIdDetails"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdDetails</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-38"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-conid'>VanillaId</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-39"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataConWorkId</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"[DataCon]"</span><span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataConWrapId</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"[DataConWrapper]"</span><span class='hs-layout'>)</span>
<a name="line-41"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassOpId</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"[ClassOp]"</span><span class='hs-layout'>)</span>
<a name="line-42"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimOpId</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"[PrimOp]"</span><span class='hs-layout'>)</span>
<a name="line-43"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>FCallId</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"[ForeignCall]"</span><span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>TickBoxOpId</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"[TickBoxOp]"</span><span class='hs-layout'>)</span>
<a name="line-45"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-conid'>DFunId</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"[DFunId]"</span><span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-definition'>pprIdDetails</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecSelId</span> <span class='hs-layout'>{</span> <span class='hs-varid'>sel_naughty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>is_naughty</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-47"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>brackets</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"RecSel"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>pp_naughty</span>
<a name="line-48"></a>  <span class='hs-keyword'>where</span>
<a name="line-49"></a>    <span class='hs-varid'>pp_naughty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>is_naughty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"(naughty)"</span><span class='hs-layout'>)</span>
<a name="line-50"></a>	       <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{The main IdInfo type}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="IdInfo"></a><span class='hs-comment'>-- | An 'IdInfo' gives /optional/ information about an 'Id'.  If</span>
<a name="line-2"></a><a name="IdInfo"></a><span class='hs-comment'>-- present it never lies, but it may not be present, in which case there</span>
<a name="line-3"></a><a name="IdInfo"></a><span class='hs-comment'>-- is always a conservative assumption which can be made.</span>
<a name="line-4"></a><a name="IdInfo"></a><span class='hs-comment'>-- </span>
<a name="line-5"></a><a name="IdInfo"></a><span class='hs-comment'>-- Two 'Id's may have different info even though they have the same</span>
<a name="line-6"></a><a name="IdInfo"></a><span class='hs-comment'>-- 'Unique' (and are hence the same 'Id'); for example, one might lack</span>
<a name="line-7"></a><a name="IdInfo"></a><span class='hs-comment'>-- the properties attached to the other.</span>
<a name="line-8"></a><a name="IdInfo"></a><span class='hs-comment'>-- </span>
<a name="line-9"></a><a name="IdInfo"></a><span class='hs-comment'>-- The 'IdInfo' gives information about the value, or definition, of the</span>
<a name="line-10"></a><a name="IdInfo"></a><span class='hs-comment'>-- 'Id'.  It does not contain information about the 'Id''s usage,</span>
<a name="line-11"></a><a name="IdInfo"></a><span class='hs-comment'>-- except for 'demandInfo' and 'lbvarInfo'.</span>
<a name="line-12"></a><a name="IdInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>IdInfo</span>
<a name="line-13"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IdInfo</span> <span class='hs-layout'>{</span>
<a name="line-14"></a>	<span class='hs-varid'>arityInfo</span> 	<span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>ArityInfo</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ 'Id' arity</span>
<a name="line-15"></a>	<span class='hs-varid'>specInfo</span> 	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>SpecInfo</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ Specialisations of the 'Id's function which exist</span>
<a name="line-16"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-17"></a>	<span class='hs-varid'>cprInfo</span> 	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>CprInfo</span><span class='hs-layout'>,</span>             <span class='hs-comment'>-- ^ If the 'Id's function always constructs a product result</span>
<a name="line-18"></a>	<span class='hs-varid'>demandInfo</span> 	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-conid'>Demand</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Whether or not the 'Id' is definitely demanded</span>
<a name="line-19"></a>	<span class='hs-varid'>strictnessInfo</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>StrictnessInfo</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ 'Id' strictness properties</span>
<a name="line-20"></a><span class='hs-cpp'>#endif</span>
<a name="line-21"></a>        <span class='hs-varid'>workerInfo</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WorkerInfo</span><span class='hs-layout'>,</span>          <span class='hs-comment'>-- ^ Pointer to worker function.</span>
<a name="line-22"></a>						<span class='hs-comment'>-- Within one module this is irrelevant; the </span>
<a name="line-23"></a>						<span class='hs-comment'>-- inlining of a worker is handled via the 'Unfolding'.</span>
<a name="line-24"></a>						<span class='hs-comment'>-- However, when the module is imported by others, the</span>
<a name="line-25"></a>						<span class='hs-comment'>-- 'WorkerInfo' is used /only/ to indicate the form of</span>
<a name="line-26"></a>						<span class='hs-comment'>-- the RHS, so that interface files don't actually </span>
<a name="line-27"></a>						<span class='hs-comment'>-- need to contain the RHS; it can be derived from</span>
<a name="line-28"></a>						<span class='hs-comment'>-- the strictness info</span>
<a name="line-29"></a>
<a name="line-30"></a>	<span class='hs-varid'>unfoldingInfo</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unfolding</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ The 'Id's unfolding</span>
<a name="line-31"></a>	<span class='hs-varid'>cafInfo</span>		<span class='hs-keyglyph'>::</span> <span class='hs-conid'>CafInfo</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ 'Id' CAF info</span>
<a name="line-32"></a>        <span class='hs-varid'>lbvarInfo</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>LBVarInfo</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ Info about a lambda-bound variable, if the 'Id' is one</span>
<a name="line-33"></a>	<span class='hs-varid'>inlinePragInfo</span>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>InlinePragma</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Any inline pragma atached to the 'Id'</span>
<a name="line-34"></a>	<span class='hs-varid'>occInfo</span>		<span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccInfo</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ How the 'Id' occurs in the program</span>
<a name="line-35"></a>
<a name="line-36"></a>	<span class='hs-varid'>newStrictnessInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>StrictSig</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Id strictness information. Reason for Maybe: </span>
<a name="line-37"></a>	                                        <span class='hs-comment'>-- the DmdAnal phase needs to know whether</span>
<a name="line-38"></a>						<span class='hs-comment'>-- this is the first visit, so it can assign botSig.</span>
<a name="line-39"></a>						<span class='hs-comment'>-- Other customers want topSig.  So @Nothing@ is good.</span>
<a name="line-40"></a>
<a name="line-41"></a>	<span class='hs-varid'>newDemandInfo</span>	  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Demand</span>	<span class='hs-comment'>-- ^ Id demand information. Similarly we want to know </span>
<a name="line-42"></a>	                                        <span class='hs-comment'>-- if there's no known demand yet, for when we are looking</span>
<a name="line-43"></a>						<span class='hs-comment'>-- for CPR info</span>
<a name="line-44"></a>    <span class='hs-layout'>}</span>
<a name="line-45"></a>
<a name="line-46"></a><a name="seqIdInfo"></a><span class='hs-comment'>-- | Just evaluate the 'IdInfo' to WHNF</span>
<a name="line-47"></a><span class='hs-definition'>seqIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-48"></a><span class='hs-definition'>seqIdInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>IdInfo</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span>
<a name="line-49"></a>
<a name="line-50"></a><a name="megaSeqIdInfo"></a><span class='hs-comment'>-- | Evaluate all the fields of the 'IdInfo' that are generally demanded by the</span>
<a name="line-51"></a><span class='hs-comment'>-- compiler</span>
<a name="line-52"></a><span class='hs-definition'>megaSeqIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-53"></a><span class='hs-definition'>megaSeqIdInfo</span> <span class='hs-varid'>info</span>
<a name="line-54"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seqSpecInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>specInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>			<span class='hs-varop'>`seq`</span>
<a name="line-55"></a>    <span class='hs-varid'>seqWorker</span> <span class='hs-layout'>(</span><span class='hs-varid'>workerInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>			<span class='hs-varop'>`seq`</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-comment'>-- Omitting this improves runtimes a little, presumably because</span>
<a name="line-58"></a><span class='hs-comment'>-- some unfoldings are not calculated at all</span>
<a name="line-59"></a><span class='hs-comment'>--    seqUnfolding (unfoldingInfo info)		`seq`</span>
<a name="line-60"></a>
<a name="line-61"></a>    <span class='hs-varid'>seqNewDemandInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>newDemandInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>	<span class='hs-varop'>`seq`</span>
<a name="line-62"></a>    <span class='hs-varid'>seqNewStrictnessInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>newStrictnessInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span> <span class='hs-varop'>`seq`</span>
<a name="line-63"></a>
<a name="line-64"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-65"></a>    <span class='hs-conid'>Demand</span><span class='hs-varop'>.</span><span class='hs-varid'>seqDemand</span> <span class='hs-layout'>(</span><span class='hs-varid'>demandInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>		<span class='hs-varop'>`seq`</span>
<a name="line-66"></a>    <span class='hs-varid'>seqStrictnessInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>strictnessInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>	<span class='hs-varop'>`seq`</span>
<a name="line-67"></a>    <span class='hs-varid'>seqCpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>cprInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>			<span class='hs-varop'>`seq`</span>
<a name="line-68"></a><span class='hs-cpp'>#endif</span>
<a name="line-69"></a>
<a name="line-70"></a>    <span class='hs-varid'>seqCaf</span> <span class='hs-layout'>(</span><span class='hs-varid'>cafInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>			<span class='hs-varop'>`seq`</span>
<a name="line-71"></a>    <span class='hs-varid'>seqLBVar</span> <span class='hs-layout'>(</span><span class='hs-varid'>lbvarInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span>			<span class='hs-varop'>`seq`</span>
<a name="line-72"></a>    <span class='hs-varid'>seqOccInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>occInfo</span> <span class='hs-varid'>info</span><span class='hs-layout'>)</span> 
</pre>\end{code}

Setters

\begin{code}
<pre><a name="line-1"></a><a name="setWorkerInfo"></a><span class='hs-definition'>setWorkerInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-2"></a><span class='hs-definition'>setWorkerInfo</span>     <span class='hs-varid'>info</span> <span class='hs-varid'>wk</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wk</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>workerInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wk</span> <span class='hs-layout'>}</span>
<a name="line-3"></a><a name="setSpecInfo"></a><span class='hs-definition'>setSpecInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-4"></a><span class='hs-definition'>setSpecInfo</span> 	  <span class='hs-varid'>info</span> <span class='hs-varid'>sp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sp</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>specInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sp</span> <span class='hs-layout'>}</span>
<a name="line-5"></a><a name="setInlinePragInfo"></a><span class='hs-definition'>setInlinePragInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InlinePragma</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-6"></a><span class='hs-definition'>setInlinePragInfo</span> <span class='hs-varid'>info</span> <span class='hs-varid'>pr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pr</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>inlinePragInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pr</span> <span class='hs-layout'>}</span>
<a name="line-7"></a><a name="setOccInfo"></a><span class='hs-definition'>setOccInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-8"></a><span class='hs-definition'>setOccInfo</span>	  <span class='hs-varid'>info</span> <span class='hs-varid'>oc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oc</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>occInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>oc</span> <span class='hs-layout'>}</span>
<a name="line-9"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-10"></a><a name="setStrictnessInfo"></a><span class='hs-definition'>setStrictnessInfo</span> <span class='hs-varid'>info</span> <span class='hs-varid'>st</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>st</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>strictnessInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>st</span> <span class='hs-layout'>}</span>
<a name="line-11"></a><span class='hs-cpp'>#endif</span>
<a name="line-12"></a>	<span class='hs-comment'>-- Try to avoid spack leaks by seq'ing</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="setUnfoldingInfoLazily"></a><span class='hs-definition'>setUnfoldingInfoLazily</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Unfolding</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-15"></a><span class='hs-definition'>setUnfoldingInfoLazily</span> <span class='hs-varid'>info</span> <span class='hs-varid'>uf</span> 	<span class='hs-comment'>-- Lazy variant to avoid looking at the</span>
<a name="line-16"></a>  <span class='hs-keyglyph'>=</span>				<span class='hs-comment'>-- unfolding of an imported Id unless necessary</span>
<a name="line-17"></a>    <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>unfoldingInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uf</span> <span class='hs-layout'>}</span>	<span class='hs-comment'>-- (In this case the demand-zapping is redundant.)</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="setUnfoldingInfo"></a><span class='hs-definition'>setUnfoldingInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Unfolding</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-20"></a><span class='hs-definition'>setUnfoldingInfo</span> <span class='hs-varid'>info</span> <span class='hs-varid'>uf</span> 
<a name="line-21"></a>	<span class='hs-comment'>-- We do *not* seq on the unfolding info, For some reason, doing so </span>
<a name="line-22"></a>	<span class='hs-comment'>-- actually increases residency significantly. </span>
<a name="line-23"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>unfoldingInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uf</span> <span class='hs-layout'>}</span>
<a name="line-24"></a>
<a name="line-25"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-26"></a><a name="setDemandInfo"></a><span class='hs-definition'>setDemandInfo</span>	  <span class='hs-varid'>info</span> <span class='hs-varid'>dd</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>demandInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dd</span> <span class='hs-layout'>}</span>
<a name="line-27"></a><a name="setCprInfo"></a><span class='hs-definition'>setCprInfo</span>        <span class='hs-varid'>info</span> <span class='hs-varid'>cp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cprInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cp</span> <span class='hs-layout'>}</span>
<a name="line-28"></a><span class='hs-cpp'>#endif</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="setArityInfo"></a><span class='hs-definition'>setArityInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ArityInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-31"></a><span class='hs-definition'>setArityInfo</span>	  <span class='hs-varid'>info</span> <span class='hs-varid'>ar</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>arityInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ar</span>  <span class='hs-layout'>}</span>
<a name="line-32"></a><a name="setCafInfo"></a><span class='hs-definition'>setCafInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CafInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-33"></a><span class='hs-definition'>setCafInfo</span>        <span class='hs-varid'>info</span> <span class='hs-varid'>caf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cafInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>caf</span> <span class='hs-layout'>}</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="setLBVarInfo"></a><span class='hs-definition'>setLBVarInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LBVarInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-36"></a><span class='hs-definition'>setLBVarInfo</span>      <span class='hs-varid'>info</span> <span class='hs-varid'>lb</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>{-lb `seq`-}</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>lbvarInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lb</span> <span class='hs-layout'>}</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="setNewDemandInfo"></a><span class='hs-definition'>setNewDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Demand</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-39"></a><span class='hs-definition'>setNewDemandInfo</span>     <span class='hs-varid'>info</span> <span class='hs-varid'>dd</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dd</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>newDemandInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dd</span> <span class='hs-layout'>}</span>
<a name="line-40"></a><a name="setNewStrictnessInfo"></a><span class='hs-definition'>setNewStrictnessInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>StrictSig</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IdInfo</span>
<a name="line-41"></a><span class='hs-definition'>setNewStrictnessInfo</span> <span class='hs-varid'>info</span> <span class='hs-varid'>dd</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dd</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>info</span> <span class='hs-layout'>{</span> <span class='hs-varid'>newStrictnessInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dd</span> <span class='hs-layout'>}</span>
</pre>\end{code}


\begin{code}
<pre><a name="line-1"></a><a name="vanillaIdInfo"></a><span class='hs-comment'>-- | Basic 'IdInfo' that carries no useful information whatsoever</span>
<a name="line-2"></a><span class='hs-definition'>vanillaIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span>
<a name="line-3"></a><span class='hs-definition'>vanillaIdInfo</span> 
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IdInfo</span> <span class='hs-layout'>{</span>
<a name="line-5"></a>	    <span class='hs-varid'>cafInfo</span>		<span class='hs-keyglyph'>=</span> <span class='hs-varid'>vanillaCafInfo</span><span class='hs-layout'>,</span>
<a name="line-6"></a>	    <span class='hs-varid'>arityInfo</span>		<span class='hs-keyglyph'>=</span> <span class='hs-varid'>unknownArity</span><span class='hs-layout'>,</span>
<a name="line-7"></a><span class='hs-cpp'>#ifdef OLD_STRICTNESS</span>
<a name="line-8"></a>	    <span class='hs-varid'>cprInfo</span>		<span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoCPRInfo</span><span class='hs-layout'>,</span>
<a name="line-9"></a>	    <span class='hs-varid'>demandInfo</span>		<span class='hs-keyglyph'>=</span> <span class='hs-varid'>wwLazy</span><span class='hs-layout'>,</span>
<a name="line-10"></a>	    <span class='hs-varid'>strictnessInfo</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoStrictnessInfo</span><span class='hs-layout'>,</span>
<a name="line-11"></a><span class='hs-cpp'>#endif</span>
<a name="line-12"></a>	    <span class='hs-varid'>specInfo</span>		<span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptySpecInfo</span><span class='hs-layout'>,</span>
<a name="line-13"></a>	    <span class='hs-varid'>workerInfo</span>		<span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoWorker</span><span class='hs-layout'>,</span>
<a name="line-14"></a>	    <span class='hs-varid'>unfoldingInfo</span>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>noUnfolding</span><span class='hs-layout'>,</span>
<a name="line-15"></a>	    <span class='hs-varid'>lbvarInfo</span>		<span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoLBVarInfo</span><span class='hs-layout'>,</span>
<a name="line-16"></a>	    <span class='hs-varid'>inlinePragInfo</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>defaultInlinePragma</span><span class='hs-layout'>,</span>
<a name="line-17"></a>	    <span class='hs-varid'>occInfo</span>		<span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoOccInfo</span><span class='hs-layout'>,</span>
<a name="line-18"></a>	    <span class='hs-varid'>newDemandInfo</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span>
<a name="line-19"></a>	    <span class='hs-varid'>newStrictnessInfo</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-20"></a>	   <span class='hs-layout'>}</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="noCafIdInfo"></a><span class='hs-comment'>-- | More informative 'IdInfo' we can use when we know the 'Id' has no CAF references</span>
<a name="line-23"></a><span class='hs-definition'>noCafIdInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span>
<a name="line-24"></a><span class='hs-definition'>noCafIdInfo</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vanillaIdInfo</span> <span class='hs-varop'>`setCafInfo`</span>    <span class='hs-conid'>NoCafRefs</span>
<a name="line-25"></a>	<span class='hs-comment'>-- Used for built-in type Ids in MkId.</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection[arity-IdInfo]{Arity info about an @Id@}
%*									*
%************************************************************************

For locally-defined Ids, the code generator maintains its own notion
of their arities; so it should not be asking...	 (but other things
besides the code-generator need arity info!)

\begin{code}
<pre><a name="line-1"></a><a name="ArityInfo"></a><span class='hs-comment'>-- | An 'ArityInfo' of @n@ tells us that partial application of this </span>
<a name="line-2"></a><a name="ArityInfo"></a><span class='hs-comment'>-- 'Id' to up to @n-1@ value arguments does essentially no work.</span>
<a name="line-3"></a><a name="ArityInfo"></a><span class='hs-comment'>--</span>
<a name="line-4"></a><a name="ArityInfo"></a><span class='hs-comment'>-- That is not necessarily the same as saying that it has @n@ leading </span>
<a name="line-5"></a><a name="ArityInfo"></a><span class='hs-comment'>-- lambdas, because coerces may get in the way.</span>
<a name="line-6"></a><a name="ArityInfo"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><a name="ArityInfo"></a><span class='hs-comment'>-- The arity might increase later in the compilation process, if</span>
<a name="line-8"></a><a name="ArityInfo"></a><span class='hs-comment'>-- an extra lambda floats up to the binding site.</span>
<a name="line-9"></a><a name="ArityInfo"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ArityInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Arity</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="unknownArity"></a><span class='hs-comment'>-- | It is always safe to assume that an 'Id' has an arity of 0</span>
<a name="line-12"></a><span class='hs-definition'>unknownArity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Arity</span>
<a name="line-13"></a><span class='hs-definition'>unknownArity</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Arity</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="ppArityInfo"></a><span class='hs-definition'>ppArityInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-16"></a><span class='hs-definition'>ppArityInfo</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-17"></a><span class='hs-definition'>ppArityInfo</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Arity"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>int</span> <span class='hs-varid'>n</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Inline-pragma information}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="InlinePragInfo"></a><span class='hs-comment'>-- | Tells when the inlining is active.</span>
<a name="line-2"></a><a name="InlinePragInfo"></a><span class='hs-comment'>-- When it is active the thing may be inlined, depending on how</span>
<a name="line-3"></a><a name="InlinePragInfo"></a><span class='hs-comment'>-- big it is.</span>
<a name="line-4"></a><a name="InlinePragInfo"></a><span class='hs-comment'>--</span>
<a name="line-5"></a><a name="InlinePragInfo"></a><span class='hs-comment'>-- If there was an @INLINE@ pragma, then as a separate matter, the</span>
<a name="line-6"></a><a name="InlinePragInfo"></a><span class='hs-comment'>-- RHS will have been made to look small with a Core inline 'Note'</span>
<a name="line-7"></a><a name="InlinePragInfo"></a><span class='hs-comment'>--</span>
<a name="line-8"></a><a name="InlinePragInfo"></a><span class='hs-comment'>-- The default 'InlinePragInfo' is 'AlwaysActive', so the info serves</span>
<a name="line-9"></a><a name="InlinePragInfo"></a><span class='hs-comment'>-- entirely as a way to inhibit inlining until we want it</span>
<a name="line-10"></a><a name="InlinePragInfo"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>InlinePragInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InlinePragma</span>
</pre>\end{code}


%************************************************************************
%*									*
	SpecInfo
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="SpecInfo"></a><span class='hs-comment'>-- | Records the specializations of this 'Id' that we know about</span>
<a name="line-2"></a><a name="SpecInfo"></a><span class='hs-comment'>-- in the form of rewrite 'CoreRule's that target them</span>
<a name="line-3"></a><a name="SpecInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SpecInfo</span> 
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SpecInfo</span> 
<a name="line-5"></a>	<span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreRule</span><span class='hs-keyglyph'>]</span> 
<a name="line-6"></a>	<span class='hs-conid'>VarSet</span>		<span class='hs-comment'>-- Locally-defined free vars of *both* LHS and RHS </span>
<a name="line-7"></a>			<span class='hs-comment'>-- of rules.  I don't think it needs to include the</span>
<a name="line-8"></a>			<span class='hs-comment'>-- ru_fn though.</span>
<a name="line-9"></a>			<span class='hs-comment'>-- Note [Rule dependency info] in OccurAnal</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="emptySpecInfo"></a><span class='hs-comment'>-- | Assume that no specilizations exist: always safe</span>
<a name="line-12"></a><span class='hs-definition'>emptySpecInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SpecInfo</span>
<a name="line-13"></a><span class='hs-definition'>emptySpecInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>emptyVarSet</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="isEmptySpecInfo"></a><span class='hs-definition'>isEmptySpecInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-16"></a><span class='hs-definition'>isEmptySpecInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>SpecInfo</span> <span class='hs-varid'>rs</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>null</span> <span class='hs-varid'>rs</span>
<a name="line-17"></a>
<a name="line-18"></a><a name="specInfoFreeVars"></a><span class='hs-comment'>-- | Retrieve the locally-defined free variables of both the left and</span>
<a name="line-19"></a><span class='hs-comment'>-- right hand sides of the specialization rules</span>
<a name="line-20"></a><span class='hs-definition'>specInfoFreeVars</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VarSet</span>
<a name="line-21"></a><span class='hs-definition'>specInfoFreeVars</span> <span class='hs-layout'>(</span><span class='hs-conid'>SpecInfo</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fvs</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="specInfoRules"></a><span class='hs-definition'>specInfoRules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreRule</span><span class='hs-keyglyph'>]</span>
<a name="line-24"></a><span class='hs-definition'>specInfoRules</span> <span class='hs-layout'>(</span><span class='hs-conid'>SpecInfo</span> <span class='hs-varid'>rules</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rules</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="setSpecInfoHead"></a><span class='hs-comment'>-- | Change the name of the function the rule is keyed on on all of the 'CoreRule's</span>
<a name="line-27"></a><span class='hs-definition'>setSpecInfoHead</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SpecInfo</span>
<a name="line-28"></a><span class='hs-definition'>setSpecInfoHead</span> <span class='hs-varid'>fn</span> <span class='hs-layout'>(</span><span class='hs-conid'>SpecInfo</span> <span class='hs-varid'>rules</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span>
<a name="line-29"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>setRuleIdName</span> <span class='hs-varid'>fn</span><span class='hs-layout'>)</span> <span class='hs-varid'>rules</span><span class='hs-layout'>)</span> <span class='hs-varid'>fvs</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="seqSpecInfo"></a><span class='hs-definition'>seqSpecInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SpecInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-32"></a><span class='hs-definition'>seqSpecInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>SpecInfo</span> <span class='hs-varid'>rules</span> <span class='hs-varid'>fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seqRules</span> <span class='hs-varid'>rules</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>seqVarSet</span> <span class='hs-varid'>fvs</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection[worker-IdInfo]{Worker info about an @Id@}
%*									*
%************************************************************************

There might not be a worker, even for a strict function, because:
(a) the function might be small enough to inline, so no need 
    for w/w split
(b) the strictness info might be "SSS" or something, so no w/w split.

Sometimes the arity of a wrapper changes from the original arity from
which it was generated, so we always emit the "original" arity into
the interface file, as part of the worker info.

How can this happen?  Sometimes we get
	f = coerce t (\x y -> $wf x y)
at the moment of w/w split; but the eta reducer turns it into
	f = coerce t $wf
which is perfectly fine except that the exposed arity so far as
the code generator is concerned (zero) differs from the arity
when we did the split (2).  

All this arises because we use 'arity' to mean "exactly how many
top level lambdas are there" in interface files; but during the
compilation of this module it means "how many things can I apply
this to".

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="WorkerInfo"></a><span class='hs-comment'>-- | If this Id has a worker then we store a reference to it. Worker</span>
<a name="line-3"></a><a name="WorkerInfo"></a><span class='hs-comment'>-- functions are generated by the worker\/wrapper pass, using information</span>
<a name="line-4"></a><a name="WorkerInfo"></a><span class='hs-comment'>-- information from strictness analysis.</span>
<a name="line-5"></a><a name="WorkerInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoWorker</span>              <span class='hs-comment'>-- ^ No known worker function</span>
<a name="line-6"></a>		<span class='hs-keyglyph'>|</span> <span class='hs-conid'>HasWorker</span> <span class='hs-conid'>Id</span> <span class='hs-conid'>Arity</span>    <span class='hs-comment'>-- ^ The 'Arity' is the arity of the /wrapper/ at the moment of the</span>
<a name="line-7"></a>	                                <span class='hs-comment'>-- worker\/wrapper split, which may be different from the current 'Id' 'Aritiy'</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="seqWorker"></a><span class='hs-definition'>seqWorker</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-10"></a><span class='hs-definition'>seqWorker</span> <span class='hs-layout'>(</span><span class='hs-conid'>HasWorker</span> <span class='hs-varid'>id</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>()</span>
<a name="line-11"></a><span class='hs-definition'>seqWorker</span> <span class='hs-conid'>NoWorker</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="ppWorkerInfo"></a><span class='hs-definition'>ppWorkerInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-14"></a><span class='hs-definition'>ppWorkerInfo</span> <span class='hs-conid'>NoWorker</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-15"></a><span class='hs-definition'>ppWorkerInfo</span> <span class='hs-layout'>(</span><span class='hs-conid'>HasWorker</span> <span class='hs-varid'>wk_id</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Worker"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>wk_id</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="workerExists"></a><span class='hs-definition'>workerExists</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-18"></a><span class='hs-definition'>workerExists</span> <span class='hs-conid'>NoWorker</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-19"></a><span class='hs-definition'>workerExists</span> <span class='hs-layout'>(</span><span class='hs-conid'>HasWorker</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="workerId"></a><span class='hs-comment'>-- | The 'Id' of the worker function if it exists, or a panic otherwise</span>
<a name="line-22"></a><span class='hs-definition'>workerId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-23"></a><span class='hs-definition'>workerId</span> <span class='hs-layout'>(</span><span class='hs-conid'>HasWorker</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-24"></a><span class='hs-definition'>workerId</span> <span class='hs-conid'>NoWorker</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"workerId: NoWorker"</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="wrapperArity"></a><span class='hs-comment'>-- | The 'Arity' of the worker function at the time of the split if it exists, or a panic otherwise</span>
<a name="line-27"></a><span class='hs-definition'>wrapperArity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WorkerInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Arity</span>
<a name="line-28"></a><span class='hs-definition'>wrapperArity</span> <span class='hs-layout'>(</span><span class='hs-conid'>HasWorker</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span>
<a name="line-29"></a><span class='hs-definition'>wrapperArity</span> <span class='hs-conid'>NoWorker</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"wrapperArity: NoWorker"</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection[CG-IdInfo]{Code generator-related information}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- CafInfo is used to build Static Reference Tables (see simplStg/SRT.lhs).</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="CafInfo"></a><span class='hs-comment'>-- | Records whether an 'Id' makes Constant Applicative Form references</span>
<a name="line-4"></a><a name="CafInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CafInfo</span> 
<a name="line-5"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MayHaveCafRefs</span>		<span class='hs-comment'>-- ^ Indicates that the 'Id' is for either:</span>
<a name="line-6"></a>					<span class='hs-comment'>--</span>
<a name="line-7"></a>					<span class='hs-comment'>-- 1. A function or static constructor</span>
<a name="line-8"></a>					<span class='hs-comment'>--    that refers to one or more CAFs, or</span>
<a name="line-9"></a>					<span class='hs-comment'>--</span>
<a name="line-10"></a>					<span class='hs-comment'>-- 2. A real live CAF</span>
<a name="line-11"></a>
<a name="line-12"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoCafRefs</span>			<span class='hs-comment'>-- ^ A function or static constructor</span>
<a name="line-13"></a>				        <span class='hs-comment'>-- that refers to no CAFs.</span>
<a name="line-14"></a>        <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="vanillaCafInfo"></a><span class='hs-comment'>-- | Assumes that the 'Id' has CAF references: definitely safe</span>
<a name="line-17"></a><span class='hs-definition'>vanillaCafInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CafInfo</span>
<a name="line-18"></a><span class='hs-definition'>vanillaCafInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MayHaveCafRefs</span>
<a name="line-19"></a>
<a name="line-20"></a><a name="mayHaveCafRefs"></a><span class='hs-definition'>mayHaveCafRefs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CafInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-21"></a><span class='hs-definition'>mayHaveCafRefs</span>  <span class='hs-conid'>MayHaveCafRefs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-22"></a><span class='hs-definition'>mayHaveCafRefs</span> <span class='hs-keyword'>_</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-23"></a>
<a name="line-24"></a><a name="seqCaf"></a><span class='hs-definition'>seqCaf</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CafInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-25"></a><span class='hs-definition'>seqCaf</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>()</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="ppCafInfo"></a><span class='hs-definition'>ppCafInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CafInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-28"></a><span class='hs-definition'>ppCafInfo</span> <span class='hs-conid'>NoCafRefs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"NoCafRefs"</span><span class='hs-layout'>)</span>
<a name="line-29"></a><span class='hs-definition'>ppCafInfo</span> <span class='hs-conid'>MayHaveCafRefs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection[cpr-IdInfo]{Constructed Product Result info about an @Id@}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-cpp'>#</span><span class='hs-varid'>ifdef</span> <span class='hs-conid'>OLD_STRICTNESS</span>
<a name="line-2"></a><a name="CprInfo"></a><span class='hs-comment'>-- | If the @Id@ is a function then it may have Constructed Product Result </span>
<a name="line-3"></a><a name="CprInfo"></a><span class='hs-comment'>-- (CPR) info. A CPR analysis phase detects whether:</span>
<a name="line-4"></a><a name="CprInfo"></a><span class='hs-comment'>-- </span>
<a name="line-5"></a><a name="CprInfo"></a><span class='hs-comment'>-- 1. The function's return value has a product type, i.e. an algebraic  type </span>
<a name="line-6"></a><a name="CprInfo"></a><span class='hs-comment'>-- with a single constructor. Examples of such types are tuples and boxed</span>
<a name="line-7"></a><a name="CprInfo"></a><span class='hs-comment'>-- primitive values.</span>
<a name="line-8"></a><a name="CprInfo"></a><span class='hs-comment'>--</span>
<a name="line-9"></a><a name="CprInfo"></a><span class='hs-comment'>-- 2. The function always 'constructs' the value that it is returning.  It</span>
<a name="line-10"></a><a name="CprInfo"></a><span class='hs-comment'>-- must do this on every path through,  and it's OK if it calls another</span>
<a name="line-11"></a><a name="CprInfo"></a><span class='hs-comment'>-- function which constructs the result.</span>
<a name="line-12"></a><a name="CprInfo"></a><span class='hs-comment'>-- </span>
<a name="line-13"></a><a name="CprInfo"></a><span class='hs-comment'>-- If this is the case then we store a template which tells us the</span>
<a name="line-14"></a><a name="CprInfo"></a><span class='hs-comment'>-- function has the CPR property and which components of the result are</span>
<a name="line-15"></a><a name="CprInfo"></a><span class='hs-comment'>-- also CPRs.</span>
<a name="line-16"></a><a name="CprInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CprInfo</span>
<a name="line-17"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoCPRInfo</span>   <span class='hs-comment'>-- ^ No, this function does not return a constructed product</span>
<a name="line-18"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ReturnsCPR</span>	<span class='hs-comment'>-- ^ Yes, this function returns a constructed product</span>
<a name="line-19"></a>		
<a name="line-20"></a>		<span class='hs-comment'>-- Implicitly, this means "after the function has been applied</span>
<a name="line-21"></a>		<span class='hs-comment'>-- to all its arguments", so the worker\/wrapper builder in </span>
<a name="line-22"></a>		<span class='hs-comment'>-- WwLib.mkWWcpr checks that that it is indeed saturated before</span>
<a name="line-23"></a>		<span class='hs-comment'>-- making use of the CPR info</span>
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-comment'>-- We used to keep nested info about sub-components, but</span>
<a name="line-26"></a>	<span class='hs-comment'>-- we never used it so I threw it away</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="noCprInfo"></a><span class='hs-comment'>-- | It's always safe to assume that an 'Id' does not have the CPR property</span>
<a name="line-29"></a><span class='hs-definition'>noCprInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CprInt</span>
<a name="line-30"></a><span class='hs-definition'>noCprInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoCPRInfo</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="seqCpr"></a><span class='hs-definition'>seqCpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CprInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-33"></a><span class='hs-definition'>seqCpr</span> <span class='hs-conid'>ReturnsCPR</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span>
<a name="line-34"></a><span class='hs-definition'>seqCpr</span> <span class='hs-conid'>NoCPRInfo</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="ppCprInfo"></a><span class='hs-definition'>ppCprInfo</span> <span class='hs-conid'>NoCPRInfo</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-37"></a><span class='hs-definition'>ppCprInfo</span> <span class='hs-conid'>ReturnsCPR</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"__M"</span><span class='hs-layout'>)</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>CprInfo</span> <span class='hs-keyword'>where</span>
<a name="line-40"></a>    <span class='hs-varid'>ppr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppCprInfo</span>
<a name="line-41"></a>
<a name="line-42"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>CprInfo</span> <span class='hs-keyword'>where</span>
<a name="line-43"></a>    <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showsPrecSDoc</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-cpp'>#endif</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection[lbvar-IdInfo]{Lambda-bound var info about an @Id@}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="LBVarInfo"></a><span class='hs-comment'>-- | If the 'Id' is a lambda-bound variable then it may have lambda-bound</span>
<a name="line-2"></a><a name="LBVarInfo"></a><span class='hs-comment'>-- variable info. Sometimes we know whether the lambda binding this variable</span>
<a name="line-3"></a><a name="LBVarInfo"></a><span class='hs-comment'>-- is a \"one-shot\" lambda; that is, whether it is applied at most once.</span>
<a name="line-4"></a><a name="LBVarInfo"></a><span class='hs-comment'>--</span>
<a name="line-5"></a><a name="LBVarInfo"></a><span class='hs-comment'>-- This information may be useful in optimisation, as computations may</span>
<a name="line-6"></a><a name="LBVarInfo"></a><span class='hs-comment'>-- safely be floated inside such a lambda without risk of duplicating</span>
<a name="line-7"></a><a name="LBVarInfo"></a><span class='hs-comment'>-- work.</span>
<a name="line-8"></a><a name="LBVarInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>LBVarInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoLBVarInfo</span>            <span class='hs-comment'>-- ^ No information</span>
<a name="line-9"></a>	       <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IsOneShotLambda</span>	<span class='hs-comment'>-- ^ The lambda is applied at most once).</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="noLBVarInfo"></a><span class='hs-comment'>-- | It is always safe to assume that an 'Id' has no lambda-bound variable information</span>
<a name="line-12"></a><span class='hs-definition'>noLBVarInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LBVarInfo</span>
<a name="line-13"></a><span class='hs-definition'>noLBVarInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoLBVarInfo</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="hasNoLBVarInfo"></a><span class='hs-definition'>hasNoLBVarInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LBVarInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-16"></a><span class='hs-definition'>hasNoLBVarInfo</span> <span class='hs-conid'>NoLBVarInfo</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-17"></a><span class='hs-definition'>hasNoLBVarInfo</span> <span class='hs-conid'>IsOneShotLambda</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="seqLBVar"></a><span class='hs-definition'>seqLBVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LBVarInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>()</span>
<a name="line-20"></a><span class='hs-definition'>seqLBVar</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>()</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="pprLBVarInfo"></a><span class='hs-definition'>pprLBVarInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LBVarInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-23"></a><span class='hs-definition'>pprLBVarInfo</span> <span class='hs-conid'>NoLBVarInfo</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-24"></a><span class='hs-definition'>pprLBVarInfo</span> <span class='hs-conid'>IsOneShotLambda</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"OneShot"</span><span class='hs-layout'>)</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>LBVarInfo</span> <span class='hs-keyword'>where</span>
<a name="line-27"></a>    <span class='hs-varid'>ppr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprLBVarInfo</span>
<a name="line-28"></a>
<a name="line-29"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>LBVarInfo</span> <span class='hs-keyword'>where</span>
<a name="line-30"></a>    <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showsPrecSDoc</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Bulk operations on IdInfo}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="zapLamInfo"></a><span class='hs-comment'>-- | This is used to remove information on lambda binders that we have</span>
<a name="line-2"></a><span class='hs-comment'>-- setup as part of a lambda group, assuming they will be applied all at once,</span>
<a name="line-3"></a><span class='hs-comment'>-- but turn out to be part of an unsaturated lambda as in e.g:</span>
<a name="line-4"></a><span class='hs-comment'>--</span>
<a name="line-5"></a><span class='hs-comment'>-- &gt; (\x1. \x2. e) arg1</span>
<a name="line-6"></a><span class='hs-definition'>zapLamInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>IdInfo</span>
<a name="line-7"></a><span class='hs-definition'>zapLamInfo</span> <span class='hs-varid'>info</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>IdInfo</span> <span class='hs-layout'>{</span><span class='hs-varid'>occInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occ</span><span class='hs-layout'>,</span> <span class='hs-varid'>newDemandInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>demand</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-8"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>is_safe_occ</span> <span class='hs-varid'>occ</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>is_safe_dmd</span> <span class='hs-varid'>demand</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-layout'>{</span><span class='hs-varid'>occInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>safe_occ</span><span class='hs-layout'>,</span> <span class='hs-varid'>newDemandInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-12"></a>  <span class='hs-keyword'>where</span>
<a name="line-13"></a>	<span class='hs-comment'>-- The "unsafe" occ info is the ones that say I'm not in a lambda</span>
<a name="line-14"></a>	<span class='hs-comment'>-- because that might not be true for an unsaturated lambda</span>
<a name="line-15"></a>    <span class='hs-varid'>is_safe_occ</span> <span class='hs-layout'>(</span><span class='hs-conid'>OneOcc</span> <span class='hs-varid'>in_lam</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>in_lam</span>
<a name="line-16"></a>    <span class='hs-varid'>is_safe_occ</span> <span class='hs-sel'>_other</span>		    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-17"></a>
<a name="line-18"></a>    <span class='hs-varid'>safe_occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>occ</span> <span class='hs-keyword'>of</span>
<a name="line-19"></a>		 <span class='hs-conid'>OneOcc</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>once</span> <span class='hs-varid'>int_cxt</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OneOcc</span> <span class='hs-varid'>insideLam</span> <span class='hs-varid'>once</span> <span class='hs-varid'>int_cxt</span>
<a name="line-20"></a>		 <span class='hs-sel'>_other</span>	       	       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>occ</span>
<a name="line-21"></a>
<a name="line-22"></a>    <span class='hs-varid'>is_safe_dmd</span> <span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-23"></a>    <span class='hs-varid'>is_safe_dmd</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>dmd</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isStrictDmd</span> <span class='hs-varid'>dmd</span><span class='hs-layout'>)</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="zapDemandInfo"></a><span class='hs-comment'>-- | Remove demand info on the 'IdInfo' if it is present, otherwise return @Nothing@</span>
<a name="line-2"></a><span class='hs-definition'>zapDemandInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>IdInfo</span>
<a name="line-3"></a><span class='hs-definition'>zapDemandInfo</span> <span class='hs-varid'>info</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>IdInfo</span> <span class='hs-layout'>{</span><span class='hs-varid'>newDemandInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dmd</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isJust</span> <span class='hs-varid'>dmd</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-layout'>{</span><span class='hs-varid'>newDemandInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="zapFragileInfo"></a><span class='hs-definition'>zapFragileInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IdInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>IdInfo</span>
<a name="line-2"></a><span class='hs-comment'>-- ^ Zap info that depends on free variables</span>
<a name="line-3"></a><span class='hs-definition'>zapFragileInfo</span> <span class='hs-varid'>info</span> 
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>info</span> <span class='hs-varop'>`setSpecInfo`</span> <span class='hs-varid'>emptySpecInfo</span>
<a name="line-5"></a>	       <span class='hs-varop'>`setWorkerInfo`</span> <span class='hs-conid'>NoWorker</span>
<a name="line-6"></a>               <span class='hs-varop'>`setUnfoldingInfo`</span> <span class='hs-varid'>noUnfolding</span>
<a name="line-7"></a>	       <span class='hs-varop'>`setOccInfo`</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isFragileOcc</span> <span class='hs-varid'>occ</span> <span class='hs-keyword'>then</span> <span class='hs-conid'>NoOccInfo</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
<a name="line-8"></a>  <span class='hs-keyword'>where</span>
<a name="line-9"></a>    <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occInfo</span> <span class='hs-varid'>info</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{TickBoxOp}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="TickBoxId"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>TickBoxId</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
<a name="line-2"></a>
<a name="line-3"></a><a name="TickBoxOp"></a><span class='hs-comment'>-- | Tick box for Hpc-style coverage</span>
<a name="line-4"></a><a name="TickBoxOp"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TickBoxOp</span> 
<a name="line-5"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TickBox</span> <span class='hs-conid'>Module</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>TickBoxId</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>TickBoxOp</span> <span class='hs-keyword'>where</span>
<a name="line-8"></a>    <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>TickBox</span> <span class='hs-varid'>mod</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"tick"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>mod</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span>
</pre>\end{code}
</body>
</html>