<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:09 PM, Hubert Tong
      wrote:<br>
    </div>
    <blockquote
cite="mid:CACvkUqb2=cgKM5HOhZuz6mgSw+FEu8h_5Xy=V_PsPce+sMJTEg@mail.gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <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, 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></body></html>