[X86] Fix latent bug in sibcall eligibility logic
authorReid Kleckner <rnk@google.com>
Fri, 28 Jul 2017 00:58:35 +0000 (00:58 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 28 Jul 2017 00:58:35 +0000 (00:58 +0000)
commit07a5d4372e5025211976645b766319204814ca39
treeeea84846170e33fa52de55cd3133cb7bbfe60e6a
parentbdfd1228f67c9aa047348751ebec3d1513d1a338
[X86] Fix latent bug in sibcall eligibility logic

The X86 tail call eligibility logic was correct when it was written, but
the addition of inalloca and argument copy elision broke its
assumptions. It was assuming that fixed stack objects were immutable.

Currently, we aim to emit a tail call if no arguments have to be
re-arranged in memory. This code would trace the outgoing argument
values back to check if they are loads from an incoming stack object.
If the stack argument is immutable, then we won't need to store it back
to the stack when we tail call.

Fortunately, stack objects track their mutability, so we can just make
the obvious check to fix the bug.

This was http://crbug.com/749826

llvm-svn: 309343
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/tail-call-mutable-memarg.ll [new file with mode: 0644]