[LLVMdev] Loop elimination with floating point counter.

Syoyo Fujita syoyofujita at gmail.com
Thu Jan 8 04:36:09 PST 2009


Hi LLVM-ers,

I'd like to eliminate dead loop with floating point counter using
LLVM, but the following loop wasn't optimized by opt.

void
func() {
    float i;
    for (i = 0.0f; i < 1000.0f; i += 1.2f) {
    }
}

$ clang -emit-llvm-bc floop.c
$ opt -std-compile-opts floop.bc | llvm-dis

define void @func(...) nounwind  {
entry:
	br label %forinc

forinc:		; preds = %forinc, %entry
	%i.0.reg2mem.0 = phi float [ 0.000000e+00, %entry ], [ %add, %forinc
]	; <float> [#uses=1]
	%add = add float %i.0.reg2mem.0, 0x3FF3333340000000		; <float> [#uses=2]
	%cmp = fcmp olt float %add, 1.000000e+03		; <i1> [#uses=1]
	br i1 %cmp, label %forinc, label %afterfor

afterfor:		; preds = %forinc
	ret void
}

What I expected is just one instruction "ret void" in function "func".

Should I specify some specific optimizer pass for opt?
If so, what is the right optimization pass to specify for opt to
remove dead loop with floating point counter?

I've tested some loop optimization pass, e.g. -licm, -loop-deletion,
but nothing takes effect.

FYI, gcc -O3 also can't optimize such a loop, but icc -O3 can.

LLVM and clang used are recent version from svn.

Thanks in advance.

--
Syoyo



More information about the llvm-dev mailing list