<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 27, 2016, at 12:25 PM, vivek pandya <<a href="mailto:vivekvpandya@gmail.com" class="">vivekvpandya@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hello ,<div class=""><br class=""></div><div class="">To solve this bug locally I have given preference to tail call optimization over local function related optimization in IPRA. I have added following method to achieve this:</div><div class=""><br class=""></div><div class=""><div class="">bool isEligibleForTailCallOptimization(Function *F) {</div><div class="">  CallingConv::ID CC = F->getCallingConv();</div><div class="">  if (CC == CallingConv::Fast || CC == CallingConv::GHC || CC == CallingConv::HiPE)</div><div class="">    return true;</div><div class="">  return false;</div><div class="">}</div></div><div class=""><br class=""></div><div class="">Any other suggestions are always welcomed.</div></div></div></blockquote><div><br class=""></div>Why aren’t checking for the presence of a tail call?</div><div><br class=""></div><div>— </div><div>Mehdi</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">and I am checking this condition along with hasLocalLinkage() and hasAddressTaken().</div><div class=""><br class=""></div><div class="">Due to this test-suite now has only 2 runtime failure where as before this there were around 43 due to local function related optimization. But of course by giving preference to tail call many opportunities to optimize IPRA is missed.</div><div class=""><br class=""></div><div class="">The 2 existing failure are interesting and hard to debug, namely they are MultiSource/Applications/SPASS/SPASS and MultiSource/Applications/sqlite3/sqlite3</div><div class=""><br class=""></div><div class="">However for test-suite sqlite3 is only complied as CLI program and thus it only contains 2 (big) source files. In sqlite3 source code there are few static methods with variable number of arguments and due to that these static function should not get tail call optimized and thus IPRA optimization can be done but I am digging more into this to know reason of failures.</div><div class=""><br class=""></div><div class="">Sincerely,</div><div class="">Vivek</div><div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Sun, Jun 26, 2016 at 10:05 PM, vivek pandya <span dir="ltr" class=""><<a href="mailto:vivekvpandya@gmail.com" target="_blank" class="">vivekvpandya@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">According to this <a href="http://llvm.org/docs/CodeGenerator.html#tail-call-section" target="_blank" class="">http://llvm.org/docs/CodeGenerator.html#tail-call-section</a>, it seems that adding a new CC for the purpose of local function optimization seems a good idea because tail call optimization only takes place when both caller and callee have fastcc or GHC or HiPE calling convention.<span class="HOEnZb"><font color="#888888" class=""><div class=""><br class=""></div></font></span><div class=""><span class="HOEnZb"><font color="#888888" class="">-Vivek</font></span><div class=""><div class="h5"><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Sun, Jun 26, 2016 at 1:26 AM, vivek pandya <span dir="ltr" class=""><<a href="mailto:vivekvpandya@gmail.com" target="_blank" class="">vivekvpandya@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote"><div class=""><div class="">On Sat, Jun 25, 2016 at 11:03 PM, vivek pandya <span dir="ltr" class=""><<a href="mailto:vivekvpandya@gmail.com" target="_blank" class="">vivekvpandya@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class=""><div class="">Hello LLVM Community,<br class=""></div><div class=""><br class=""></div><div class="">To improve Interprocedural Register Allocation (IPRA) we are trying to force caller</div><div class="">saved registers for local functions (which has likage type local). To achive it</div><div class="">I have modified TargetFrameLowering::determineCalleeSaves() to return early for</div><div class="">function which satisfies if (F->hasLocalLinkage() && !F->hasAddressTaken()) and</div><div class="">also reflecting the fact that for local function there are no caller saved registers</div><div class="">I am also changing RegUsageInfoCollector.cpp to not to mark regiseters as callee</div><div class="">saved in RegMask due to CC with follwoing change in code:</div><div class=""><br class=""></div><div class="">if (!F->hasLocalLinkage() || F->hasAddressTaken()) {</div><div class="">      const uint32_t *CallPreservedMask =</div><div class="">        TRI->getCallPreservedMask(MF, MF.getFunction()->getCallingConv());</div><div class="">      // Set callee saved register as preserved.</div><div class="">      for (unsigned i = 0; i < RegMaskSize; ++i)</div><div class="">        RegMask[i] = RegMask[i] | CallPreservedMask[i];</div><div class="">    } </div><div class=""><br class=""></div><div class="">For more details please follow following link.</div><div class=""><a href="https://groups.google.com/d/msg/llvm-dev/XRzGhJ9wtZg/bYFMzppXEwAJ" target="_blank" class="">https://groups.google.com/d/msg/llvm-dev/XRzGhJ9wtZg/bYFMzppXEwAJ</a></div><div class=""><br class=""></div><div class="">Now consider following bug due to forcing caller saved registers for local function</div><div class="">when IPRA enable:</div><div class=""><br class=""></div><div class="">void makewt(int nw, int *ip, double *w) {</div><div class="">  ...</div><div class="">  bitrv2(nw, ip, w);</div><div class="">}</div><div class=""><br class=""></div><div class="">here bitrv2 is local fuction and for that when IPRA enable callee saved registers</div><div class="">are set to none. So for that function following is set of collbered register as</div><div class="">per regmaks collected by RegUsageInfoCollector pass.</div><div class=""><br class=""></div><div class="">Function Name : bitrv2</div><div class="">Clobbered Registers:</div><div class="">AH AL AX BH BL BP BPL BX CH CL CX DI DIL EAX EBP EBX ECX EDI EFLAGS ESI ESP RAX</div><div class="">RBP RBX RCX RDI RSI RSP SI SIL SP SPL R8 R9 R10 R11 R12 R13 R14 R15 R8B R9B R10B</div><div class="">R11B R12B R13B R14B R15B R8D R9D R10D R11D R12D R13D R14D R15D R8W R9W R10W R11W</div><div class="">R12W R13W R14W R15W</div><div class=""><br class=""></div><div class="">How ever caller of bitrv2, makewt has callee saved registers as per CC, but this</div><div class="">code results in segmentation fault when compliled with O1 because makewt has value</div><div class="">of *ip in R14 register and that is stored and restore by makewt at begining of call</div><div class="">but due to tail call optimization following code is generated and here bitrv2 does</div><div class="">not preserve R14 so whwn execution returns to main (which is caller of makewt)</div><div class="">value of *ip is gone from R14 (which sould not) and when main calls makewt again</div><div class="">then value of *ip (R14) is wrong and result into segmentation fault.</div><div class=""><br class=""></div><div class="">Assembly code of makewt:</div><div class="">  _makewt:</div><div class="">  ...</div><div class="">  popq  %rbx</div><div class="">  popq  %r12</div><div class="">  popq  %r13</div><div class="">  popq  %r14</div><div class="">  popq  %r15</div><div class="">  popq  %rbp</div><div class="">  jmp _bitrv2                 ## TAILCALL</div></div></blockquote><div class=""><br class=""></div></div></div><div class="">A very naive solution to this problem come to me is to convert above code to following:</div><div class=""><br class=""></div><div class=""> _makewt:</div><div class="">  ...</div><div class="">  jmp _bitrv2                 ## TAILCALL<br class=""></div><span class=""><div class="">  popq  %rbx</div><div class="">  popq  %r12</div><div class="">  popq  %r13</div><div class="">  popq  %r14</div><div class="">  popq  %r15</div><div class="">  popq  %rbp</div><div class=""> </div></span><div class="">So that when _bitrv2 returns caller will over write callee saved register ( as per CC of that function ) to correct values.</div><div class="">I wanted to try it out but I am not able to find correct code where I can do that.</div><span class=""><font color="#888888" class=""><div class="">-Vivek</div></font></span><span class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class=""><div class=""><br class=""></div><div class="">There is one more case of faluire due to local function related optimization.</div><div class="">I am analysing that (sorry for taking more time but I am not much good at assembly).</div><div class=""><br class=""></div><div class="">I need some hints for how to solve this. If you feel some problem with my analyses</div><div class="">please let me know if you want me to send generated .s file and source .c file.</div><div class=""><br class=""></div><div class="">Sincerely,</div><div class="">Vivek</div></div>
</blockquote></span></div><br class=""></div></div>
</blockquote></div><br class=""></div></div></div></div></div>
</blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></body></html>