Lines Matching full: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);
468 // this block. If so, set CI to it. in findTRECandidate()
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 // If the new branch preserves the debug location of CI, it could result in in createTailRecurseLoopHeader()
514 // misleading stepping, if CI is located in a conditional branch. in createTailRecurseLoopHeader()
593 void TailRecursionEliminator::copyByValueOperandIntoLocalTemp(CallInst *CI, in copyByValueOperandIntoLocalTemp() argument
595 Type *AggTy = CI->getParamByValType(OpndIdx); in copyByValueOperandIntoLocalTemp()
600 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne()); in copyByValueOperandIntoLocalTemp()
606 CI->getArgOperand(OpndIdx)->getName(), F.getEntryBlock().begin()); in copyByValueOperandIntoLocalTemp()
608 IRBuilder<> Builder(CI); in copyByValueOperandIntoLocalTemp()
613 CI->getArgOperand(OpndIdx), in copyByValueOperandIntoLocalTemp()
615 CI->setArgOperand(OpndIdx, NewAlloca); in copyByValueOperandIntoLocalTemp()
621 CallInst *CI, int OpndIdx) { in copyLocalTempOfByValueOperandIntoArguments() argument
622 Type *AggTy = CI->getParamByValType(OpndIdx); in copyLocalTempOfByValueOperandIntoArguments()
627 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne()); in copyLocalTempOfByValueOperandIntoArguments()
629 IRBuilder<> Builder(CI); in copyLocalTempOfByValueOperandIntoArguments()
635 CI->getArgOperand(OpndIdx), in copyLocalTempOfByValueOperandIntoArguments()
639 bool TailRecursionEliminator::eliminateCall(CallInst *CI) { in eliminateCall() argument
640 ReturnInst *Ret = cast<ReturnInst>(CI->getParent()->getTerminator()); in eliminateCall()
647 BasicBlock::iterator BBI(CI); in eliminateCall()
649 if (canMoveAboveCall(&*BBI, CI, AA)) in eliminateCall()
656 if (AccPN || !canTransformAccumulatorRecursion(&*BBI, CI)) in eliminateCall()
668 return OptimizationRemark(DEBUG_TYPE, "tailcall-recursion", CI) in eliminateCall()
675 createTailRecurseLoopHeader(CI); in eliminateCall()
678 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) { in eliminateCall()
679 if (CI->isByValArgument(I)) in eliminateCall()
680 copyByValueOperandIntoLocalTemp(CI, I); in eliminateCall()
686 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) { in eliminateCall()
687 if (CI->isByValArgument(I)) { in eliminateCall()
688 copyLocalTempOfByValueOperandIntoArguments(CI, I); in eliminateCall()
697 ArgumentPHIs[I]->addIncoming(CI->getArgOperand(I), BB); in eliminateCall()
706 AccRecInstr->setOperand(AccRecInstr->getOperand(0) != CI, AccPN); in eliminateCall()
711 if (Ret->getReturnValue() == CI || AccRecInstr) { in eliminateCall()
735 NewBI->setDebugLoc(CI->getDebugLoc()); in eliminateCall()
738 CI->eraseFromParent(); // Remove call. in eliminateCall()
832 CallInst *CI = findTRECandidate(&BB); in processBlock() local
834 if (!CI) in processBlock()
850 eliminateCall(CI); in processBlock()
853 CallInst *CI = findTRECandidate(&BB); in processBlock() local
855 if (CI) in processBlock()
856 return eliminateCall(CI); in processBlock()