Discussion on the function "bool llvm::isInTailCallPosition()"

Hi All,

We are encountering an issue where “bool llvm::isInTailCallPosition()” returns true for a callee not in a tail call position.

The function “bool llvm::isInTailCallPosition()” (https://pastebin.com/fMxAsh95) only checks whether a call is in a tail call position if the call has side effects, accesses memory or is not safe to speculatively execute. Therefore, a “speculatable” function will always be considered in a tail-call position - regardless of whether it actually is. A small example as below:

IR reproducer https://pastebin.com/eZwVxr2K produces a tail call in caller without storing the result, which can be seen in the initial SDAG shared below:

Any ideas or suggestions?


The conditional seems to have been there for a long time (450aa64fc1878b55f0715c8672c59dac2e312beb).

Though, it seems odd we say speculatable calls are automatically in a tail position. They can also not always be moved to one.

I would not be surprised if all tests pass if you remove the outer conditional, especially since we do not yet derive speculatable.

Maybe someone more active in this area can chime in.