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