<div dir="ltr">Since a, b, and c are globals, how does the optimize *know* they are not used elsewhere (e.g. another module)?</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jan 4, 2013 at 7:49 AM, Somenath Chakraborty <span dir="ltr"><<a href="mailto:some.chak@gmail.com" target="_blank">some.chak@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>Hello,</div><div> </div><div>I was trying to run few testcases and see how llvm optmizes different scenarios. I have a small testcase like:</div>
<div> </div><div><span><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font size="3"><font face="Calibri">#include <stdio.h></font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font size="3"><font face="Calibri"></font></font> </p><p style="margin:0cm 0cm 0pt">int a, b, c;</p><p style="margin:0cm 0cm 0pt"> </p><p style="margin:0cm 0cm 0pt">
<font size="3"><font face="Calibri">int</font></font><font size="3" face="Times New Roman">

</font></p><p style="margin:0cm 0cm 0pt"><font size="3"><font face="Calibri">main()</font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font size="3"><font face="Calibri">{</font></font></p><font size="3" face="Times New Roman">

</font><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3"><span>    </span>a = b + c;</font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3"><span>    </span>c = a;</font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri"> </font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3"><span>    </span>if (a == b)</font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3"><span>        </span>b = c;</font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3"><span>    </span>else </font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3"><span>        </span>b = a;</font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri"> </font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3"><span>    </span>printf( "
a = %d \n ", a );</font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3"><span>    </span>return 0;</font></font></p><font size="3" face="Times New Roman">

</font><p style="margin:0cm 0cm 0pt"><font size="3"><font face="Calibri">}</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri"></font> </p><p style="margin:0cm 0cm 0pt"><font face="Calibri"><font size="3">The corresponding llvm IR is (<font face="Times New Roman">

</font></font><font size="3">clang test.c -S -emit-llvm -o - -O3 </font></font><font size="3" face="Times New Roman">) :</font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri"></font> </p><p style="margin:0cm 0cm 0pt">

<font size="3" face="Times New Roman">

</font><font size="3"><font face="Calibri">define i32 @main() nounwind uwtable {</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font size="3"><font face="Calibri">entry:</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>%0 = load i32*
@b, align 4, !tbaa !4</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>%1 = load i32*
@c, align 4, !tbaa !4</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>%add = add nsw
i32 %1, %0</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>store i32 %add,
i32* @a, align 4, !tbaa !4</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>store i32 %add,
i32* @c, align 4, !tbaa !4</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>store i32 %add,
i32* @b, align 4, !tbaa !4</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>%call = tail call
i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11 x i8]* @.str, i64 0,
i64 0), i32 %add) nounwind</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">
</font><font face="Calibri"><font size="3"><span>  </span>ret i32 0</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font size="3"><font face="Calibri">}</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri">Here, I can see, although the <strong>copy-propagation</strong> is kicked in, but, <strong>constant propagation</strong> is not happening. I assume the reason behind this is that a, b and c are all global variables. Also, as no one is reading b and c after the statement "a = b + c", should they not get optimized out ( from "c = a" to end of function)? </font></p>

<p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri"></font> </p><p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri">Now, if a, b and c are made locals, all the optmizations are kicked in:</font></p>
<p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri"></font> </p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font size="3"><font face="Calibri">define i32 @main() nounwind uwtable {</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font size="3"><font face="Calibri">entry:</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>%call = tail call
i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11 x i8]* @.str, i64 0,
i64 0), i32 0) nounwind</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font face="Calibri"><font size="3"><span>  </span>ret i32 0</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font><font size="3"><font face="Calibri">}</font></font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Times New Roman">

</font></p><p style="margin:0cm 0cm 0pt"><font size="3" face="Calibri">Are we little conservative on global variables even though <strong>they don't have readers</strong> and debug mode is <strong>OFF</strong> ? Or, is it supported under some FLAG? Am I missing something .... ?</font></p>

<p style="margin:0cm 0cm 0pt"> </p><p style="margin:0cm 0cm 0pt">Thanks. </p><font size="3" face="Times New Roman">

</font></span></div>
<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div>
</div>