<div dir="ltr"><div><div><div><div><div>Still thanks John.<br><br></div>Another example is that <br><br>int a;<br><br>int main(){<br>return 5+(long)(&a);<br>}<br><br></div>In O0 mode, IR is like blow<br><br>@a = global i32 0, align 4<br><br>; Function Attrs: noinline norecurse nounwind<br>define signext i32 @main() #0 {<br>  %1 = alloca i32, align 4<br>  store i32 0, i32* %1, align 4<br>  ret i32 trunc (i64 add (i64 ptrtoint (i32* @a to i64), i64 5) to i32)<br>}<br><br></div>In O2 mode, IR is optimized as blow.<br>@a = global i32 0, align 4<br><br>; Function Attrs: norecurse nounwind readnone<br>define signext i32 @main() local_unnamed_addr #0 {<br>  ret i32 trunc (i64 add (i64 ptrtoint (i32* @a to i64), i64 5) to i32)<br>}<br><br></div>I mean what's the advantage of that pattern with constantexpr since it is introduced in O2 mode?<br> How does back end handle this pattern (which is a bitcast operator in my last case in email before)?<br><br></div>Thanks.<br><div><div><div><div><div><br></div></div></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-03-11 0:32 GMT+08:00 John Criswell <span dir="ltr"><<a href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span>:<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="">
    <div class="m_-5294476307183461368moz-cite-prefix">On 3/9/17 11:28 PM, Zeson Wu wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">
        <div>
          <div>OK. Could you give a specific example to illustrate what
            you are talking about and some comparison would be better.<br>
            <br>
            Here is a example of ConstantExpr of BitCast.<br>
            <br>
            target datalayout = "e-m:e-i64:64-n32:64"<br>
            target triple = "powerpc64le-unknown-linux-<wbr>gnu"<br>
            <br>
            ; Function Attrs: norecurse<br>
            define signext i32 @main() local_unnamed_addr #0 {<br>
            entry:<br>
              %call = tail call signext i32 @f([4 x i128] [i128 0, i128
            undef, i128 133444065919155497391149713024<wbr>1, i128 undef], [1
            x i128] [i128 bitcast (<16 x i8> <i8 2, i8 2, i8 2,
            i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2,
            i8 2, i8 2, i8 2> to i128)], i32 signext 16)<br>
              ret i32 %call<br>
            }<br>
            <br>
            <br>
            declare signext i32 @f([4 x i128], [1 x i128], i32 signext)
            local_unnamed_addr #1<br>
            <br>
          </div>
          I am thinking about why the result of bitcast is not computed
          directly after O2 optimization. What is the backend supposed
          to handle this constantexpr? Is there any advantage to do
          this?<br>
        </div>
      </div>
    </blockquote>
    <br></span>
    The bitcast exists because the LLVM IR has type information; when
    you bitcast a constant from one type to another, its value doesn't
    change, but its static type does.  It's essentially a way of
    expressing the same constant but with a different static type.<br>
    <br>
    Also, please keep conversations on the list instead of emailing me
    directly.  That way, others can benefit from the conversation and
    can chime in if needed.<br>
    <br>
    Regards,<br>
    <br>
    John Criswell<div><div class="h5"><br>
    <blockquote type="cite">
      <div dir="ltr"><br>
        <div>
          <div class="gmail_extra"><br>
            <div class="gmail_quote">2017-03-09 22:39 GMT+08:00 John
              Criswell <span dir="ltr"><<a href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span>:<br>
              <blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">
                <div bgcolor="#FFFFFF"><span class="m_-5294476307183461368gmail-">
                    <div class="m_-5294476307183461368gmail-m_3227547216749959667moz-cite-prefix">On
                      3/9/17 8:28 AM, Zeson Wu via llvm-dev wrote:<br>
                    </div>
                    <blockquote type="cite">
                      <div dir="ltr">Hi, All.
                        <div><br>
                        </div>
                        <div>Does anybody know about ConstantExpr in
                          llvm? What's it?</div>
                        <div>Since it always appears after llvm
                          optimization such as -O2 level, what is it
                          supposed to be to codegen? I am wondering it
                          represents constant value which can be
                          determined or computed at
                          compile-time(actually is link-time) to improve
                          performance. Although we do not know the
                          actual constant value util the object file is
                          linked.<br>
                        </div>
                      </div>
                    </blockquote>
                    <br>
                  </span> You're pretty much got it.  A Constant
                  Expression (ConstantExpr) is simply a constant value. 
                  Since some constant values depend upon
                  architecture-dependent features (e.g., structure
                  layout, pointer size, etc.), LLVM provides the
                  ConstantExpr to represent them in a (more or less)
                  architecture-independent way.<br>
                  <br>
                  For example, a GEP with constant indices on an
                  internal global variable will always compute the same
                  value; it is a constant.  However, we use a GEP
                  ConstantExpr to represent it; the backend code
                  generator converts it to the appropriate numerical
                  constant when generating native code.<br>
                  <br>
                  For more information on the ConstantExpr, please see
                  the LLVM Language Reference Manual (<a href="http://llvm.org/docs/LangRef.html#constant-expressions" class="m_-5294476307183461368gmail-m_3227547216749959667moz-txt-link-freetext" target="_blank">http://llvm.org/docs/LangRef.<wbr>html#constant-expressions</a>).<br>
                  <br>
                  Regards,<br>
                  <br>
                  John Criswell<br>
                  <br>
                  <blockquote type="cite">
                    <div>
                      <div class="m_-5294476307183461368gmail-h5">
                        <div dir="ltr">
                          <div><br>
                            Here is a my example, but there is still
                            existing code to compute value in run-time.<br>
                            <br>
                            <div>
                              <div>cat a.C</div>
                              <div>int n=5;</div>
                              <div>int main(){</div>
                              <div>  long a = (long)&n+7;</div>
                              <div>  int b = a;</div>
                              <div>  return b;</div>
                              <div>}<br>
                                <br>
                                <div>clang++ a.C  -c -O2 -emit-llvm
                                  -S;cat a.ll</div>
                                <div>; ModuleID = 'a.C'</div>
                                <div>target datalayout =
                                  "e-m:o-i64:64-f80:128-n8:16:32<wbr>:64-S128"</div>
                                <div>target triple =
                                  "x86_64-apple-macosx10.12.0"</div>
                                <div><br>
                                </div>
                                <div>@n = global i32 5, align 4</div>
                                <div><br>
                                </div>
                                <div>; Function Attrs: norecurse
                                  nounwind readnone ssp uwtable</div>
                                <div>define i32 @main() #0 {</div>
                                <div>  ret i32 trunc (i64 add (i64
                                  ptrtoint (i32* @n to i64), i64 7) to
                                  i32)</div>
                                <div>}</div>
                                <br>
                                <div>clang++ a.C  -c -O2;objdump -d a.O</div>
                                <div><br>
                                </div>
                                <div>a.O:<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>file format Mach-O 64-bit
                                  x86-64</div>
                                <div><br>
                                </div>
                                <div>Disassembly of section
                                  __TEXT,__text:</div>
                                <div>_main:</div>
                                <div>       0:<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>55 <span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>pushq<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>%rbp</div>
                                <div>       1:<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>48 89 e5 <span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>movq<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>%rsp, %rbp</div>
                                <div>       4:<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>48 8d 05 00 00 00 00 <span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>leaq<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>(%rip), %rax</div>
                                <div>       b:<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>83 c0 07 <span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span><b>addl<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                    </span>$7, %eax</b></div>
                                <div>       e:<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>5d <span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>popq<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>%rbp</div>
                                <div>       f:<span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>c3 <span class="m_-5294476307183461368gmail-m_3227547216749959667gmail-Apple-tab-span">
                                  </span>retq</div>
                                <br>
                              </div>
                            </div>
                            <div>I am confused about what is its
                              functionality in llvm?<br>
                            </div>
                            <div><br>
                            </div>
                            Thanks.<br>
                            ---------<br>
                          </div>
                          <div><br>
                            <div class="m_-5294476307183461368gmail-m_3227547216749959667gmail_signature">
                              <div dir="ltr">Zeson<br>
                              </div>
                            </div>
                          </div>
                        </div>
                        <br>
                        <fieldset class="m_-5294476307183461368gmail-m_3227547216749959667mimeAttachmentHeader"></fieldset>
                        <br>
                      </div>
                    </div>
                    <pre>______________________________<wbr>_________________
