theraven added a comment. Here's a minimal test:
void tail(int, float); __attribute__((always_inline)) void caller(float x) { [[clang::musttail]] return tail(42, x); } void outer(int x, float y) { return caller(y); } This raises this error: tail.cc:7:3: error: cannot perform a tail call to function 'tail' because its signature is incompatible with the calling function return tail(42, x); ^ tail.cc:1:1: note: target function has different number of parameters (expected 1 but has 2) void tail(int, float); ^ tail.cc:6:5: note: tail call required by 'musttail' attribute here [[clang::musttail]] ^ There's also an interesting counterexample: void tail(int, float); __attribute__((always_inline)) void caller(int a, float x) { [[clang::musttail]] return tail(a, x); } void outer(float y) { return caller(42, y); } This *is* accepted by clang, but then generates this IR at -O0: define dso_local void @_Z5outerf(float %0) #2 { %2 = alloca i32, align 4 %3 = alloca float, align 4 %4 = alloca float, align 4 store float %0, float* %4, align 4 %5 = load float, float* %4, align 4 store i32 42, i32* %2, align 4 store float %5, float* %3, align 4 %6 = load i32, i32* %2, align 4 %7 = load float, float* %3, align 4 call void @_Z4tailif(i32 %6, float %7) ret void } And this IR at -O1: ; Function Attrs: uwtable mustprogress define dso_local void @_Z5outerf(float %0) local_unnamed_addr #2 { call void @_Z4tailif(i32 42, float %0) ret void } Note that in both cases, the alway-inline attribute is respected (even at -O0, the always-inline inliner runs) but the musttail annotation is lost. The inlining has inserted the call into a function with a different set of parameters and so it cannot have a `musttail` IR annotation. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D99517/new/ https://reviews.llvm.org/D99517 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits