[LLVMdev] RE: repeated recursion with "frozen" arguments
Chris Lattner
sabre at nondot.org
Wed Dec 24 13:54:01 PST 2003
<Chris is cleaning out his inbox>
Valery A.Khamenya wrote (in
http://mail.cs.uiuc.edu/pipermail/llvmdev/2003-August/000455.html):
> there is a very simple using case concerning LLVM and I am wondering
> whether it might be optimized at LLVM layer:
> int rec_func(int x, int y) {
> if(y<0) return x;
> return y + rec_func(x, y-1); // should we really push x?
> }
> The similar things we have when we pass `this' pointer to non-static
> member functions in C++ (why should we pass `this' pointer always if it
> was not changed?).
> So, my questions are:
> Q1. should/might the optimization like this be resolved at LLVM layer?
> if "yes" then
> Q2. is LLVM capable of doing things like that today?
Hi Valery,
Since we originally had this discussion, and I got thoroughly confused,
LLVM has moved on. The answer is now _yes_ on both points. If you
compile the function above with the 1.1 (or later) compiler, you should
get something like this:
int %rec_func(int %x, int %y) {
entry:
br label %tailrecurse
tailrecurse: ; preds = %entry, %endif
%cann-indvar = phi uint [ 0, %entry ], [ %next-indvar, %endif ] ; <uint> [#uses=2]
%accumulator.tr = phi int [ %x, %entry ], [ %tmp.9, %endif ] ; <int> [#uses=2]
%cann-indvar = cast uint %cann-indvar to int ; <int> [#uses=1]
%y.tr-scale = mul int %cann-indvar, -1 ; <int> [#uses=1]
%y.tr = add int %y.tr-scale, %y ; <int> [#uses=2]
%next-indvar = add uint %cann-indvar, 1 ; <uint> [#uses=1]
%tmp.1 = setlt int %y.tr, 0 ; <bool> [#uses=1]
br bool %tmp.1, label %then, label %endif
then: ; preds = %tailrecurse
ret int %accumulator.tr
endif: ; preds = %tailrecurse
%tmp.9 = add int %accumulator.tr, %y.tr ; <int> [#uses=1]
br label %tailrecurse
}
... Note that this consumes _no_ stack space, because there are no
recursive calls. :)
-Chris
--
http://llvm.cs.uiuc.edu/
http://www.nondot.org/~sabre/Projects/
More information about the llvm-dev
mailing list