<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 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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@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="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">> How will inttoptr work with the new restrict patches?  Certainly the int2ptr capturing shouldn't nullify the restrict qualifier.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The full restrict patches see through 'inttoptr(ptrtoint( x ) )', Besides that, the analysis stops at 'ptr2int(x)' and 'anything can happen'.<o:p></o:p></p>
<p class="MsoNormal">Because of this, all other 'inttoptr' usages will never introduce a restrict provenance.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(aka, a restrict pointer converted to an int + some computations and then converted back to a pointer will normally not retain the 'restrictness' and that can trigger undefined behavior)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Greetings,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Jeroen Dobbelaere<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></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 #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b>From:</b> Ryan Taylor <ryta1203@gmail.com> <br>
<b>Sent:</b> Thursday, February 18, 2021 18:31<br>
<b>To:</b> Johannes Doerfert <johannesdoerfert@gmail.com><br>
<b>Cc:</b> llvm-dev <llvm-dev@lists.llvm.org>; Jeroen Dobbelaere <dobbel@synopsys.com>; Juneyoung Lee <juneyoung.lee@sf.snu.ac.kr>; Philip Reames <listmail@philipreames.com><br>
<b>Subject:</b> Re: [llvm-dev] inttoptr->add->ptrtoint capturing pointer?<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Juneyoung said he hadn't started working on it yet, so I'm going to take a look at it also.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">How will inttoptr work with the new restrict patches?  Certainly the int2ptr capturing shouldn't nullify the restrict qualifier.<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"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Thu, Feb 18, 2021 at 12:04 PM Johannes Doerfert <<a href="mailto:johannesdoerfert@gmail.com" target="_blank">johannesdoerfert@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<p class="MsoNormal">I think you are working with a custom llvm here but I will<br>
make a few general statements that might help:<br>
<br>
- The noalias intrinsic as you've shown it captures, unfortunately.<br>
   We don't have the `nocapture_maybe_returned` attribute in IR yet that <br>
the Attributor uses for these situations,<br>
   IIRC, Juneyoung is working on making it an LLVM-IR enum attribute <br>
already.<br>
<br>
- int2ptr is assumed to capture in basically every analysis I've seen. <br>
It doesn't intrinsically but it is really<br>
   hard to get it right. That said, we could allow *very* special <br>
patterns but I would argue those should be recognized<br>
   in instcombine and replaced there.<br>
<br>
- Philip and I are working to define capture better for the lang ref, we <br>
might want to include some examples and<br>
   rational around int2ptr when we have a coherent model.<br>
<br>
I've CC'ed people that might correct me or augment my answer, hope this <br>
helps :)<br>
<br>
~ Johannes<br>
<br>
<br>
On 2/18/21 9:17 AM, Ryan Taylor via llvm-dev wrote:<br>
> I have an example:<br>
><br>
> foo(float * restrict y, int off1, int off2) {<br>
>    float * restrict x;<br>
>    for (..) {<br>
>      for (..) {<br>
>        x = y+off1;<br>
>      }<br>
>      x = (const float *)((int)x+off2))<br>
><br>
> I'm not sure why this should be capturing the pointer?<br>
><br>
> For instance, looking at scoped noalias dbg info:<br>
><br>
> SNA: Capture check for B/CSB UO:   %54 = inttoptr i32 %add83 to float*,<br>
> !dbg !101<br>
> SNA: Pointer   %1 = call float* @llvm.noalias.p0_float(float* %0, metadata<br>
> !38), !dbg !41 might be captured!<br>
><br>
> Is this implying that the noalias intrinsic might be capturing the pointer?<br>
> It doesn't look like "noalias" intrinsic has NoCapture property on the<br>
> pointer:<br>
><br>
> def int_noalias       : Intrinsic<[llvm_anyptr_ty],<br>
>                                    [LLVMMatchType<0>, llvm_metadata_ty],<br>
>                                    [IntrArgMemOnly, Returned<0>]>;<br>
><br>
> It should though right? From the definition of capture it is returning the<br>
> pointer; however, we know nothing is happening here.<br>
><br>
> I'm on llvm 10 with Hal's restrict patches.<br>
><br>
> Thanks.<br>
><br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
> <a href="https://urldefense.com/v3/__https:/lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev__;!!A4F2R9G_pg!Pm5BQtdh_gU6pe-WvhApIs2FOjI1V7vJDj6H93m0sNUItsa5T6CbzW5JL1cixruSF_kY7ywW$" target="_blank">
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><o:p></o:p></p>
</blockquote>
</div>
</div>
</div>
</body>
</html>