<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="SV" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">If I run:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  opt -globals-aa -die -inline -debug-pass=Details foo.ll -S<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">then I will get this pass structure:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Target Library Information<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Target Transform Information<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Target Pass Configuration<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Assumption Cache Tracker<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Profile summary info<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  ModulePass Manager<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CallGraph Construction<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Globals Alias Analysis<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    FunctionPass Manager<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">      BasicBlockPass Manager<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        Dead Instruction Elimination<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Call Graph SCC Pass Manager<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">      Function Integration/Inlining<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">      FunctionPass Manager<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">        Module Verifier<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    </span>Print Module IR<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="EN-US">FPPassManager:: getAnalysisUsage is doing setPreservesAll(),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">but is it correct that the FunctionPass Manager always preserves the CallGraph?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">My real problem is that when I use a foo.ll input that looks like this:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">;----------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">target triple = "x86_64-unknown-linux-gnu"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@b = external global i16, align 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">; Function Attrs: nounwind readnone<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">define i16 @f1() #0 {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">entry:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  ret i16 undef<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">define void @f2() {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">entry:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  %call = call i16 @f1()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  store i16 %call, i16* @b, align 1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  %call1 = call i16 @f1()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  ret void<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">attributes #0 = { nounwind readnone }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">;----------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">then %call1 will be removed by the Dead Instruction Elimination pass. I.e. that pass is not preserving the CallGraph!<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Dead Instruction Elimination is a BasicBlockPass, and DeadInstElimination::getAnalysisUsage is doing setPreservesCFG() (even though that should be implicit for a BasicBlockPass afaik).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">When reading the description of BasicBlockPass it seems to be legal to remove calls, and that should not impact the CFG, right? But it will impact the CallGraph.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I believe that when the FunctionPass Manager is used from within the Call Graph SCC Pass Manager, then the CGPassManager will check the modification status from the FPManager and call RefreshCallGraph() (or set CallGraphUpToDate=false;)
 in case modification had been done. Thus, it seems to be legit for a FunctionPass (and thereby also the FunctionPassManager) to not always preserve the CallGraph. And I think this is handled within the CGPassManager, but not when FPManager is executed directly
 from the MPManager<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Currently the test case above will end up in an assert, since there is a missing use of @f1 in the CallGraph when doing the inlining.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">That will go away if I remove the setPreservesAll from the FPPassManager:: getAnalysisUsage (which I assume is too aggressive).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Would it be correct to change the FPPassManager:: getAnalysisUsage to exclude “CallGraph Construction” from the set of preserved analyses, or am I missing something here?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I assume that DeadInstElimination isn’t preserving the CallGraph. Shouldn’t that (automatically/dynamically) impact which analyses that are preserved from the BBPassManager and the FPPassManager for this pass structure?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Björn<o:p></o:p></span></p>
</div>
</body>
</html>