+/// Identify if RI has a previous instruction in the "Tail Position" and return
+/// it. Otherwise return 0.
+///
+/// This is based off of the code in llvm::isInTailCallPosition. The difference
+/// is that it inverts the first part of llvm::isInTailCallPosition since
+/// isInTailCallPosition is checking if a call is in a tail call position, and
+/// we are searching for an unknown tail call that might be in the tail call
+/// position. Once we find the call though, the code uses the same refactored
+/// code, returnTypeIsEligibleForTailCall.
+static CallInst *FindPotentialTailCall(BasicBlock *BB, ReturnInst *RI,
+ const TargetLoweringBase *TLI) {
+ // Establish a reasonable upper bound on the maximum amount of instructions we
+ // will look through to find a tail call.
+ unsigned SearchCounter = 0;
+ const unsigned MaxSearch = 4;
+ bool NoInterposingChain = true;
+
+ for (BasicBlock::reverse_iterator I = std::next(BB->rbegin()), E = BB->rend();
+ I != E && SearchCounter < MaxSearch; ++I) {
+ Instruction *Inst = &*I;
+
+ // Skip over debug intrinsics and do not allow them to affect our MaxSearch
+ // counter.
+ if (isa<DbgInfoIntrinsic>(Inst))
+ continue;
+
+ // If we find a call and the following conditions are satisifed, then we
+ // have found a tail call that satisfies at least the target independent
+ // requirements of a tail call:
+ //
+ // 1. The call site has the tail marker.
+ //
+ // 2. The call site either will not cause the creation of a chain or if a
+ // chain is necessary there are no instructions in between the callsite and
+ // the call which would create an interposing chain.
+ //
+ // 3. The return type of the function does not impede tail call
+ // optimization.
+ if (CallInst *CI = dyn_cast<CallInst>(Inst)) {
+ if (CI->isTailCall() &&
+ (InstructionWillNotHaveChain(CI) || NoInterposingChain) &&
+ returnTypeIsEligibleForTailCall(BB->getParent(), CI, RI, *TLI))
+ return CI;
+ }
+
+ // If we did not find a call see if we have an instruction that may create
+ // an interposing chain.
+ NoInterposingChain =
+ NoInterposingChain && InstructionWillNotHaveChain(Inst);
+
+ // Increment max search.
+ SearchCounter++;