<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>