Lines Matching refs:CI

243       CallInst *CI = dyn_cast<CallInst>(&I);  in markTails()  local
247 if (!CI || CI->isTailCall() || isa<DbgInfoIntrinsic>(&I) || in markTails()
253 CI->isNoTailCall() || CI->hasOperandBundlesOtherThan( in markTails()
256 if (!IsNoTail && CI->doesNotAccessMemory()) { in markTails()
265 for (auto &Arg : CI->arg_operands()) { in markTails()
277 return OptimizationRemark(DEBUG_TYPE, "tailcall-readnone", CI) in markTails()
280 CI->setTailCall(); in markTails()
286 if (!IsNoTail && Escaped == UNESCAPED && !Tracker.AllocaUsers.count(CI)) in markTails()
287 DeferredTails.push_back(CI); in markTails()
317 for (CallInst *CI : DeferredTails) { in markTails()
318 if (Visited[CI->getParent()] != ESCAPED) { in markTails()
321 LLVM_DEBUG(dbgs() << "Marked as tail call candidate: " << *CI << "\n"); in markTails()
322 CI->setTailCall(); in markTails()
334 static bool canMoveAboveCall(Instruction *I, CallInst *CI, AliasAnalysis *AA) { in canMoveAboveCall() argument
350 if (CI->mayHaveSideEffects()) { in canMoveAboveCall()
356 if (isModSet(AA->getModRefInfo(CI, MemoryLocation::get(L))) || in canMoveAboveCall()
368 return !is_contained(I->operands(), CI); in canMoveAboveCall()
371 static bool canTransformAccumulatorRecursion(Instruction *I, CallInst *CI) { in canTransformAccumulatorRecursion() argument
379 if ((I->getOperand(0) == CI && I->getOperand(1) == CI) || in canTransformAccumulatorRecursion()
380 (I->getOperand(0) != CI && I->getOperand(1) != CI)) in canTransformAccumulatorRecursion()
437 void createTailRecurseLoopHeader(CallInst *CI);
441 bool eliminateCall(CallInst *CI);
447 void copyByValueOperandIntoLocalTemp(CallInst *CI, int OpndIdx);
449 void copyLocalTempOfByValueOperandIntoArguments(CallInst *CI, int OpndIdx);
466 CallInst *CI = nullptr; in findTRECandidate() local
469 CI = dyn_cast<CallInst>(BBI); in findTRECandidate()
470 if (CI && CI->getCalledFunction() == &F) in findTRECandidate()
478 assert((!CI->isTailCall() || !CI->isNoTailCall()) && in findTRECandidate()
480 if (!CI->isTailCall()) in findTRECandidate()
488 firstNonDbg(BB->front().getIterator()) == CI && in findTRECandidate()
489 firstNonDbg(std::next(BB->begin())) == TI && CI->getCalledFunction() && in findTRECandidate()
490 !TTI->isLoweredToCall(CI->getCalledFunction())) { in findTRECandidate()
493 auto I = CI->arg_begin(), E = CI->arg_end(); in findTRECandidate()
501 return CI; in findTRECandidate()
504 void TailRecursionEliminator::createTailRecurseLoopHeader(CallInst *CI) { in createTailRecurseLoopHeader() argument
510 BI->setDebugLoc(CI->getDebugLoc()); in createTailRecurseLoopHeader()
585 void TailRecursionEliminator::copyByValueOperandIntoLocalTemp(CallInst *CI, in copyByValueOperandIntoLocalTemp() argument
587 PointerType *ArgTy = cast<PointerType>(CI->getArgOperand(OpndIdx)->getType()); in copyByValueOperandIntoLocalTemp()
592 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne()); in copyByValueOperandIntoLocalTemp()
598 CI->getArgOperand(OpndIdx)->getName(), &*F.getEntryBlock().begin()); in copyByValueOperandIntoLocalTemp()
600 IRBuilder<> Builder(CI); in copyByValueOperandIntoLocalTemp()
605 CI->getArgOperand(OpndIdx), in copyByValueOperandIntoLocalTemp()
607 CI->setArgOperand(OpndIdx, NewAlloca); in copyByValueOperandIntoLocalTemp()
613 CallInst *CI, int OpndIdx) { in copyLocalTempOfByValueOperandIntoArguments() argument
614 PointerType *ArgTy = cast<PointerType>(CI->getArgOperand(OpndIdx)->getType()); in copyLocalTempOfByValueOperandIntoArguments()
619 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne()); in copyLocalTempOfByValueOperandIntoArguments()
621 IRBuilder<> Builder(CI); in copyLocalTempOfByValueOperandIntoArguments()
627 CI->getArgOperand(OpndIdx), in copyLocalTempOfByValueOperandIntoArguments()
631 bool TailRecursionEliminator::eliminateCall(CallInst *CI) { in eliminateCall() argument
632 ReturnInst *Ret = cast<ReturnInst>(CI->getParent()->getTerminator()); in eliminateCall()
639 BasicBlock::iterator BBI(CI); in eliminateCall()
641 if (canMoveAboveCall(&*BBI, CI, AA)) in eliminateCall()
648 if (AccPN || !canTransformAccumulatorRecursion(&*BBI, CI)) in eliminateCall()
660 return OptimizationRemark(DEBUG_TYPE, "tailcall-recursion", CI) in eliminateCall()
667 createTailRecurseLoopHeader(CI); in eliminateCall()
670 for (unsigned I = 0, E = CI->getNumArgOperands(); I != E; ++I) { in eliminateCall()
671 if (CI->isByValArgument(I)) in eliminateCall()
672 copyByValueOperandIntoLocalTemp(CI, I); in eliminateCall()
678 for (unsigned I = 0, E = CI->getNumArgOperands(); I != E; ++I) { in eliminateCall()
679 if (CI->isByValArgument(I)) { in eliminateCall()
680 copyLocalTempOfByValueOperandIntoArguments(CI, I); in eliminateCall()
683 ArgumentPHIs[I]->addIncoming(CI->getArgOperand(I), BB); in eliminateCall()
692 AccRecInstr->setOperand(AccRecInstr->getOperand(0) != CI, AccPN); in eliminateCall()
697 if (Ret->getReturnValue() == CI || AccRecInstr) { in eliminateCall()
720 NewBI->setDebugLoc(CI->getDebugLoc()); in eliminateCall()
723 BB->getInstList().erase(CI); // Remove call. in eliminateCall()
814 CallInst *CI = findTRECandidate(&BB); in processBlock() local
816 if (!CI) in processBlock()
832 eliminateCall(CI); in processBlock()
835 CallInst *CI = findTRECandidate(&BB); in processBlock() local
837 if (CI) in processBlock()
838 return eliminateCall(CI); in processBlock()