Hi folks, I'm new to LLVM and non-expert in hardware architecture, so my question might be dumb. I'm looking for the possibility to define/call a function with multi return path, it might look like this: ``` ; Define a function with 1 alternate return path define i32 @f(i1 %i) fork 1 { br i1 %i, label %noraml, label %alternate noraml: ... setpath ret i32 42 ; take normal return path br %cleanup alternate: ... setpath fork 0 ; take the alternate return path br %cleanup cleanup: ; preds = %noraml, %alternate ... unwind ; return to the caller } ``` And at the call side: ``` %ret = call @f(i1 %i) fork [%otherwise] ... otherwise: ... ``` Ideally, the callee sets the return address so it returns directly to the desired location in the caller w/o the caller taking extra switch. The idea is to implement some non-local control flow w/o extra overhead at each call side. I know LLVM doesn't have something like this currently, but is it possible to implement? -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170601/ebbf065a/attachment.html>
Reid Kleckner via llvm-dev
2017-Jun-01 16:44 UTC
[llvm-dev] Function with multi return path?
The closest thing LLVM has to this is the invoke instruction used for exception handling. Using it requires reusing or building a lot of EH runtime support, though. invoke only supports a single alternative return destination (the landingpad), but you can use the selector value to switch over multiple language level alternative return destinations. On Wed, May 31, 2017 at 11:57 PM, TONGARI J via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Hi folks, > > I'm new to LLVM and non-expert in hardware architecture, so my question > might be dumb. > > I'm looking for the possibility to define/call a function with multi > return path, it might look like this: > > ``` > ; Define a function with 1 alternate return path > define i32 @f(i1 %i) fork 1 { > br i1 %i, label %noraml, label %alternate > noraml: > ... > setpath ret i32 42 ; take normal return path > br %cleanup > alternate: > ... > setpath fork 0 ; take the alternate return path > br %cleanup > cleanup: ; preds = %noraml, %alternate > ... > unwind ; return to the caller > } > ``` > > And at the call side: > ``` > %ret = call @f(i1 %i) fork [%otherwise] > ... > otherwise: > ... > ``` > > Ideally, the callee sets the return address so it returns directly to the > desired location in the caller w/o the caller taking extra switch. > > The idea is to implement some non-local control flow w/o extra overhead at > each call side. > > I know LLVM doesn't have something like this currently, but is it possible > to implement? > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170601/85389e86/attachment.html>