<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jul 7, 2015 at 4:13 PM, Xinliang David Li <span dir="ltr"><<a href="mailto:davidxl@google.com" target="_blank">davidxl@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, Jul 7, 2015 at 4:00 PM, Cong Hou <<a href="mailto:congh@google.com">congh@google.com</a>> wrote:<br>
> On Tue, Jul 7, 2015 at 3:35 PM, Xinliang David Li <<a href="mailto:davidxl@google.com">davidxl@google.com</a>><br>
> wrote:<br>
>><br>
>> The already rotated inner loop needs to be treated as a single node<br>
>> when participating in parent loop's rotation, otherwise it may end up<br>
>> with wasting compile time and a suboptimal solution.<br>
>><br>
>> Consider the loop nest:<br>
>><br>
>> Entry<br>
>> do { // outer loop<br>
>><br>
>>  B0<br>
>>  if (...) {<br>
>>   do {    // inner loop<br>
>>     B1<br>
>>     if (..) {<br>
>>      B2<br>
>>     } else {<br>
>>      B3<br>
>>     }<br>
>>     B4<br>
>>   } while (..);  // inner loop<br>
>>  }<br>
>> else {<br>
>>   B6<br>
>> }<br>
>> B5;<br>
>> } while (...); // outer loop<br>
>><br>
>> B7<br>
>><br>
>><br>
>> The optimal inner loop layout is B3 B4 B1 B2;<br>
>> The original outloop layout is :   B0 B6 (B3 B4 B1 B2) B5<br>
>><br>
>> The optimal rotation of the outer loop should produce:    (B3 B4 B1<br>
>> B2) B5 B0 B6, with the final layout be:<br>
>><br>
>> Entry ((B3 B4 B1 B2) B5 B0 B6) B7<br>
>><br>
>> However the current algorithm may produce  Entry (B5 B0 B6 (B3 B4 B1<br>
>> B2)) B7  because it will have the same cost as the the optimal one.<br>
>> The problem is that cost analysis needs to consider the edge from<br>
>> inside of the inner loop to the top of the outer loop chain -- in the<br>
>> bad solution, there is an edge from B4 to B5 whose cost should be<br>
>> considered as part-3 cost.<br>
><br>
><br>
> Why the layout  Entry (B5 B0 B6 (B3 B4 B1B2)) B7 is worse than Entry ((B3 B4<br>
> B1 B2) B5 B0 B6) B7? In both cases, the inner loop chain is not split and is<br>
> treated as a single node.<br>
><br>
<br>
</div></div>It matters when the outer loop is hot and the inner loop has<br>
relatively small trip count.<br>
<span class=""><br>
> The edge from B4 to B5 is relatively cold comparing to edges in the inner<br>
> loop. It won't be a fall-through as B4 is not the tail of the inner loop<br>
> chain.<br>
<br>
</span>That is true, but treating B4 to B5 as a 'fall through' also enables<br>
the layout such that layout in both paths of the outer loop are more<br>
compact. In the suboptimal case, B6 is sitting in the middle of B5 and<br>
 B0 which has lower cache utilization.<br></blockquote><div><br></div><div>In the suboptimal case, B6 is not in the middle of B5 and B0. I guess you mean B5 B0 B6 are separated from B7? So it is better to put B5 B0 B6 B7 together? But how about Entry? If we treat Entry the same as B7, there is still no significant difference between the two layouts shown above.</div><div><br></div><div>If the inner loop is very cold (like < 20%), we need to take it out from the outer loop chain. I will tackle this issue in the coming patch.</div><div><br></div><div><br></div><div>Cong</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Given that the optimal outer loop layout does not actually reduce the<br>
branch cost (but only icache reuse), I am fine leaving the<br>
implementation as is assuming making it optimal requires a lot of<br>
effort. I will be more comfortable if a loop nest example is added as<br>
a test.<br>
<span class="HOEnZb"><font color="#888888"><br>
David<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
><br>
><br>
> Cong<br>
><br>
><br>
>><br>
>><br>
>> David<br>
>><br>
>><br>
>><br>
>><br>
>><br>
>> On Mon, Jul 6, 2015 at 10:22 AM, Cong Hou <<a href="mailto:congh@google.com">congh@google.com</a>> wrote:<br>
>> > When the outer loop is rotated, the inner loop is already linked to<br>
>> > other<br>
>> > CFG nodes in the outer loop. So I think we won't have to adjust the<br>
>> > current<br>
>> > algorithm as we have already considered all costs the rotation may bring<br>
>> > or<br>
>> > reduce.<br>
>> ><br>
>> ><br>
>> > thanks,<br>
>> > Cong<br>
>> ><br>
>> > On Mon, Jul 6, 2015 at 9:57 AM, Xinliang David Li <<a href="mailto:xinliangli@gmail.com">xinliangli@gmail.com</a>><br>
>> > wrote:<br>
>> >><br>
>> >> Does the cost analysis work well for loop nest? After the inner loop<br>
>> >> chain<br>
>> >> is formed and rotated, it will be later be merged into the parent loop<br>
>> >> chain. The cost analysis for the parent loop may need to be adjusted to<br>
>> >> consider the inner loops that are already rotated.<br>
>> >><br>
>> >> David<br>
>> >><br>
>> >> On Tue, Jun 30, 2015 at 2:29 PM, Cong Hou <<a href="mailto:congh@google.com">congh@google.com</a>> wrote:<br>
>> >>><br>
>> >>> Update the patch by adding two opt parameters that define the cost of<br>
>> >>> misfetch and jump instruction, and use them when rotating loops.<br>
>> >>><br>
>> >>><br>
>> >>> <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D10717&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=AorbMri5vOKaGyoVF1O8VRd7XRGXwDywA2nk_e4bdGQ&s=DPUowZyXconlJQIChmbBZioHc_wpflbBUx8Och_tYIA&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D10717</a><br>
>> >>><br>
>> >>> Files:<br>
>> >>>   lib/CodeGen/MachineBlockPlacement.cpp<br>
>> >>>   test/CodeGen/X86/code_placement_loop_rotation.ll<br>
>> >>><br>
>> >>> EMAIL PREFERENCES<br>
>> >>>   <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_settings_panel_emailpreferences_&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=AorbMri5vOKaGyoVF1O8VRd7XRGXwDywA2nk_e4bdGQ&s=-IlwH7lBU3rOb8pGS8bW3Xkr5dfjiqaGJKnDkhdYh6k&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/settings/panel/emailpreferences/</a><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" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
>> >>><br>
>> >><br>
>> ><br>
><br>
><br>
</div></div></blockquote></div><br></div></div>