LLVM Developers mailing list
<a href="mailto:llvm-dev@lists.llvm.org" class="m_-5294476307183461368gmail-m_3227547216749959667moz-txt-link-abbreviated" target="_blank">llvm-dev@lists.llvm.org</a>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" class="m_-5294476307183461368gmail-m_3227547216749959667moz-txt-link-freetext" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><span class="m_-5294476307183461368gmail-HOEnZb"><font color="#888888">
</font></span></pre><span class="m_-5294476307183461368gmail-HOEnZb"><font color="#888888">
    </font></span></blockquote><span class="m_-5294476307183461368gmail-HOEnZb"><font color="#888888">
    

    <p>

    </p>
    <pre cols="72" class="m_-5294476307183461368gmail-m_3227547216749959667moz-signature">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a href="http://www.cs.rochester.edu/u/criswell" class="m_-5294476307183461368gmail-m_3227547216749959667moz-txt-link-freetext" target="_blank">http://www.cs.rochester.edu/u/<wbr>criswell</a></pre>
  </font></span></div>

</blockquote></div>


-- 
<div class="m_-5294476307183461368gmail_signature"><div dir="ltr">Zeson
</div></div>
</div></div></div>



</blockquote>
<p>
</p><pre class="m_-5294476307183461368moz-signature" cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a class="m_-5294476307183461368moz-txt-link-freetext" href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/<wbr>criswell</a></pre></div></div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Zeson<br></div></div>
</div>