diff options
author | Tim Northover <tnorthover@apple.com> | 2013-07-06 12:58:45 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2013-07-06 12:58:45 +0000 |
commit | dab4db53727cbdd7a693a4a0c646307f2c7b497a (patch) | |
tree | acb38f43a4e2edfd20518cd5212575d51e0c62ab | |
parent | a37acf702d2b075c48d5072891c4aa2c9e39f149 (diff) | |
download | bcm5719-llvm-dab4db53727cbdd7a693a4a0c646307f2c7b497a.tar.gz bcm5719-llvm-dab4db53727cbdd7a693a4a0c646307f2c7b497a.zip |
Stop putting operations after a tail call.
This prevents the emission of DAG-generated vreg definitions after a
tail call be dropping them entirely (on the grounds that nothing could
use them anyway, and they interfere with O0 CodeGen).
llvm-svn: 185754
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/fast-tail-call.ll | 16 |
2 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index fe284f5c0fc..23d83e69cb8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -5357,6 +5357,10 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee, // As a special case, a null chain means that a tail call has been emitted and // the DAG root is already updated. HasTailCall = true; + + // Since there's no actual continuation from this block, nothing can be + // relying on us setting vregs for them. + PendingExports.clear(); } else { DAG.setRoot(Result.second); } diff --git a/llvm/test/CodeGen/ARM/fast-tail-call.ll b/llvm/test/CodeGen/ARM/fast-tail-call.ll new file mode 100644 index 00000000000..9fbdc9d24b0 --- /dev/null +++ b/llvm/test/CodeGen/ARM/fast-tail-call.ll @@ -0,0 +1,16 @@ +; RUN: llc -mtriple=thumbv7-linux-gnueabi -O0 -arm-tail-calls < %s | FileCheck %s + +; Primarily a non-crash test: Thumbv7 Linux does not have FastISel support, +; which led (via a convoluted route) to DAG nodes after a TC_RETURN that +; couldn't possibly work. + +declare i8* @g(i8*) + +define i8* @f(i8* %a) { +entry: + %0 = tail call i8* @g(i8* %a) + ret i8* %0 +; CHECK: b g +; CHECK-NOT: ldr +; CHECK-NOT: str +} |