<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="">Hi Arnaud,<div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 16, 2015, at 2:07 AM, Arnaud A. de Grandmaison <<a href="mailto:arnaud.degrandmaison@arm.com" class="">arnaud.degrandmaison@arm.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="WordSection1" style="page: WordSection1; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class="">Hi Quentin,<o:p class=""></o:p></span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class=""> </span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span lang="EN-US" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class="">GetAllSortedSuccessors does use some members of the MachineSink pass (MBFI, LI, DT), so I think it makes sense to leave it as a private method of MachineSink.</span></div></div></div></blockquote><div><br class=""></div><div>Thanks for checking!</div><div><br class=""></div><div>Cheers,</div><div>-Quentin</div><br class=""><blockquote type="cite" class=""><div class=""><div class="WordSection1" style="page: WordSection1; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span lang="EN-US" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class=""><o:p class=""></o:p></span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span lang="EN-US" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class=""> </span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class="">I<span class="Apple-converted-space"> </span></span><span lang="EN-US" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class="">committed</span><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class=""><span class="Apple-converted-space"> </span>the fixes @ r239807.<o:p class=""></o:p></span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class=""> </span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span lang="EN-US" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class="">Regarding the Spiller runtime, PR17409 is indeed the problem we are facing.<o:p class=""></o:p></span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span lang="EN-US" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class=""> </span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class="">Cheers,<o:p class=""></o:p></span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class="">Arnaud<o:p class=""></o:p></span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span lang="EN-US" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class=""> </span></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><span lang="EN-US" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125);" class=""> </span></div><div style="border-style: none none none solid; border-left-color: blue; border-left-width: 1.5pt; padding: 0cm 0cm 0cm 4pt;" class=""><div class=""><div style="border-style: solid none none; border-top-color: rgb(181, 196, 223); border-top-width: 1pt; padding: 3pt 0cm 0cm;" class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><b class=""><span lang="EN-US" style="font-size: 10pt; font-family: Tahoma, sans-serif;" class="">From:</span></b><span lang="EN-US" style="font-size: 10pt; font-family: Tahoma, sans-serif;" class=""><span class="Apple-converted-space"> </span>Quentin Colombet [<a href="mailto:qcolombet@apple.com" class="">mailto:qcolombet@apple.com</a>]<span class="Apple-converted-space"> </span><br class=""><b class="">Sent:</b><span class="Apple-converted-space"> </span>16 June 2015 00:26<br class=""><b class="">To:</b><span class="Apple-converted-space"> </span>Arnaud De Grandmaison<br class=""><b class="">Cc:</b><span class="Apple-converted-space"> </span><a href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><br class=""><b class="">Subject:</b><span class="Apple-converted-space"> </span>Re: [llvm] r239720 - [MachineSink] Improve runtime performance. NFC.<o:p class=""></o:p></span></div></div></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">Hi Arnaud,<o:p class=""></o:p></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">Thanks for making a new patch that fast!<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">LGTM with one question:<o:p class=""></o:p></div></div><div class=""><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-    GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB);<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+    GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB,<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+                           AllSuccsCache &AllSuccessors) const;<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">I haven’t checked but does this method need to access anything in MachineSinkPass or could it be marked as static?<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div></div><div class=""><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">On Jun 15, 2015, at 2:25 PM, Arnaud A. de Grandmaison <<a href="mailto:arnaud.degrandmaison@arm.com" style="color: purple; text-decoration: underline;" class="">arnaud.degrandmaison@arm.com</a>> wrote:<o:p class=""></o:p></div></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">Hi Quentin,<br class=""><br class="">Here is a patch that I think will address your comments. Let me know if you are ok with it.<br class=""><br class="">By the way, on a different (but related) subject, we find that llvm is 2x to 3x slower than gcc on a specific testscase (a big switch/case in a loop). llvm's codegen lasts about 2+ minutes, with about 40% spent in the Spiller. Although I understand regalloc can take a significant portion of time for this code, I was wondering whether you would be aware of any room for improvement there ?<o:p class=""></o:p></div></div></blockquote><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">There are things that can be improved, for instance, for the spiller we have this:<span class="Apple-converted-space"> </span><a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__llvm.org_bugs_show-5Fbug.cgi-3Fid-3D17409&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=_sA138Jmw_H5G44bhJvUKroiz6sMvu26PA6U6Yf4FX0&s=C6m4ejE9U0peAr2nQ50SjF7ypqIGahwpUsN6v2mYlb8&e=" style="color: purple; text-decoration: underline;" class="">https://llvm.org/bugs/show_bug.cgi?id=17409</a>.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">If you have more information on the profile of the case you want to solve, I may have some other suggestions. This is the only one I have in my mind for the spiller, but I have a few on the coalescer as well.<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">Thanks,<o:p class=""></o:p></div></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">Q. <o:p class=""></o:p></div></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class=""><br class=""><o:p class=""></o:p></div><div class=""><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">Cheers,<br class="">Arnaud<br class=""><br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-----Original Message-----<br class="">From:<span class="Apple-converted-space"> </span><a href="mailto:llvm-commits-bounces@cs.uiuc.edu" style="color: purple; text-decoration: underline;" class="">llvm-commits-bounces@cs.uiuc.edu</a><span class="Apple-converted-space"> </span>[mailto:llvm-commits-<br class=""><a href="mailto:bounces@cs.uiuc.edu" style="color: purple; text-decoration: underline;" class="">bounces@cs.uiuc.edu</a>] On Behalf Of Arnaud A. de Grandmaison<br class="">Sent: 15 June 2015 22:35<br class="">To: 'Quentin Colombet'<br class="">Cc:<span class="Apple-converted-space"> </span><a href="mailto:llvm-commits@cs.uiuc.edu" style="color: purple; text-decoration: underline;" class="">llvm-commits@cs.uiuc.edu</a><br class="">Subject: RE: [llvm] r239720 - [MachineSink] Improve runtime performance.<br class="">NFC.<br class=""><br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-----Original Message-----<br class="">From: Quentin Colombet [<a href="mailto:qcolombet@apple.com" style="color: purple; text-decoration: underline;" class="">mailto:qcolombet@apple.com</a>]<br class="">Sent: 15 June 2015 19:45<br class="">To: Arnaud De Grandmaison<br class="">Cc:<span class="Apple-converted-space"> </span><a href="mailto:llvm-commits@cs.uiuc.edu" style="color: purple; text-decoration: underline;" class="">llvm-commits@cs.uiuc.edu</a><br class="">Subject: Re: [llvm] r239720 - [MachineSink] Improve runtime performance.<br class="">NFC.<br class=""><br class="">Hi Arnaud,<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">Hi Quentin,<br class=""><br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">The current implementation of the caching mechanism seems confusing to<br class="">me.<br class="">Looking at the comment on the related field seems to imply that the<br class="">cache is global to the pass.<br class="">However, when we look at the implementation, the cache is reset each<br class="">time we process a new block.<br class=""><br class="">I found that confusing for two reasons:<br class="">1. We invalid the cache for apparently no good reason, i.e., why do we<br class="">assume the list of successors changed when processing a new block?<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">The reason is this is in fact a double-entry cache, but we do not need to have<br class="">this double entry cache for the whole pass duration (I guess I'm answering to<br class="">your second question here as well).<br class="">Looking at GetAllSortedSuccessors, beside MBB's successors, it contains basic<br class="">blocks immediately dominated by MI. MI->getParent() will stay the same for<br class="">each instruction processed by ProcessBlock, thus the clearing when another<br class="">basic block is processed.<br class=""><br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">2. If this cache is only valid for the current process block (and the<br class="">related traversed blocks), why is this a field global to the structure?<br class=""><br class="">I see two ways of fixing that:<br class="">1. Have the map being local to process block function and pass it to<br class="">the functions that use it.<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">I considered having the structure declared locally in ProcessBlock, and<br class="">passing it around to SinkInstruction, FindSuccToSinkTo and isProfitableToSink,<br class="">but it seemed a bit clumsy to me. I however agree it would have at least the<br class="">merit of making the cache lifetime explicit.<br class=""><br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">2. Have the cache being really global and invalid it only when it makes<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">sense.<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">Also, side remark, for caching/lazy structures, I expect those to be<br class="">mutable and have the related function being const… My 2c.<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">Given my above comments, I'll modify the patch to make the cache local, as I<br class="">think it makes things clearer.<br class=""><br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">Cheers,<br class="">-Quentin<br class=""><br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">On Jun 15, 2015, at 2:09 AM, Arnaud A. de Grandmaison<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><<a href="mailto:arnaud.degrandmaison@arm.com" style="color: purple; text-decoration: underline;" class="">arnaud.degrandmaison@arm.com</a>> wrote:<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class="">Author: aadg<br class="">Date: Mon Jun 15 04:09:06 2015<br class="">New Revision: 239720<br class=""><br class="">URL:<span class="Apple-converted-space"> </span><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239720-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=_sA138Jmw_H5G44bhJvUKroiz6sMvu26PA6U6Yf4FX0&s=vqiEbZ4qwyOgKE3VfAI7NzHrO51fgJdMqPiMrzldGuk&e=" style="color: purple; text-decoration: underline;" class="">http://llvm.org/viewvc/llvm-project?rev=239720&view=rev</a><br class="">Log:<br class="">[MachineSink] Improve runtime performance. NFC.<br class=""><br class="">This patch fixes a compilation time issue, when MachineSink faces<br class="">PHIs with a huge number of operands. This can happen for example in<br class="">goto table based interpreters, where some basic blocks can have<br class="">several of those PHIs, each one with several hundreds operands.<br class="">MachineSink was spending a significant time re-building and<br class="">re-sorting the list of successors of the current MachineBasicBlock.<br class="">The computing and sorting of the current MachineBasicBlock successors is<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">now cached.<br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><p class="MsoNormal" style="margin: 0cm 0cm 12pt; font-size: 12pt; font-family: 'Times New Roman', serif;"><br class="">Modified:<br class="">  llvm/trunk/lib/CodeGen/MachineSink.cpp<br class=""><br class="">Modified: llvm/trunk/lib/CodeGen/MachineSink.cpp<br class="">URL:<br class=""><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_MachineSi&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=_sA138Jmw_H5G44bhJvUKroiz6sMvu26PA6U6Yf4FX0&s=wF5k0YdifwPOLGeG0epX-SlnkbljrP4tM1zetw6uhBQ&e=" style="color: purple; text-decoration: underline;" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineSi</a><br class="">nk .cpp?rev=239720&r1=239719&r2=239720&view=diff<o:p class=""></o:p></p></blockquote><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><o:p class=""> </o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">==========================================================<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">============<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">========<br class="">--- llvm/trunk/lib/CodeGen/MachineSink.cpp (original)<br class="">+++ llvm/trunk/lib/CodeGen/MachineSink.cpp Mon Jun 15 04:09:06 2015<br class="">@@ -73,6 +73,11 @@ namespace {<br class=""><br class="">   SparseBitVector<> RegsToClearKillFlags;<br class=""><br class="">+    // Cache all successors to a MachineBasicBlock, sorted by<br class="">+ frequency info<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">and<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+    // loop depth. AllSuccessors is lazily populated.<br class="">+    std::map<MachineBasicBlock *, SmallVector<MachineBasicBlock *,<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">4>><br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+        AllSuccessors;<br class="">+<br class=""> public:<br class="">   static char ID; // Pass identification<br class="">   MachineSinking() : MachineFunctionPass(ID) { @@ -132,6 +137,9 @@<br class="">namespace {<br class=""><br class="">   bool PerformTrivialForwardCoalescing(MachineInstr *MI,<br class="">                                        MachineBasicBlock *MBB);<br class="">+<br class="">+    SmallVector<MachineBasicBlock *, 4> &<br class="">+    GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock<br class="">+ *MBB);<br class=""> };<br class="">} // end anonymous namespace<br class=""><br class="">@@ -269,9 +277,8 @@ bool MachineSinking::runOnMachineFunctio<br class="">   // Process all basic blocks.<br class="">   CEBCandidates.clear();<br class="">   ToSplit.clear();<br class="">-    for (MachineFunction::iterator I = MF.begin(), E = MF.end();<br class="">-         I != E; ++I)<br class="">-      MadeChange |= ProcessBlock(*I);<br class="">+    for (auto &MBB: MF)<br class="">+      MadeChange |= ProcessBlock(MBB);<br class=""><br class="">   // If we have anything we marked as toSplit, split it now.<br class="">   for (auto &Pair : ToSplit) {<br class="">@@ -310,6 +317,9 @@ bool MachineSinking::ProcessBlock(Machin<br class=""><br class=""> bool MadeChange = false;<br class=""><br class="">+  // MBB changed, reset all cached information.<br class="">+  AllSuccessors.clear();<br class="">+<br class=""> // Walk the basic block bottom-up.  Remember if we saw a store.<br class=""> MachineBasicBlock::iterator I = MBB.end();<br class=""> --I;<br class="">@@ -522,6 +532,51 @@ bool MachineSinking::isProfitableToSinkT<br class=""> return false;<br class="">}<br class=""><br class="">+/// Get the sorted sequence of successors for this<br class="">+MachineBasicBlock, possibly /// computing it if it was not already<o:p class=""></o:p></div></blockquote><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">cached.<br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+SmallVector<MachineBasicBlock *, 4> &<br class="">+MachineSinking::GetAllSortedSuccessors(MachineInstr *MI,<br class="">+MachineBasicBlock *MBB) {<br class="">+<br class="">+  // Do we have the sorted successors in cache ?<br class="">+  auto Succs = AllSuccessors.find(MBB);  if (Succs !=<br class="">+ AllSuccessors.end())<br class="">+    return Succs->second;<br class="">+<br class="">+  SmallVector<MachineBasicBlock *, 4> AllSuccs(MBB->succ_begin(),<br class="">+                                               MBB->succ_end());<br class="">+<br class="">+  // Handle cases where sinking can happen but where the sink point<br class="">+ isn't a  // successor. For example:<br class="">+  //<br class="">+  //   x = computation<br class="">+  //   if () {} else {}<br class="">+  //   use x<br class="">+  //<br class="">+  const std::vector<MachineDomTreeNode *> &Children =<br class="">+    DT->getNode(MBB)->getChildren();  for (const auto &DTChild :<br class="">+ Children)<br class="">+    // DomTree children of MBB that have MBB as immediate dominator<o:p class=""></o:p></div></blockquote><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">are added.<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+    if (DTChild->getIDom()->getBlock() == MI->getParent() &&<br class="">+        // Skip MBBs already added to the AllSuccs vector above.<br class="">+        !MBB->isSuccessor(DTChild->getBlock()))<br class="">+      AllSuccs.push_back(DTChild->getBlock());<br class="">+<br class="">+  // Sort Successors according to their loop depth or block frequency<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">info.<br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+  std::stable_sort(<br class="">+      AllSuccs.begin(), AllSuccs.end(),<br class="">+      [this](const MachineBasicBlock *L, const MachineBasicBlock *R) {<br class="">+        uint64_t LHSFreq = MBFI ? MBFI->getBlockFreq(L).getFrequency() :<o:p class=""></o:p></div></blockquote><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">0;<br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+        uint64_t RHSFreq = MBFI ? MBFI->getBlockFreq(R).getFrequency() :<o:p class=""></o:p></div></blockquote><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">0;<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">+        bool HasBlockFreq = LHSFreq != 0 && RHSFreq != 0;<br class="">+        return HasBlockFreq ? LHSFreq < RHSFreq<br class="">+                            : LI->getLoopDepth(L) < LI->getLoopDepth(R);<br class="">+      });<br class="">+<br class="">+  auto it = AllSuccessors.insert(std::make_pair(MBB, AllSuccs));<br class="">+<br class="">+  return it.first->second;<br class="">+}<br class="">+<br class="">/// FindSuccToSinkTo - Find a successor to sink this instruction to.<br class="">MachineBasicBlock *MachineSinking::FindSuccToSinkTo(MachineInstr<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">*MI,<br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">                                  MachineBasicBlock *MBB, @@<br class="">-579,38<br class="">+634,7 @@ MachineBasicBlock *MachineSinking::FindS<br class="">     // we should sink to. If we have reliable block frequency information<br class="">     // (frequency != 0) available, give successors with smaller frequencies<br class="">     // higher priority, otherwise prioritize smaller loop depths.<br class="">-      SmallVector<MachineBasicBlock*, 4> Succs(MBB->succ_begin(),<br class="">-                                               MBB->succ_end());<br class="">-<br class="">-      // Handle cases where sinking can happen but where the sink point<o:p class=""></o:p></div></blockquote><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">isn't a<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-      // successor. For example:<br class="">-      //<br class="">-      //   x = computation<br class="">-      //   if () {} else {}<br class="">-      //   use x<br class="">-      //<br class="">-      const std::vector<MachineDomTreeNode *> &Children =<br class="">-        DT->getNode(MBB)->getChildren();<br class="">-      for (const auto &DTChild : Children)<br class="">-        // DomTree children of MBB that have MBB as immediate dominator<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">are added.<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-        if (DTChild->getIDom()->getBlock() == MI->getParent() &&<br class="">-            // Skip MBBs already added to the Succs vector above.<br class="">-            !MBB->isSuccessor(DTChild->getBlock()))<br class="">-          Succs.push_back(DTChild->getBlock());<br class="">-<br class="">-      // Sort Successors according to their loop depth or block frequency<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">info.<br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-      std::stable_sort(<br class="">-          Succs.begin(), Succs.end(),<br class="">-          [this](const MachineBasicBlock *L, const MachineBasicBlock *R) {<br class="">-            uint64_t LHSFreq = MBFI ? MBFI->getBlockFreq(L).getFrequency()<o:p class=""></o:p></div></blockquote><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">:<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">0;<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-            uint64_t RHSFreq = MBFI ? MBFI->getBlockFreq(R).getFrequency()<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">:<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">0;<br class=""><br class=""><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-            bool HasBlockFreq = LHSFreq != 0 && RHSFreq != 0;<br class="">-            return HasBlockFreq ? LHSFreq < RHSFreq<br class="">-                                : LI->getLoopDepth(L) < LI->getLoopDepth(R);<br class="">-          });<br class="">-      for (SmallVectorImpl<MachineBasicBlock *>::iterator SI =<o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">Succs.begin(),<br class=""><br class=""><o:p class=""></o:p></div><blockquote style="margin-top: 5pt; margin-bottom: 5pt;" class="" type="cite"><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class="">-             E = Succs.end(); SI != E; ++SI) {<br class="">-        MachineBasicBlock *SuccBlock = *SI;<br class="">+      for (MachineBasicBlock *SuccBlock :<br class="">+ GetAllSortedSuccessors(MI,<br class="">+ MBB)) {<br class="">       bool LocalUse = false;<br class="">       if (AllUsesDominatedByBlock(Reg, SuccBlock, MBB,<br class="">                                   BreakPHIEdge, LocalUse)) {<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@cs.uiuc.edu" style="color: purple; text-decoration: underline;" class="">llvm-commits@cs.uiuc.edu</a><br class=""><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" style="color: purple; text-decoration: underline;" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><o:p class=""></o:p></div></blockquote><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><br class=""><br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@cs.uiuc.edu" style="color: purple; text-decoration: underline;" class="">llvm-commits@cs.uiuc.edu</a><br class=""><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" style="color: purple; text-decoration: underline;" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><o:p class=""></o:p></div><div style="margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif;" class=""><0001-MachineSink-Address-post-commit-review-comments.patch></div></div></div></div></div></div></div></blockquote></div><br class=""></div></body></html>