[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