diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index e7ab36a93862..40a3bdd4e512 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -2247,9 +2247,12 @@ SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, SDValue InChain = DAG.getEntryNode(); // isTailCall may be true since the callee does not reference caller stack - // frame. Check if it's in the right position. + // frame. Check if it's in the right position and that the return types match. SDValue TCChain = InChain; - bool isTailCall = TLI.isInTailCallPosition(DAG, Node, TCChain); + const Function *F = DAG.getMachineFunction().getFunction(); + bool isTailCall = + TLI.isInTailCallPosition(DAG, Node, TCChain) && + (RetTy == F->getReturnType() || F->getReturnType()->isVoidTy()); if (isTailCall) InChain = TCChain; diff --git a/test/CodeGen/ARM/tail-call-builtin.ll b/test/CodeGen/ARM/tail-call-builtin.ll new file mode 100644 index 000000000000..c829cc52462e --- /dev/null +++ b/test/CodeGen/ARM/tail-call-builtin.ll @@ -0,0 +1,37 @@ +; RUN: llc -mtriple=thumbv7-linux-gnueabihf %s -o - | FileCheck %s + +define i64 @test_mismatched_call(double %in) { +; CHECK-LABEL: test_mismatched_call: +; CHECK: bl floor +; CHECK: vmov r0, r1, d0 + + %val = tail call double @floor(double %in) + %res = bitcast double %val to i64 + ret i64 %res +} + +define double @test_matched_call(double %in) { +; CHECK-LABEL: test_matched_call: +; CHECK: b floor + + %val = tail call double @floor(double %in) + ret double %val +} + +define void @test_irrelevant_call(double %in) { +; CHECK-LABEL: test_irrelevant_call: +; CHECK-NOT: bl floor + + %val = tail call double @floor(double %in) + ret void +} + +define arm_aapcscc double @test_callingconv(double %in) { +; CHECK: test_callingconv: +; CHECK: bl floor + + %val = tail call double @floor(double %in) + ret double %val +} + +declare double @floor(double) nounwind readonly diff --git a/test/CodeGen/X86/atomic-non-integer.ll b/test/CodeGen/X86/atomic-non-integer.ll index 98fcd96d3e4c..17b73ecf4e1c 100644 --- a/test/CodeGen/X86/atomic-non-integer.ll +++ b/test/CodeGen/X86/atomic-non-integer.ll @@ -43,7 +43,7 @@ define half @load_half(half* %fptr) { ; CHECK-LABEL: @load_half ; CHECK: movw (%rdi), %ax ; CHECK: movzwl %ax, %edi -; CHECK: jmp __gnu_h2f_ieee +; CHECK: callq __gnu_h2f_ieee %v = load atomic half, half* %fptr unordered, align 2 ret half %v }