<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=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Monaco;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        line-height:125%;
        font-size:10.0pt;
        font-family:"Courier New";}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
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="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">I don’t think there is currently any way to disable an arbitrary transformation for an arbitrary block of code, it may be possible to implement something like that though.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">You may be able to mark variables volatile to prevent certain transformations for those variables.<o:p></o:p></p>
<p class="MsoNormal">Another way is to insert something like this before and after a block of code to prevent optimizations.<o:p></o:p></p>
<p class="MsoNormal" style="line-height:125%;background:white"><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:black">    __asm__
</span><b><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:#0066BB">volatile</span></b><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:black">(</span><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:#DD2200;background:#FFF0F0">""</span><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:black">
 : : : </span><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:#DD2200;background:#FFF0F0">"memory"</span><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:black">);</span><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New""><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:125%;background:white"><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:black">Or</span><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New""><o:p></o:p></span></p>
<pre style="background:white"><span style="color:black">    __asm__ </span><b><span style="color:#0066BB">volatile</span></b><span style="color:black">(</span><span style="color:#DD2200;background:#FFF0F0">""</span><span style="color:black"> : : </span><span style="color:#DD2200;background:#FFF0F0">"g"</span><span style="color:black">(pointer) : </span><span style="color:#DD2200;background:#FFF0F0">"memory"</span><span style="color:black">);</span><o:p></o:p></pre>
<p class="MsoNormal" style="line-height:125%;background:white"><span style="color:black">You can try to experiment and see if it works for you.</span><o:p></o:p></p>
<p class="MsoNormal" style="line-height:125%;background:white"><o:p> </o:p></p>
<p class="MsoNormal" style="line-height:125%;background:white"><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:black">--</span><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New""><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:125%;background:white"><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New";color:black">Usman</span><span style="font-size:10.0pt;line-height:125%;font-family:"Courier New""><o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> llvm-dev <llvm-dev-bounces@lists.llvm.org> <b>On Behalf Of
</b>Noor, Abdul Rafae via llvm-dev<br>
<b>Sent:</b> Monday, October 4, 2021 3:24 PM<br>
<b>To:</b> llvm-dev@lists.llvm.org<br>
<b>Subject:</b> [llvm-dev] Disabling optimizations in clang/llvm for specified regions in code<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p align="center" style="text-align:center"><strong><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black;background:yellow">WARNING:</span></strong><span style="font-size:10.5pt;font-family:"Arial",sans-serif;color:black;background:yellow">
 This email originated from outside of Qualcomm. Please be wary of any links or attachments, and do not enable macros.</span><o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB">Hello,</span><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;mso-fareast-language:EN-GB"><br>
<span style="background:#F8F8F8">I wanted to inquire if there is a way within LLVM/Clang to limit (function-level) optimizations to certain contiguous regions within the function. E.g.</span></span><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">void foo(int* A, int n1, int n2){<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">        
</span><span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">// Enable optimizations above this loop<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">         ...<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">        
</span><span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">// (#pragma clang loop nolicm?)<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">         for(int i = 0; i < n1; ++i){<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">                 for(int j=0; j< n2; j++){<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">                          int i_offset = (n2*i); // Do not Hoist</span><span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB"> to outside
 current loop<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">                          int net_offset = i_offset + j;<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">                          A[net_offset] = ...;<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">                 }       
<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">         }<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">        
</span><span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">// Enable optimizations below this loop</span><span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">         ...<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:3.0pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in">
<span style="font-size:9.0pt;font-family:Monaco;color:#1D1C1D;mso-fareast-language:EN-GB">}<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB">In the above case, would it be possible to disable Loop Invariant Code motion just for that loop nest in the function
 foo, but enable it to be used elsewhere in the function? We would like to disable certain passes like LICM for our use-case</span><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB"> (We’ve
 defined markers inside the functions specifying the start and end of certain regions and we want to limit certain optimizations as we will be extracting those code regions later on)</span><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB">.
</span><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB">The clang pragma at
<a href="https://bcain-llvm.readthedocs.io/projects/clang/en/latest/LanguageExtensions/#id20">
https://bcain-llvm.readthedocs.io/projects/clang/en/latest/LanguageExtensions/#id20</a> acts at a per function level. Similarly the loop optimizations pragmas
<a href="https://clang.llvm.org/docs/LanguageExtensions.html#id30">https://clang.llvm.org/docs/LanguageExtensions.html#id30</a> only cover some of the loop specific metadata’s available in LLVM (For example, I wasn’t able to find a way to add ‘llvm.licm.disable’
 to loops at the source level). <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB">Thank you,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB">Abdul Rafae Noor<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB">Grad Student,
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#1D1C1D;background:#F8F8F8;mso-fareast-language:EN-GB">University of Illinois, Urbana Champaign</span><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>