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