<div dir="ltr">Yes, but the example you give is a global variable. How about local variable which is also folded into constant expression as blow.<div><br><div><div>@a = global i32 0, align 4</div><div>define signext i32 @main()  {</div><div>  ret i32 trunc (i64 add (i64 ptrtoint (i32* @a to i64), i64 5) to i32)</div><div>}</div></div><div><br></div><div>I found the computation still exists in assembly code which as blow. Could it be that a constant replaces the result of trunc operation theoretically? Does it need a assembler(or linker?) to do the process to calculate the result on the variable `a` such as <span style="font-size:14px"> `</span><span style="font-size:14px">.quad   trunc_macro(a+5)` as a temp symbol value used by moving it to eax register to return?<br><br>I am wondering what is the difference between constant expression and separate instruction?</span></div></div><div><span style="font-size:14px">For example,<br><br></span></div><div><div><div>define signext i32 @main()  {</div><div>  %1 = ptrtoint i32* @a to i64</div><div>  %2 = add i64 %1, 5</div><div>  %3 = trunc i64 %2 to i32</div><div>  ret i32 %3</div><div>}</div></div></div><div><br></div><div>The code above would be only folded in optimized mode such as -O1 or -O2.</div><div><div>define signext i32 @main() #0 {</div><div>  ret i32 trunc (i64 add (i64 ptrtoint (i32* @a to i64), i64 5) to i32)</div><div>}</div><div><br></div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-03-18 7:04 GMT+08:00 Matthias Braun <span dir="ltr"><<a href="mailto:mbraun@apple.com" target="_blank">mbraun@apple.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
> On Mar 9, 2017, at 5:28 AM, Zeson Wu via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
> Hi, All.<br>
><br>
> Does anybody know about ConstantExpr in llvm? What's it?<br>
</span>The short version is: Some values can stand on their own in llvm independently of a basic block or a function. These include things like numbers, addresses of global variables or functions, etc. You can even do computations on them giving you ConstantExpr. Take for example:<br>
<br>
int array[10];<br>
int *x = &array + 5;<br>
<br>
giving this llvm IR:<br>
<br>
@array = common global [10 x i32] zeroinitializer, align 16<br>
@x = global i32* bitcast (i8* getelementptr (i8, i8* bitcast ([10 x i32]* @array to i8*), i64 20) to i32*), align 8<br>
<br>
and this assembly:<br>
<br>
        .globl  _x                      ## @x<br>
        .p2align        3<br>
_x:<br>
        .quad   _array+20<br>
<br>
They will be lowered at various places (some in the backend, some by the linker, some by the dynamic loader) but will be a constant value when the program is loaded.<br>
<span class="HOEnZb"><font color="#888888"><br>
- Matthias<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Zeson<br></div></div>
</div>