diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index fe284f5c0fc..23d83e69cb8 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/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/test/CodeGen/ARM/fast-tail-call.ll b/test/CodeGen/ARM/fast-tail-call.ll new file mode 100644 index 00000000000..9fbdc9d24b0 --- /dev/null +++ b/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 +}