<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=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@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:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
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";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
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="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal">I am working on a small optimization feature to replace the calls with indirect reference using  a memory with an indirect reference using register. The purpose of this feature is to improve the performance of calls to functions referred
 to by function pointers. The motivation behind this work is that gcc does this optimization.<o:p></o:p></p>
<p class="MsoNormal">Here is a small test case, that will generate an indirect call with memory reference:<o:p></o:p></p>
<p class="MsoNormal">int main()<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    extern void (*foo)();<o:p></o:p></p>
<p class="MsoNormal">    foo();<o:p></o:p></p>
<p class="MsoNormal">    return 0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">And the corresponding assembly output is:<o:p></o:p></p>
<p class="MsoNormal">…<o:p></o:p></p>
<p class="MsoNormal">main:                                   # @main<o:p></o:p></p>
<p class="MsoNormal">               .cfi_startproc<o:p></o:p></p>
<p class="MsoNormal"># BB#0:                                 # %entry<o:p></o:p></p>
<p class="MsoNormal">               pushq    %rax<o:p></o:p></p>
<p class="MsoNormal">.Ltmp1:<o:p></o:p></p>
<p class="MsoNormal">               .cfi_def_cfa_offset 16<o:p></o:p></p>
<p class="MsoNormal">               movl      $2, %edi<o:p></o:p></p>
<p class="MsoNormal">               callq       *foo(%rip)<o:p></o:p></p>
<p class="MsoNormal">               xorl        %eax, %eax<o:p></o:p></p>
<p class="MsoNormal">               popq      %rdx<o:p></o:p></p>
<p class="MsoNormal">               ret<o:p></o:p></p>
<p class="MsoNormal">…<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The patch aims to make the memory reference to use a register reference by moving the address in *foo(%rip) into a register and use it for the call. The updated assembly output is:<o:p></o:p></p>
<p class="MsoNormal">…<o:p></o:p></p>
<p class="MsoNormal">main:                                   # @main<o:p></o:p></p>
<p class="MsoNormal">               .cfi_startproc<o:p></o:p></p>
<p class="MsoNormal"># BB#0:                                 # %entry<o:p></o:p></p>
<p class="MsoNormal">               pushq    %rax<o:p></o:p></p>
<p class="MsoNormal">.Ltmp1:<o:p></o:p></p>
<p class="MsoNormal">               .cfi_def_cfa_offset 16<o:p></o:p></p>
<p class="MsoNormal">               movq     foo(%rip), %rax<o:p></o:p></p>
<p class="MsoNormal">               movl      $0, 4(%rsp)<o:p></o:p></p>
<p class="MsoNormal">               callq       *%rax<o:p></o:p></p>
<p class="MsoNormal">               xorl        %eax, %eax<o:p></o:p></p>
<p class="MsoNormal">               popq      %rdx<o:p></o:p></p>
<p class="MsoNormal">               ret<o:p></o:p></p>
<p class="MsoNormal">…<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">However, I am unable to proceed with this fix because it modifies the SelectionDAG to insert a CopyFromReg and a CopyToReg nodes to do this operation. I tried to use a slightly modified test case, using arguments to function instead of
 void, and it fails. Here is the modified test case:<o:p></o:p></p>
<p class="MsoNormal">int main()<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    extern void (*foo)(int);<o:p></o:p></p>
<p class="MsoNormal">    foo(2);<o:p></o:p></p>
<p class="MsoNormal">    return 0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">And the problem is that I am seeing an assertion failure with respect to the DAG structure.
<o:p></o:p></p>
<p class="MsoNormal">                             .file         "<stdin>"<o:p></o:p></p>
<p class="MsoNormal">llc: ~/llvm/lib/CodeGen/ScheduleDAG.cpp:510: void llvm::ScheduleDAGTopologicalSort::InitDAGTopologicalSorting(): Assertion `Node2Index[SU->NodeNum] > Node2Index[I->getSUnit()->NodeNum] && "Wrong topological sorting"' failed.<o:p></o:p></p>
<p class="MsoNormal">0  llc             0x000000000117ef3a llvm::sys::PrintStackTrace(_IO_FILE*) + 38<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am wondering if the modification made to the DAG is causing a problem, and can it be done at all? If I cannot do this, is there any other place I can look at, to make this work.
<o:p></o:p></p>
<p class="MsoNormal">--<o:p></o:p></p>
<p class="MsoNormal">Sriram Murali<o:p></o:p></p>
<p class="MsoNormal">SSG/DPD/ECDL/DMP<o:p></o:p></p>
<p class="MsoNormal">+1 (519) 772 – 2579<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>