Hello,
I was trying to run few testcases and see how llvm optmizes different
scenarios. I have a small testcase like:
#include <stdio.h>
int a, b, c;
int
main()
{
a = b + c;
c = a;
if (a == b)
b = c;
else
b = a;
printf( " a = %d \n ", a );
return 0;
}
The corresponding llvm IR is ( clang test.c -S -emit-llvm -o - -O3 ) :
define i32 @main() nounwind uwtable {
entry:
%0 = load i32* @b, align 4, !tbaa !4
%1 = load i32* @c, align 4, !tbaa !4
%add = add nsw i32 %1, %0
store i32 %add, i32* @a, align 4, !tbaa !4
store i32 %add, i32* @c, align 4, !tbaa !4
store i32 %add, i32* @b, align 4, !tbaa !4
%call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11
x i8]* @.str, i64 0, i64 0), i32 %add) nounwind
ret i32 0
}
Here, I can see, although the *copy-propagation* is kicked in, but, *constant
propagation* 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)?
Now, if a, b and c are made locals, all the optmizations are kicked in:
define i32 @main() nounwind uwtable {
entry:
%call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11
x i8]* @.str, i64 0, i64 0), i32 0) nounwind
ret i32 0
}
Are we little conservative on global variables even though *they don't have
readers* and debug mode is *OFF* ? Or, is it supported under some FLAG? Am
I missing something .... ?
Thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20130104/3f056180/attachment.html>
Since a, b, and c are globals, how does the optimize *know* they are not used elsewhere (e.g. another module)? On Fri, Jan 4, 2013 at 7:49 AM, Somenath Chakraborty <some.chak at gmail.com>wrote:> Hello, > > I was trying to run few testcases and see how llvm optmizes different > scenarios. I have a small testcase like: > > > #include <stdio.h> > > > > int a, b, c; > > > > int > > main() > > { > > a = b + c; > > c = a; > > > > if (a == b) > > b = c; > > else > > b = a; > > > > printf( " a = %d \n ", a ); > > return 0; > > } > > > > The corresponding llvm IR is ( clang test.c -S -emit-llvm -o - -O3 ) : > > > > define i32 @main() nounwind uwtable { > > entry: > > %0 = load i32* @b, align 4, !tbaa !4 > > %1 = load i32* @c, align 4, !tbaa !4 > > %add = add nsw i32 %1, %0 > > store i32 %add, i32* @a, align 4, !tbaa !4 > > store i32 %add, i32* @c, align 4, !tbaa !4 > > store i32 %add, i32* @b, align 4, !tbaa !4 > > %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds > ([11 x i8]* @.str, i64 0, i64 0), i32 %add) nounwind > > ret i32 0 > > } > > Here, I can see, although the *copy-propagation* is kicked in, but, *constant > propagation* 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)? > > > > Now, if a, b and c are made locals, all the optmizations are kicked in: > > > > define i32 @main() nounwind uwtable { > > entry: > > %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds > ([11 x i8]* @.str, i64 0, i64 0), i32 0) nounwind > > ret i32 0 > > } > > Are we little conservative on global variables even though *they don't > have readers* and debug mode is *OFF* ? Or, is it supported under some > FLAG? Am I missing something .... ? > > > > Thanks. > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-- Thanks, Justin Holewinski -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130104/2f248304/attachment.html>
Thanks for your reply. So, we don't do any "use" check (for globals variables) beyond a module scope. If so, it answers my question. On Fri, Jan 4, 2013 at 6:53 PM, Justin Holewinski < justin.holewinski at gmail.com> wrote:> Since a, b, and c are globals, how does the optimize *know* they are not > used elsewhere (e.g. another module)? >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130104/ae1a8bdc/attachment.html>