<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p><br>
</p>
<div class="moz-cite-prefix">On 12/06/2017 05:53 PM, Hal Finkel via
cfe-dev wrote:<br>
</div>
<blockquote cite="mid:3dd8814a-cd7d-2ba3-56b2-58940826144e@anl.gov"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<p><br>
</p>
<div class="moz-cite-prefix">On 12/06/2017 05:47 PM, Hal Finkel
via cfe-dev wrote:<br>
</div>
<blockquote
cite="mid:1d02ce67-a5c5-0e2f-7f82-381e93b3ca5c@anl.gov"
type="cite">
<p><br>
</p>
<div class="moz-cite-prefix">On 12/06/2017 05:09 PM, Hubert Tong
wrote:<br>
</div>
<blockquote
cite="mid:CACvkUqb2=cgKM5HOhZuz6mgSw+FEu8h_5Xy=V_PsPce+sMJTEg@mail.gmail.com"
type="cite">
<div dir="ltr">
<div>
<div>I am not sure that there is a requirement that *this
remains a valid object.<br>
</div>
</div>
</div>
</blockquote>
<br>
I don't think that there is, and, IIRC, we already have an open
bug about this (the same applies to reference arguments, for
which we also apply the dereferenceable attribute). The problem,
as Nick Lewycky pointed out a some time ago,</blockquote>
<br>
For the record, here:
<a moz-do-not-send="true" class="moz-txt-link-freetext"
href="http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20150202/257887.html">http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20150202/257887.html</a><br>
</blockquote>
<br>
Oh, and my hope is that the only thing we need to do to fix this
without too many performance regressions is to add some parameter
attribute, not_freed or similar, and have FunctionAttrs do bottom-up
inference on it.<br>
<br>
-Hal <br>
<br>
<blockquote cite="mid:3dd8814a-cd7d-2ba3-56b2-58940826144e@anl.gov"
type="cite"> <br>
-Hal<br>
<br>
<blockquote
cite="mid:1d02ce67-a5c5-0e2f-7f82-381e93b3ca5c@anl.gov"
type="cite"> is that just because a pointer is dereferenceable
upon entry to the function, doesn't mean that it always will
remain so.<br>
<br>
I agree that we should fix this at some point, but it's an
orthogonal issue.<br>
<br>
-Hal<br>
<br>
<blockquote
cite="mid:CACvkUqb2=cgKM5HOhZuz6mgSw+FEu8h_5Xy=V_PsPce+sMJTEg@mail.gmail.com"
type="cite">
<div dir="ltr">
<div>Experimenting with the -O3 behaviour of the following
program (with a powerpc64le-unknown-linux-gnu target), it
seems the dereferenceable attribute is scope based?<br>
<br>
int a[1], b[1], *cp;<br>
void dobadstuff() { delete cp; }<br>
<br>
__attribute__((__noinline__))<br>
void foo(int * __restrict__ a, int * __restrict__ b, int
&c, int n) {<br>
dobadstuff();<br>
for (int i = 0; i < n; ++i)<br>
if (a[i] > 0)<br>
a[i] = c * b[i];<br>
}<br>
<br>
int main(void) {<br>
cp = new int;<br>
foo(a, b, *cp, 1);<br>
}<br>
<br>
</div>
Valgrind reports an invalid read.<br>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Dec 6, 2017 at 8:06 AM, Hal
Finkel via cfe-dev <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><span class="">
<p><br>
</p>
<div class="m_3987557004598263729moz-cite-prefix">On
12/05/2017 01:47 PM, Lei Huang via cfe-dev wrote:<br>
</div>
<blockquote type="cite">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div dir="ltr"> </div>
<div dir="ltr"><font style="outline:none"
size="3" face="Arial">Hello,</font><br
style="outline:none;font-family:"Helvetica
Neue",Helvetica,Arial,"Lucida
Grande",sans-serif;font-size:12px">
<font style="outline:none" size="3"
face="Arial"> </font><br>
<font style="outline:none" size="3"
face="Arial">In the discussion on bugzilla
30729, it is mentioned that the <span>'</span></font><span><font
style="outline:none" size="3">this'</font></span><font
style="outline:none" size="3" face="Arial"> pointer
needs to be valid upon entry to a
non-static method. Does the standard
guarantee </font><font
style="outline:none" size="3"
face="Courier">this</font><font
style="outline:none" size="3" face="Arial"> is
non-null on entry?</font></div>
</div>
</div>
</blockquote>
<br>
</span> Yes. You have to call a non-static member
function on a valid object.<span class=""><br>
<br>
<blockquote type="cite">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div dir="ltr"><font style="outline:none"
size="3" face="Arial"> If so, is there a
reason we can't use that fact to mark '</font><font
style="outline:none" size="3"
face="Courier New">this'</font><font
style="outline:none" size="3" face="Arial"> as
'</font><font style="outline:none"
size="3" face="Courier New">dereferenceable(sizeof(*this)<wbr>)'</font><font
style="outline:none" size="3" face="Arial">?</font><br>
</div>
</div>
</div>
</blockquote>
<br>
</span> Yes, this seems like a good idea.<br>
<br>
-Hal<br>
<br>
<blockquote type="cite">
<div>
<div class="h5">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div dir="ltr"><font style="outline:none"
size="3" face="Arial"> </font><br
style="outline:none;font-family:"Helvetica
Neue",Helvetica,Arial,"Lucida
Grande",sans-serif;font-size:12px">
<font style="outline:none" size="3"
face="Arial">There are LICM
optimizations we can do based on the
knowledge that '</font><font
style="outline:none" size="3"
face="Courier New">this' </font><font
style="outline:none" size="3"
face="Arial">is non-null on entry to a
non-static member function. </font><br>
<font style="outline:none" size="3"
face="Arial"> </font><br>
<font style="outline:none" size="3"
face="Arial">eg. For the following IR,
the two highlighted loads are not being
hoisted out of the for loop because we
are not able to guarantee that the
pointer is non-null. If the '</font><font
style="outline:none" size="3"
face="Courier New">this</font><font
style="outline:none" size="3"
face="Arial">' pointer is guaranteed to
be non-null on entry and we mark it
thus, then the 2 loads within the
for-loop body can then be hoisted out
into the loop preheader.</font><br>
<font style="outline:none" size="3"
face="Arial"> </font><br>
<font style="outline:none" size="3"
face="Arial">This is of course just one
example of an optimization we could
perform based on this knowledge, but
there are probably a number of others
(i.e. anything that relies on a pointer
being '</font><font style="outline:none"
size="3" face="Courier New">dereferenceable(N)'</font><font
style="outline:none" size="3"
face="Arial">).</font><br>
<font style="outline:none" size="3"
face="Arial"> </font><br>
<b><font style="outline:none" size="3"
face="Courier New">$ cat a.ll</font></b><br>
<font style="outline:none" size="3"
face="Courier New">target datalayout =
"e-m:e-i64:64-n32:64"<br
style="outline:none">
target triple =
"powerpc64le-unknown-linux-<wbr>gnu"</font><br>
<font style="outline:none" size="3"
face="Courier New">%struct.S = type {
<4 x i32>, <4 x i32> }</font><br>
<font style="outline:none" size="3"
face="Courier New">; Function Attrs:
norecurse nounwind readonly<br
style="outline:none">
define <4 x i32> @_<wbr>ZNK1S20constShouldBeHoistedEmD<wbr>v4_i(%struct.S*
nocapture readonly %this, i64 %n, <4
x<br style="outline:none">
i32> %x) align 2 {<br
style="outline:none">
entry:<br style="outline:none">
%tobool9 = icmp eq i64 %n, 0<br
style="outline:none">
br i1 %tobool9, label %for.end, label %<a
moz-do-not-send="true"
href="http://for.body.lr.ph"
target="_blank">for.body.lr.ph</a></font><br>
<font style="outline:none" size="3"
face="Courier New"><a
moz-do-not-send="true"
href="http://for.body.lr.ph"
target="_blank">for.body.lr.ph</a>:
; preds
= %entry<br style="outline:none">
%k1 = getelementptr inbounds %struct.S,
%struct.S* %this, i64 0, i32 0<br
style="outline:none">
%k2 = getelementptr inbounds %struct.S,
%struct.S* %this, i64 0, i32 1<br
style="outline:none">
br label %for.body</font><br
style="outline:none;font-family:"Helvetica
Neue",Helvetica,Arial,"Lucida
Grande",sans-serif;font-size:12px">
<font style="outline:none" size="3"
face="Courier New">for.body:
; preds = %<a
moz-do-not-send="true"
href="http://for.body.lr.ph"
target="_blank">for.body.lr.ph</a>,
%if.end<br style="outline:none">
%n.addr.011 = phi i64 [ %n, %<a
moz-do-not-send="true"
href="http://for.body.lr.ph"
target="_blank">for.body.lr.ph</a> ],
[ %div, %if.end ]<br
style="outline:none">
%x.addr.010 = phi <4 x i32> [ %x,
%<a moz-do-not-send="true"
href="http://for.body.lr.ph"
target="_blank">for.body.lr.ph</a> ],
[ %x.addr.1, %if.end ]<br
style="outline:none">
%rem = and i64 %n.addr.011, 15<br
style="outline:none">
%cmp = icmp eq i64 %rem, 0<br
style="outline:none">
br i1 %cmp, label %if.end, label
%if.then</font><br>
<font style="outline:none" size="3"
face="Courier New">if.then:
; preds =
%for.body<br style="outline:none">
</font><b><font style="outline:none"
size="3" face="Courier New">%0 = load
<4 x i32>, <4 x i32>* %k1,
align 16</font></b><br
style="outline:none">
<font style="outline:none" size="3"
face="Courier New"> %add = add <4 x
i32> %0, %x.addr.010<br
style="outline:none">
</font><b><font style="outline:none"
size="3" face="Courier New">%1 = load
<4 x i32>, <4 x i32>* %k2,
align 16</font></b><br
style="outline:none">
<font style="outline:none" size="3"
face="Courier New"> %xor = xor <4 x
i32> %add, %1<br style="outline:none">
br label %if.end</font><br
style="outline:none;font-family:"Helvetica
Neue",Helvetica,Arial,"Lucida
Grande",sans-serif;font-size:12px">
<font style="outline:none" size="3"
face="Courier New">if.end:
; preds =
%for.body, %if.then<br
style="outline:none">
%x.addr.1 = phi <4 x i32> [ %xor,
%if.then ], [ %x.addr.010, %for.body ]<br
style="outline:none">
%div = lshr i64 %n.addr.011, 4<br
style="outline:none">
%tobool = icmp eq i64 %div, 0<br
style="outline:none">
br i1 %tobool, label %for.end, label
%for.body</font><br>
<font style="outline:none" size="3"
face="Courier New">for.end:
; preds =
%if.end, %entry<br style="outline:none">
%x.addr.0.lcssa = phi <4 x i32> [
%x, %entry ], [ %x.addr.1, %if.end ]<br
style="outline:none">
ret <4 x i32> %x.addr.0.lcssa<br
style="outline:none">
}</font><br>
<font style="outline:none" size="3"
face="Arial"> </font></div>
<div dir="ltr"> </div>
<div dir="ltr">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div
class="m_3987557004598263729socmaildefaultfont"
dir="ltr"
style="font-family:Arial,Helvetica,sans-serif;font-size:10.5pt">
<div dir="ltr"><br>
Regards,<br>
Lei Huang</div>
<div dir="ltr"> </div>
<div dir="ltr"> </div>
<div dir="ltr">LLVM Development on
POWER</div>
<div dir="ltr">Internal mail:
C2/YGK/8200/MKM<br>
Phone: <a moz-do-not-send="true"
href="tel:%28905%29%20413-4419"
value="+19054134419"
target="_blank">(905) 413-4419</a><br>
TieLine: 969-4419<br>
E-mail: <a moz-do-not-send="true"
class="m_3987557004598263729moz-txt-link-abbreviated"
href="mailto:lei@ca.ibm.com"
target="_blank">lei@ca.ibm.com</a></div>
</div>
</div>
</div>
</div>
</div>
</div>
<br>
<br>
<fieldset
class="m_3987557004598263729mimeAttachmentHeader"></fieldset>
<br>
</div>
</div>
<pre>______________________________<wbr>_________________
cfe-dev mailing list
<a moz-do-not-send="true" class="m_3987557004598263729moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>
<a moz-do-not-send="true" class="m_3987557004598263729moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><span class="HOEnZb"><font color="#888888">
</font></span></pre><span class="HOEnZb"><font color="#888888">
</font></span></blockquote><span class="HOEnZb"><font color="#888888">
<pre class="m_3987557004598263729moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
</font></span></div>
______________________________<wbr>_________________
cfe-dev mailing list
<a moz-do-not-send="true" href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>
<a moz-do-not-send="true" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a>
</blockquote></div>
</div>
</blockquote>
<pre class="moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre wrap="">_______________________________________________
cfe-dev mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
</blockquote>
<pre class="moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre wrap="">_______________________________________________
cfe-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
</blockquote>
<pre class="moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre></body></html>