[LLVMdev] Missing optimization in constant propagation?
Martin Apel
martin.apel at SIMPACK.de
Fri Jul 15 00:21:18 PDT 2011
Hi all,
I stumbled across a peculiarity regarding constant propagation that I don't understand. I'm not sure, if I oversee anything or if it's a missing feature.
I have created the following simple test function in C:
int times_zero(int a)
{
return (a * 0);
}
Compiling this with GCC using dragonegg generates the following code:
%int = type i32
define i32 @times_zero(i32 %a) nounwind {
entry:
%a_addr = alloca i32, align 4
%memtmp = alloca i32
%"alloca point" = bitcast i32 0 to i32
store i32 %a, i32* %a_addr
%"ssa point" = bitcast i32 0 to i32
br label %"2"
"2": ; preds = %entry
store i32 0, i32* %memtmp, align 1
br label %return
return: ; preds = %"2"
%retval = load i32* %memtmp
ret i32 %retval
}
Running this through "opt -O2" generates
define i32 @times_zero(i32 %a) nounwind readnone {
entry:
ret i32 0
}
So far everything works as expected. LLVM recognizes the multiplication by zero and replaces the multiplication by its result zero.
Doing the same for doubles however does not do the same optimization.
double times_zero(double a)
{
return (a * 0.0);
}
Instead the following code is generated after optimization:
define double @times_zero(double %a) nounwind readnone {
entry:
%0 = fmul double %a, 0.000000e+00
ret double %0
}
Is there a reason, why this optimization opportunity is not taken? For the record, I am using LLVM 2.9
Regards,
Martin
More information about the llvm-dev
mailing list