<div dir="ltr">Dear Davide,<div><br></div><div>We noticed that C^3 will only be available for the upcoming versions of LLVM. I was wondering what it is like in LLVM 6.0.1?</div><div><br></div><div>Thank you so much!</div><div><br></div><div>Best regards,<br>Xiaowan</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 7, 2018 at 5:14 PM, Davide Italiano <span dir="ltr"><<a href="mailto:davide@freebsd.org" target="_blank">davide@freebsd.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Tue, Aug 7, 2018 at 11:53 AM Xiaowan Dong via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
> Hi,<br>
><br>
</span>> I would like to learn the details regarding what exactly PGO does for basic block layout/code placement optimizations in llvm. Could you please point me to some descriptions? Is it close to this paper (Karl Pettis and Robert C. Hansen. 1990. Profile guided code positioning.  PLDI'90) <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__perso.ensta-2Dparistech.fr_-7Ebmonsuez_Cours_B6-2D4_Articles_papers15.pdf-3F&d=DwIFaQ&c=kbmfwr1Yojg42sGEpaQh5ofMHBeTl9EI2eaqQZhHbOU&r=9lVsUv0m4rDQCgSupIkpgbizkVWsSr2-oDgbaUgY_C0&m=YPozo_Hjjg-5VCjvXCWDF1LsHc3pKWNWySkv3nXqSFc&s=Hbba3m9Gul1G8YndUAW1N9qQpS3nHs9DA7c0CJVNebg&e=" rel="noreferrer" target="_blank">https://urldefense.proofpoint.<wbr>com/v2/url?u=http-3A__perso.<wbr>ensta-2Dparistech.fr_-<wbr>7Ebmonsuez_Cours_B6-2D4_<wbr>Articles_papers15.pdf-3F&d=<wbr>DwIFaQ&c=<wbr>kbmfwr1Yojg42sGEpaQh5ofMHBeTl9<wbr>EI2eaqQZhHbOU&r=<wbr>9lVsUv0m4rDQCgSupIkpgbizkVWsSr<wbr>2-oDgbaUgY_C0&m=YPozo_Hjjg-<wbr>5VCjvXCWDF1LsHc3pKWNWySkv3nXqS<wbr>Fc&s=<wbr>Hbba3m9Gul1G8YndUAW1N9qQpS3nHs<wbr>9DA7c0CJVNebg&e=</a> Whether it is purely intra-procedural or include inter-procedural optimizations?<br>
><br>
> Thank you so much!<br>
><br>
<br>
lld implements C^3 which is basically a variation of Pettis-Hansen.<br>
The CGO 17 paper describes the approach with a great level of detail<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__research.fb.com_wp-2Dcontent_uploads_2017_01_cgo2017-2Dhfsort-2Dfinal1.pdf-3F&d=DwIFaQ&c=kbmfwr1Yojg42sGEpaQh5ofMHBeTl9EI2eaqQZhHbOU&r=9lVsUv0m4rDQCgSupIkpgbizkVWsSr2-oDgbaUgY_C0&m=YPozo_Hjjg-5VCjvXCWDF1LsHc3pKWNWySkv3nXqSFc&s=pIdMmcvpHh75XIH29J98lMchoSRMHF4PjYjsw5fWV2c&e=" rel="noreferrer" target="_blank">https://urldefense.proofpoint.<wbr>com/v2/url?u=https-3A__<wbr>research.fb.com_wp-2Dcontent_<wbr>uploads_2017_01_cgo2017-<wbr>2Dhfsort-2Dfinal1.pdf-3F&d=<wbr>DwIFaQ&c=<wbr>kbmfwr1Yojg42sGEpaQh5ofMHBeTl9<wbr>EI2eaqQZhHbOU&r=<wbr>9lVsUv0m4rDQCgSupIkpgbizkVWsSr<wbr>2-oDgbaUgY_C0&m=YPozo_Hjjg-<wbr>5VCjvXCWDF1LsHc3pKWNWySkv3nXqS<wbr>Fc&s=<wbr>pIdMmcvpHh75XIH29J98lMchoSRMHF<wbr>4PjYjsw5fWV2c&e=</a><br>
(the algorithm per-se is fairly straightforward).<br>
Pointers to the code at <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D36351&d=DwIFaQ&c=kbmfwr1Yojg42sGEpaQh5ofMHBeTl9EI2eaqQZhHbOU&r=9lVsUv0m4rDQCgSupIkpgbizkVWsSr2-oDgbaUgY_C0&m=YPozo_Hjjg-5VCjvXCWDF1LsHc3pKWNWySkv3nXqSFc&s=zyCFsKdWzhdEH2AAV0y8itEL3f3MCq_97koJeZEBsGY&e=" rel="noreferrer" target="_blank">https://urldefense.proofpoint.<wbr>com/v2/url?u=https-3A__<wbr>reviews.llvm.org_D36351&d=<wbr>DwIFaQ&c=<wbr>kbmfwr1Yojg42sGEpaQh5ofMHBeTl9<wbr>EI2eaqQZhHbOU&r=<wbr>9lVsUv0m4rDQCgSupIkpgbizkVWsSr<wbr>2-oDgbaUgY_C0&m=YPozo_Hjjg-<wbr>5VCjvXCWDF1LsHc3pKWNWySkv3nXqS<wbr>Fc&s=<wbr>zyCFsKdWzhdEH2AAV0y8itEL3f3MCq<wbr>_97koJeZEBsGY&e=</a><br>
You can also find the details in Michael's original RFC<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_pipermail_llvm-2Ddev_2017-2DJune_114178.html&d=DwIFaQ&c=kbmfwr1Yojg42sGEpaQh5ofMHBeTl9EI2eaqQZhHbOU&r=9lVsUv0m4rDQCgSupIkpgbizkVWsSr2-oDgbaUgY_C0&m=YPozo_Hjjg-5VCjvXCWDF1LsHc3pKWNWySkv3nXqSFc&s=DGrA_unYXo8wrHhtd-cK2GiyQOfsYqvIz016-wcV4iU&e=" rel="noreferrer" target="_blank">https://urldefense.proofpoint.<wbr>com/v2/url?u=http-3A__lists.<wbr>llvm.org_pipermail_llvm-2Ddev_<wbr>2017-2DJune_114178.html&d=<wbr>DwIFaQ&c=<wbr>kbmfwr1Yojg42sGEpaQh5ofMHBeTl9<wbr>EI2eaqQZhHbOU&r=<wbr>9lVsUv0m4rDQCgSupIkpgbizkVWsSr<wbr>2-oDgbaUgY_C0&m=YPozo_Hjjg-<wbr>5VCjvXCWDF1LsHc3pKWNWySkv3nXqS<wbr>Fc&s=DGrA_unYXo8wrHhtd-<wbr>cK2GiyQOfsYqvIz016-wcV4iU&e=</a><br>
<br>
There's also a pass in the backend (codegen) to perform profile-driven<br>
Machine BB placement (CodeGen/<wbr>MachineBlockPlacement.cpp).<br>
<br>
--<br>
Davide<br>
</blockquote></div><br></div>