<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>