[LLVMdev] missed optimizations
Nuno Lopes
nunoplopes at sapo.pt
Thu Sep 4 08:39:36 PDT 2008
Hi,
I have two questions about optimizations performed by llvm.
Consider these simple functions:
int x(int b) { return b?4:6; }
int y() { return x(0); }
int x2() { return 5; }
int y2() { return x2(); }
the optimized bitcode (with clang + opt -std-compiler-opts) is:
define i32 @y(...) nounwind {
entry:
ret i32 6
}
define i32 @y2(...) nounwind {
entry:
%call = call i32 (...)* @x2( ) ; <i32> [#uses=0]
ret i32 5
}
So why does LLVM optimizes the more difficult case, but leaves behind the
function call in the easiest case? :)
Second question:
int f();
int g() {
if (f() == 5) return 3;
return 4;
}
int h() {
if (g() == 6) return 2;
return 1;
}
gives the following optimized bc:
define i32 @g(...) nounwind {
entry:
%call = call i32 (...)* @f( ) ; <i32> [#uses=1]
%cmp = icmp eq i32 %call, 5 ; <i1> [#uses=1]
%retval = select i1 %cmp, i32 3, i32 4 ; <i32> [#uses=1]
ret i32 %retval
}
define i32 @h(...) nounwind {
entry:
%call = call i32 (...)* @g( ) ; <i32> [#uses=1]
%cmp = icmp eq i32 %call, 6 ; <i1> [#uses=1]
%retval = select i1 %cmp, i32 2, i32 1 ; <i32> [#uses=1]
ret i32 %retval
}
In function h(), llvm doesn't realize that g() never returns 6, and thus it
could reduce that function to { g(); return 1; }. Doesn't llvm produce some
sort of summary for functions with e.g. their possible return values? If
not, is there any pass where I could implement this? (I have some code that
has many opportunities for this kind of optimization)
Also, shouldn't the function g() get inlined in the h() function? It is
inlined only if I change the g() function to be static. So isn't llvm being
too conservative when inlining global functions?
Thanks,
Nuno
More information about the llvm-dev
mailing list