musttail call void bitcast (i32 (i32, i8*, %Type*)* @MyMethod to void (i32, i8*)*)(i32 %0, i8* %1)
ret void
Into something like:
%8 = tail call i32 @MyMethod(i32 %0, i8* %1, %Type* null)
ret void
I realize I'm losing a parameter there, but this is an interface jump trick I use and relies on the end code being a 'jmp' (x86). I realize i can probably use noopt & noinline to do this trick, but I do want llvm to optimize and inline calls if it can prove it always calls a given method. Any way i can do this?
Inst combine yes. However it shouldn’t drop this bit cast in the first place, since the last parameter isn’t available. (It only works because of this must tail)
Aside from instcombine, the inliner will also transform musttail to tail.
The supported use cases for musttail are essentially:
- Avoiding unbounded stack growth for programming languages that require
tail recursion
- Perfect forwarding of parameters which cannot be copied (think C++
objects constructed in argument slots, aka inalloca)
- Perfect forwarding for thunks which are called with varying signatures
(these effectively forward the ellipsis of the caller)
The last case sounds the most like yours, in which case David's suggestion
is the right one.