Index: llvm/lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- llvm/lib/CodeGen/CodeGenPrepare.cpp +++ llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -2031,7 +2031,11 @@ SmallVector TailCalls; if (PN) { for (unsigned I = 0, E = PN->getNumIncomingValues(); I != E; ++I) { - CallInst *CI = dyn_cast(PN->getIncomingValue(I)); + Value *IncomingVal = PN->getIncomingValue(I); + // Look through bitcasts. + if (BitCastInst *BCI = dyn_cast(IncomingVal)) + IncomingVal = BCI->getOperand(0); + CallInst *CI = dyn_cast(IncomingVal); // Make sure the phi value is indeed produced by the tail call. if (CI && CI->hasOneUse() && CI->getParent() == PN->getIncomingBlock(I) && TLI->mayBeEmittedAsTailCall(CI) && Index: llvm/test/CodeGen/X86/tailcall-cgp-dup.ll =================================================================== --- llvm/test/CodeGen/X86/tailcall-cgp-dup.ll +++ llvm/test/CodeGen/X86/tailcall-cgp-dup.ll @@ -105,3 +105,23 @@ ret i1 %0 } +; We need to look through bitcasts when looking for tail calls in phi incoming +; values. +; CHECK-LABEL: f_ret8: +; CHECK: jmp {{.*}}g_ret32 +; CHECK-NOT: call +declare i32* @g_ret32() +define i8* @f_ret8(i8* %obj) { +entry: + %cmp = icmp eq i8* %obj, null + br i1 %cmp, label %return, label %if.then + +if.then: + %ptr = tail call i32* @g_ret32() + %casted = bitcast i32* %ptr to i8* + br label %return + +return: + %retval = phi i8* [ %casted, %if.then ], [ %obj, %entry ] + ret i8* %retval +}