Lines Matching refs:CI

238       CallInst *CI = dyn_cast<CallInst>(&I);  in markTails()  local
242 if (!CI || CI->isTailCall() || isa<DbgInfoIntrinsic>(&I) || in markTails()
248 bool IsNoTail = CI->isNoTailCall() || in markTails()
249 CI->hasOperandBundlesOtherThan( in markTails()
253 if (!IsNoTail && CI->doesNotAccessMemory()) { in markTails()
262 for (auto &Arg : CI->args()) { in markTails()
274 return OptimizationRemark(DEBUG_TYPE, "tailcall-readnone", CI) in markTails()
277 CI->setTailCall(); in markTails()
283 if (!IsNoTail && Escaped == UNESCAPED && !Tracker.AllocaUsers.count(CI)) in markTails()
284 DeferredTails.push_back(CI); in markTails()
314 for (CallInst *CI : DeferredTails) { in markTails()
315 if (Visited[CI->getParent()] != ESCAPED) { in markTails()
318 LLVM_DEBUG(dbgs() << "Marked as tail call candidate: " << *CI << "\n"); in markTails()
319 CI->setTailCall(); in markTails()
331 static bool canMoveAboveCall(Instruction *I, CallInst *CI, AliasAnalysis *AA) { in canMoveAboveCall() argument
347 if (CI->mayHaveSideEffects()) { in canMoveAboveCall()
353 if (isModSet(AA->getModRefInfo(CI, MemoryLocation::get(L))) || in canMoveAboveCall()
365 return !is_contained(I->operands(), CI); in canMoveAboveCall()
368 static bool canTransformAccumulatorRecursion(Instruction *I, CallInst *CI) { in canTransformAccumulatorRecursion() argument
382 if ((I->getOperand(0) == CI && I->getOperand(1) == CI) || in canTransformAccumulatorRecursion()
383 (I->getOperand(0) != CI && I->getOperand(1) != CI)) in canTransformAccumulatorRecursion()
440 void createTailRecurseLoopHeader(CallInst *CI);
444 bool eliminateCall(CallInst *CI);
450 void copyByValueOperandIntoLocalTemp(CallInst *CI, int OpndIdx);
452 void copyLocalTempOfByValueOperandIntoArguments(CallInst *CI, int OpndIdx);
469 CallInst *CI = nullptr; in findTRECandidate() local
472 CI = dyn_cast<CallInst>(BBI); in findTRECandidate()
473 if (CI && CI->getCalledFunction() == &F) in findTRECandidate()
481 assert((!CI->isTailCall() || !CI->isNoTailCall()) && in findTRECandidate()
483 if (!CI->isTailCall()) in findTRECandidate()
491 firstNonDbg(BB->front().getIterator()) == CI && in findTRECandidate()
492 firstNonDbg(std::next(BB->begin())) == TI && CI->getCalledFunction() && in findTRECandidate()
493 !TTI->isLoweredToCall(CI->getCalledFunction())) { in findTRECandidate()
496 auto I = CI->arg_begin(), E = CI->arg_end(); in findTRECandidate()
504 return CI; in findTRECandidate()
507 void TailRecursionEliminator::createTailRecurseLoopHeader(CallInst *CI) { in createTailRecurseLoopHeader() argument
513 BI->setDebugLoc(CI->getDebugLoc()); in createTailRecurseLoopHeader()
591 void TailRecursionEliminator::copyByValueOperandIntoLocalTemp(CallInst *CI, in copyByValueOperandIntoLocalTemp() argument
593 Type *AggTy = CI->getParamByValType(OpndIdx); in copyByValueOperandIntoLocalTemp()
598 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne()); in copyByValueOperandIntoLocalTemp()
604 CI->getArgOperand(OpndIdx)->getName(), &*F.getEntryBlock().begin()); in copyByValueOperandIntoLocalTemp()
606 IRBuilder<> Builder(CI); in copyByValueOperandIntoLocalTemp()
611 CI->getArgOperand(OpndIdx), in copyByValueOperandIntoLocalTemp()
613 CI->setArgOperand(OpndIdx, NewAlloca); in copyByValueOperandIntoLocalTemp()
619 CallInst *CI, int OpndIdx) { in copyLocalTempOfByValueOperandIntoArguments() argument
620 Type *AggTy = CI->getParamByValType(OpndIdx); in copyLocalTempOfByValueOperandIntoArguments()
625 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne()); in copyLocalTempOfByValueOperandIntoArguments()
627 IRBuilder<> Builder(CI); in copyLocalTempOfByValueOperandIntoArguments()
633 CI->getArgOperand(OpndIdx), in copyLocalTempOfByValueOperandIntoArguments()
637 bool TailRecursionEliminator::eliminateCall(CallInst *CI) { in eliminateCall() argument
638 ReturnInst *Ret = cast<ReturnInst>(CI->getParent()->getTerminator()); in eliminateCall()
645 BasicBlock::iterator BBI(CI); in eliminateCall()
647 if (canMoveAboveCall(&*BBI, CI, AA)) in eliminateCall()
654 if (AccPN || !canTransformAccumulatorRecursion(&*BBI, CI)) in eliminateCall()
666 return OptimizationRemark(DEBUG_TYPE, "tailcall-recursion", CI) in eliminateCall()
673 createTailRecurseLoopHeader(CI); in eliminateCall()
676 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) { in eliminateCall()
677 if (CI->isByValArgument(I)) in eliminateCall()
678 copyByValueOperandIntoLocalTemp(CI, I); in eliminateCall()
684 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) { in eliminateCall()
685 if (CI->isByValArgument(I)) { in eliminateCall()
686 copyLocalTempOfByValueOperandIntoArguments(CI, I); in eliminateCall()
695 ArgumentPHIs[I]->addIncoming(CI->getArgOperand(I), BB); in eliminateCall()
704 AccRecInstr->setOperand(AccRecInstr->getOperand(0) != CI, AccPN); in eliminateCall()
709 if (Ret->getReturnValue() == CI || AccRecInstr) { in eliminateCall()
732 NewBI->setDebugLoc(CI->getDebugLoc()); in eliminateCall()
735 CI->eraseFromParent(); // Remove call. in eliminateCall()
826 CallInst *CI = findTRECandidate(&BB); in processBlock() local
828 if (!CI) in processBlock()
844 eliminateCall(CI); in processBlock()
847 CallInst *CI = findTRECandidate(&BB); in processBlock() local
849 if (CI) in processBlock()
850 return eliminateCall(CI); in processBlock()