<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 style>  </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 style>  </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 style>  </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 style>  </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 style>  </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 style>  </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 style>  </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 style>  </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" class="MsoPlainText"><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" class="MsoPlainText"><font size="3" face="Calibri"></font> </p><p style="margin:0cm 0cm 0pt" class="MsoPlainText"><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" class="MsoPlainText"><font size="3" face="Calibri"></font> </p><p style="margin:0cm 0cm 0pt" class="MsoPlainText"><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" class="MsoPlainText"><font size="3" face="Times New Roman">

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

</font><font face="Calibri"><font size="3"><span style>  </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" class="MsoPlainText"><font size="3" face="Times New Roman">

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

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

</font></p><p style="margin:0cm 0cm 0pt" class="MsoPlainText"><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" class="MsoPlainText"> </p><p style="margin:0cm 0cm 0pt" class="MsoPlainText">Thanks. </p><font size="3" face="Times New Roman">

</font></span></div>