<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:47 PM, Hal Finkel via
cfe-dev wrote:<br>
</div>
<blockquote cite="mid:1d02ce67-a5c5-0e2f-7f82-381e93b3ca5c@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: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 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>
<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 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>