<div dir="ltr">[RFC] Add "hot" function attribute to LLVM IR and use hot/cold attribute<div>in function section prefix<br>  <br>__attribute__((hot)) and __attribute__((cold)) are supported in Clang.<br>Only the "cold" attribute is passed down to LLVM IR. "hot" attribute is<br>silently dropped by Clang, as currently only have cold function attribute<br>in LLVM IR.<br><br>These two attributes are not documented in clang reference manual:<br><a href="https://clang.llvm.org/docs/AttributeReference.html">https://clang.llvm.org/docs/AttributeReference.html</a><br>They are here mainly for gcc-compatibility:<br><a href="https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html">https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html</a><br><br>We propose to add a "hot" function attribute to LLVM IR. Like the "cold"<br>function attribute, "hot" attribute can be used in optimization passes.<br><br>The immediate usage we are having is to set the function section prefix/suffix.<br>Currently ".hot" and ".unlikely" suffix only are added in PGO (or Sample PGO)<br>compilation (through isFunctionHotInCallGraph and isFunctionColdInCallGraph).<br><br>With the hot/cold function attribute, the new behavior is:<br>(1) If the user annotates a function as hot or isFunctionHotInCallGraph<br>is true, this function will be marked as hot.<br>(2) If the user annotates a function as cold or isFunctionColdInCallGraph<br>is true, this function will be marked as cold.<br><br>The changes are:<br>(1) user annotation will be used in setting function section prefix/suffix.<br>(2) hot attribute overwrites profile count based hotness.<br>(3) profile count based hotness overwrite user annotated cold attribute.<br><br>The intention for these changes is to provide the user a way to mark<br>certain functions as hot in cases where training input is hard to cover all<br>the hot functions.<br><br>Note that with this change, the attributes will have a different semantic<br>from GCC, where PGO profile hotness always has precedence over the function<br>attribute annotation.<br><br>Currently the cold function attribute is also set in PGO use pass. The code is before isFunctionColdInCallGraph and does not use PSI.  We might want to change that code</div><div>to make this attribute as user-annotation only.<br></div><div><br></div><div>Comments and feedback are welcome. The patch for this RFC is:</div><div><a href="https://reviews.llvm.org/D92493">https://reviews.llvm.org/D92493</a><br></div><div><br></div><div>Thanks,</div><div><br></div><div>-Rong</div></div>