<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=utf-8"><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;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","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;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
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=FR link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi Quentin,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>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.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I </span><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>committed</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> the fixes @ r239807.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Regarding the Spiller runtime, PR17409 is indeed the problem we are facing.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Cheers,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Arnaud<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Quentin Colombet [mailto:qcolombet@apple.com] <br><b>Sent:</b> 16 June 2015 00:26<br><b>To:</b> Arnaud De Grandmaison<br><b>Cc:</b> llvm-commits@cs.uiuc.edu<br><b>Subject:</b> Re: [llvm] r239720 - [MachineSink] Improve runtime performance. NFC.<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Hi Arnaud,<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Thanks for making a new patch that fast!<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>LGTM with one question:<o:p></o:p></p></div><div><div><p class=MsoNormal>-    GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB);<o:p></o:p></p></div><div><p class=MsoNormal>+    GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock *MBB,<o:p></o:p></p></div><div><p class=MsoNormal>+                           AllSuccsCache &AllSuccessors) const;<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>I haven’t checked but does this method need to access anything in MachineSinkPass or could it be marked as static?<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal>On Jun 15, 2015, at 2:25 PM, Arnaud A. de Grandmaison <<a href="mailto:arnaud.degrandmaison@arm.com">arnaud.degrandmaison@arm.com</a>> wrote:<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>Hi Quentin,<br><br>Here is a patch that I think will address your comments. Let me know if you are ok with it.<br><br>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></o:p></p></div></blockquote><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>There are things that can be improved, for instance, for the spiller we have this: <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=PvyvgOczWXfM_jM5h2puYfGhrfIdTxptfMSIw648BjM&s=2d7NCf1lw8WOGLAsq8bYTHwDZR89L1rTEhp1gkj8C2o&e=">https://llvm.org/bugs/show_bug.cgi?id=17409</a>.<o:p></o:p></p></div><div><p class=MsoNormal>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></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal>Q. <o:p></o:p></p></div><p class=MsoNormal><br><br><o:p></o:p></p><div><p class=MsoNormal><br>Cheers,<br>Arnaud<br><br><br><o:p></o:p></p><p class=MsoNormal>-----Original Message-----<br>From: <a href="mailto:llvm-commits-bounces@cs.uiuc.edu">llvm-commits-bounces@cs.uiuc.edu</a> [mailto:llvm-commits-<br><a href="mailto:bounces@cs.uiuc.edu">bounces@cs.uiuc.edu</a>] On Behalf Of Arnaud A. de Grandmaison<br>Sent: 15 June 2015 22:35<br>To: 'Quentin Colombet'<br>Cc: <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>Subject: RE: [llvm] r239720 - [MachineSink] Improve runtime performance.<br>NFC.<br><br><br><o:p></o:p></p><p class=MsoNormal>-----Original Message-----<br>From: Quentin Colombet [<a href="mailto:qcolombet@apple.com">mailto:qcolombet@apple.com</a>]<br>Sent: 15 June 2015 19:45<br>To: Arnaud De Grandmaison<br>Cc: <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>Subject: Re: [llvm] r239720 - [MachineSink] Improve runtime performance.<br>NFC.<br><br>Hi Arnaud,<o:p></o:p></p><p class=MsoNormal><br>Hi Quentin,<br><br><br><o:p></o:p></p><p class=MsoNormal><br>The current implementation of the caching mechanism seems confusing to<br>me.<br>Looking at the comment on the related field seems to imply that the<br>cache is global to the pass.<br>However, when we look at the implementation, the cache is reset each<br>time we process a new block.<br><br>I found that confusing for two reasons:<br>1. We invalid the cache for apparently no good reason, i.e., why do we<br>assume the list of successors changed when processing a new block?<o:p></o:p></p><p class=MsoNormal><br>The reason is this is in fact a double-entry cache, but we do not need to have<br>this double entry cache for the whole pass duration (I guess I'm answering to<br>your second question here as well).<br>Looking at GetAllSortedSuccessors, beside MBB's successors, it contains basic<br>blocks immediately dominated by MI. MI->getParent() will stay the same for<br>each instruction processed by ProcessBlock, thus the clearing when another<br>basic block is processed.<br><br><br><o:p></o:p></p><p class=MsoNormal>2. If this cache is only valid for the current process block (and the<br>related traversed blocks), why is this a field global to the structure?<br><br>I see two ways of fixing that:<br>1. Have the map being local to process block function and pass it to<br>the functions that use it.<o:p></o:p></p><p class=MsoNormal><br>I considered having the structure declared locally in ProcessBlock, and<br>passing it around to SinkInstruction, FindSuccToSinkTo and isProfitableToSink,<br>but it seemed a bit clumsy to me. I however agree it would have at least the<br>merit of making the cache lifetime explicit.<br><br><br><o:p></o:p></p><p class=MsoNormal>2. Have the cache being really global and invalid it only when it makes<o:p></o:p></p><p class=MsoNormal>sense.<br><br><o:p></o:p></p><p class=MsoNormal><br>Also, side remark, for caching/lazy structures, I expect those to be<br>mutable and have the related function being const… My 2c.<o:p></o:p></p><p class=MsoNormal><br>Given my above comments, I'll modify the patch to make the cache local, as I<br>think it makes things clearer.<br><br><br><o:p></o:p></p><p class=MsoNormal><br>Cheers,<br>-Quentin<br><br><br><o:p></o:p></p><p class=MsoNormal>On Jun 15, 2015, at 2:09 AM, Arnaud A. de Grandmaison<o:p></o:p></p><p class=MsoNormal><<a href="mailto:arnaud.degrandmaison@arm.com">arnaud.degrandmaison@arm.com</a>> wrote:<br><br><o:p></o:p></p><p class=MsoNormal><br>Author: aadg<br>Date: Mon Jun 15 04:09:06 2015<br>New Revision: 239720<br><br>URL: <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=PvyvgOczWXfM_jM5h2puYfGhrfIdTxptfMSIw648BjM&s=MLWMM0dkxLqXTpYpmoVdNHm_7ejZB7-jKLteQJO44Mk&e=">http://llvm.org/viewvc/llvm-project?rev=239720&view=rev</a><br>Log:<br>[MachineSink] Improve runtime performance. NFC.<br><br>This patch fixes a compilation time issue, when MachineSink faces<br>PHIs with a huge number of operands. This can happen for example in<br>goto table based interpreters, where some basic blocks can have<br>several of those PHIs, each one with several hundreds operands.<br>MachineSink was spending a significant time re-building and<br>re-sorting the list of successors of the current MachineBasicBlock.<br>The computing and sorting of the current MachineBasicBlock successors is<o:p></o:p></p><p class=MsoNormal>now cached.<br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal style='margin-bottom:12.0pt'><br>Modified:<br>  llvm/trunk/lib/CodeGen/MachineSink.cpp<br><br>Modified: llvm/trunk/lib/CodeGen/MachineSink.cpp<br>URL:<br><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=PvyvgOczWXfM_jM5h2puYfGhrfIdTxptfMSIw648BjM&s=qaiOHYa0K9vDU6Z4gI8A_ojztM9OWpQEGqAL9rJ3iCU&e=">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineSi</a><br>nk .cpp?rev=239720&r1=239719&r2=239720&view=diff<o:p></o:p></p></blockquote><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>==========================================================<br><br><o:p></o:p></p><p class=MsoNormal>============<br><br><o:p></o:p></p><p class=MsoNormal>========<br>--- llvm/trunk/lib/CodeGen/MachineSink.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/MachineSink.cpp Mon Jun 15 04:09:06 2015<br>@@ -73,6 +73,11 @@ namespace {<br><br>   SparseBitVector<> RegsToClearKillFlags;<br><br>+    // Cache all successors to a MachineBasicBlock, sorted by<br>+ frequency info<o:p></o:p></p><p class=MsoNormal>and<br><br><o:p></o:p></p><p class=MsoNormal>+    // loop depth. AllSuccessors is lazily populated.<br>+    std::map<MachineBasicBlock *, SmallVector<MachineBasicBlock *,<o:p></o:p></p><p class=MsoNormal>4>><br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>+        AllSuccessors;<br>+<br> public:<br>   static char ID; // Pass identification<br>   MachineSinking() : MachineFunctionPass(ID) { @@ -132,6 +137,9 @@<br>namespace {<br><br>   bool PerformTrivialForwardCoalescing(MachineInstr *MI,<br>                                        MachineBasicBlock *MBB);<br>+<br>+    SmallVector<MachineBasicBlock *, 4> &<br>+    GetAllSortedSuccessors(MachineInstr *MI, MachineBasicBlock<br>+ *MBB);<br> };<br>} // end anonymous namespace<br><br>@@ -269,9 +277,8 @@ bool MachineSinking::runOnMachineFunctio<br>   // Process all basic blocks.<br>   CEBCandidates.clear();<br>   ToSplit.clear();<br>-    for (MachineFunction::iterator I = MF.begin(), E = MF.end();<br>-         I != E; ++I)<br>-      MadeChange |= ProcessBlock(*I);<br>+    for (auto &MBB: MF)<br>+      MadeChange |= ProcessBlock(MBB);<br><br>   // If we have anything we marked as toSplit, split it now.<br>   for (auto &Pair : ToSplit) {<br>@@ -310,6 +317,9 @@ bool MachineSinking::ProcessBlock(Machin<br><br> bool MadeChange = false;<br><br>+  // MBB changed, reset all cached information.<br>+  AllSuccessors.clear();<br>+<br> // Walk the basic block bottom-up.  Remember if we saw a store.<br> MachineBasicBlock::iterator I = MBB.end();<br> --I;<br>@@ -522,6 +532,51 @@ bool MachineSinking::isProfitableToSinkT<br> return false;<br>}<br><br>+/// Get the sorted sequence of successors for this<br>+MachineBasicBlock, possibly /// computing it if it was not already<o:p></o:p></p></blockquote><p class=MsoNormal>cached.<br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>+SmallVector<MachineBasicBlock *, 4> &<br>+MachineSinking::GetAllSortedSuccessors(MachineInstr *MI,<br>+MachineBasicBlock *MBB) {<br>+<br>+  // Do we have the sorted successors in cache ?<br>+  auto Succs = AllSuccessors.find(MBB);  if (Succs !=<br>+ AllSuccessors.end())<br>+    return Succs->second;<br>+<br>+  SmallVector<MachineBasicBlock *, 4> AllSuccs(MBB->succ_begin(),<br>+                                               MBB->succ_end());<br>+<br>+  // Handle cases where sinking can happen but where the sink point<br>+ isn't a  // successor. For example:<br>+  //<br>+  //   x = computation<br>+  //   if () {} else {}<br>+  //   use x<br>+  //<br>+  const std::vector<MachineDomTreeNode *> &Children =<br>+    DT->getNode(MBB)->getChildren();  for (const auto &DTChild :<br>+ Children)<br>+    // DomTree children of MBB that have MBB as immediate dominator<o:p></o:p></p></blockquote><p class=MsoNormal>are added.<br><br><o:p></o:p></p><p class=MsoNormal>+    if (DTChild->getIDom()->getBlock() == MI->getParent() &&<br>+        // Skip MBBs already added to the AllSuccs vector above.<br>+        !MBB->isSuccessor(DTChild->getBlock()))<br>+      AllSuccs.push_back(DTChild->getBlock());<br>+<br>+  // Sort Successors according to their loop depth or block frequency<o:p></o:p></p><p class=MsoNormal>info.<br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>+  std::stable_sort(<br>+      AllSuccs.begin(), AllSuccs.end(),<br>+      [this](const MachineBasicBlock *L, const MachineBasicBlock *R) {<br>+        uint64_t LHSFreq = MBFI ? MBFI->getBlockFreq(L).getFrequency() :<o:p></o:p></p></blockquote><p class=MsoNormal>0;<br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>+        uint64_t RHSFreq = MBFI ? MBFI->getBlockFreq(R).getFrequency() :<o:p></o:p></p></blockquote><p class=MsoNormal>0;<br><br><o:p></o:p></p><p class=MsoNormal>+        bool HasBlockFreq = LHSFreq != 0 && RHSFreq != 0;<br>+        return HasBlockFreq ? LHSFreq < RHSFreq<br>+                            : LI->getLoopDepth(L) < LI->getLoopDepth(R);<br>+      });<br>+<br>+  auto it = AllSuccessors.insert(std::make_pair(MBB, AllSuccs));<br>+<br>+  return it.first->second;<br>+}<br>+<br>/// FindSuccToSinkTo - Find a successor to sink this instruction to.<br>MachineBasicBlock *MachineSinking::FindSuccToSinkTo(MachineInstr<o:p></o:p></p><p class=MsoNormal>*MI,<br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>                                  MachineBasicBlock *MBB, @@<br>-579,38<br>+634,7 @@ MachineBasicBlock *MachineSinking::FindS<br>     // we should sink to. If we have reliable block frequency information<br>     // (frequency != 0) available, give successors with smaller frequencies<br>     // higher priority, otherwise prioritize smaller loop depths.<br>-      SmallVector<MachineBasicBlock*, 4> Succs(MBB->succ_begin(),<br>-                                               MBB->succ_end());<br>-<br>-      // Handle cases where sinking can happen but where the sink point<o:p></o:p></p></blockquote><p class=MsoNormal>isn't a<br><br><o:p></o:p></p><p class=MsoNormal>-      // successor. For example:<br>-      //<br>-      //   x = computation<br>-      //   if () {} else {}<br>-      //   use x<br>-      //<br>-      const std::vector<MachineDomTreeNode *> &Children =<br>-        DT->getNode(MBB)->getChildren();<br>-      for (const auto &DTChild : Children)<br>-        // DomTree children of MBB that have MBB as immediate dominator<o:p></o:p></p><p class=MsoNormal>are added.<br><br><o:p></o:p></p><p class=MsoNormal>-        if (DTChild->getIDom()->getBlock() == MI->getParent() &&<br>-            // Skip MBBs already added to the Succs vector above.<br>-            !MBB->isSuccessor(DTChild->getBlock()))<br>-          Succs.push_back(DTChild->getBlock());<br>-<br>-      // Sort Successors according to their loop depth or block frequency<o:p></o:p></p><p class=MsoNormal>info.<br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>-      std::stable_sort(<br>-          Succs.begin(), Succs.end(),<br>-          [this](const MachineBasicBlock *L, const MachineBasicBlock *R) {<br>-            uint64_t LHSFreq = MBFI ? MBFI->getBlockFreq(L).getFrequency()<o:p></o:p></p></blockquote><p class=MsoNormal>:<br><br><o:p></o:p></p><p class=MsoNormal>0;<br><br><o:p></o:p></p><p class=MsoNormal>-            uint64_t RHSFreq = MBFI ? MBFI->getBlockFreq(R).getFrequency()<o:p></o:p></p><p class=MsoNormal>:<br><br><o:p></o:p></p><p class=MsoNormal>0;<br><br><o:p></o:p></p><p class=MsoNormal>-            bool HasBlockFreq = LHSFreq != 0 && RHSFreq != 0;<br>-            return HasBlockFreq ? LHSFreq < RHSFreq<br>-                                : LI->getLoopDepth(L) < LI->getLoopDepth(R);<br>-          });<br>-      for (SmallVectorImpl<MachineBasicBlock *>::iterator SI =<o:p></o:p></p><p class=MsoNormal>Succs.begin(),<br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>-             E = Succs.end(); SI != E; ++SI) {<br>-        MachineBasicBlock *SuccBlock = *SI;<br>+      for (MachineBasicBlock *SuccBlock :<br>+ GetAllSortedSuccessors(MI,<br>+ MBB)) {<br>       bool LocalUse = false;<br>       if (AllUsesDominatedByBlock(Reg, SuccBlock, MBB,<br>                                   BreakPHIEdge, LocalUse)) {<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><o:p></o:p></p></blockquote><p class=MsoNormal><br><br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><o:p></o:p></p><p class=MsoNormal><0001-MachineSink-Address-post-commit-review-comments.patch><o:p></o:p></p></div></div><p class=MsoNormal><o:p> </o:p></p></div></div></div></body></html>