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 CI->isNoTailCall() || CI->hasOperandBundlesOtherThan( in markTails()
251 if (!IsNoTail && CI->doesNotAccessMemory()) { in markTails()
260 for (auto &Arg : CI->args()) { in markTails()
272 return OptimizationRemark(DEBUG_TYPE, "tailcall-readnone", CI) in markTails()
275 CI->setTailCall(); in markTails()
281 if (!IsNoTail && Escaped == UNESCAPED && !Tracker.AllocaUsers.count(CI)) in markTails()
282 DeferredTails.push_back(CI); in markTails()
312 for (CallInst *CI : DeferredTails) { in markTails()
313 if (Visited[CI->getParent()] != ESCAPED) { in markTails()
316 LLVM_DEBUG(dbgs() << "Marked as tail call candidate: " << *CI << "\n"); in markTails()
317 CI->setTailCall(); in markTails()
329 static bool canMoveAboveCall(Instruction *I, CallInst *CI, AliasAnalysis *AA) { in canMoveAboveCall() argument
345 if (CI->mayHaveSideEffects()) { in canMoveAboveCall()
351 if (isModSet(AA->getModRefInfo(CI, MemoryLocation::get(L))) || in canMoveAboveCall()
363 return !is_contained(I->operands(), CI); in canMoveAboveCall()
366 static bool canTransformAccumulatorRecursion(Instruction *I, CallInst *CI) { in canTransformAccumulatorRecursion() argument
374 if ((I->getOperand(0) == CI && I->getOperand(1) == CI) || in canTransformAccumulatorRecursion()
375 (I->getOperand(0) != CI && I->getOperand(1) != CI)) in canTransformAccumulatorRecursion()
432 void createTailRecurseLoopHeader(CallInst *CI);
436 bool eliminateCall(CallInst *CI);
442 void copyByValueOperandIntoLocalTemp(CallInst *CI, int OpndIdx);
444 void copyLocalTempOfByValueOperandIntoArguments(CallInst *CI, int OpndIdx);
461 CallInst *CI = nullptr; in findTRECandidate() local
464 CI = dyn_cast<CallInst>(BBI); in findTRECandidate()
465 if (CI && CI->getCalledFunction() == &F) in findTRECandidate()
473 assert((!CI->isTailCall() || !CI->isNoTailCall()) && in findTRECandidate()
475 if (!CI->isTailCall()) in findTRECandidate()
483 firstNonDbg(BB->front().getIterator()) == CI && in findTRECandidate()
484 firstNonDbg(std::next(BB->begin())) == TI && CI->getCalledFunction() && in findTRECandidate()
485 !TTI->isLoweredToCall(CI->getCalledFunction())) { in findTRECandidate()
488 auto I = CI->arg_begin(), E = CI->arg_end(); in findTRECandidate()
496 return CI; in findTRECandidate()
499 void TailRecursionEliminator::createTailRecurseLoopHeader(CallInst *CI) { in createTailRecurseLoopHeader() argument
505 BI->setDebugLoc(CI->getDebugLoc()); in createTailRecurseLoopHeader()
580 void TailRecursionEliminator::copyByValueOperandIntoLocalTemp(CallInst *CI, in copyByValueOperandIntoLocalTemp() argument
582 Type *AggTy = CI->getParamByValType(OpndIdx); in copyByValueOperandIntoLocalTemp()
587 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne()); in copyByValueOperandIntoLocalTemp()
593 CI->getArgOperand(OpndIdx)->getName(), &*F.getEntryBlock().begin()); in copyByValueOperandIntoLocalTemp()
595 IRBuilder<> Builder(CI); in copyByValueOperandIntoLocalTemp()
600 CI->getArgOperand(OpndIdx), in copyByValueOperandIntoLocalTemp()
602 CI->setArgOperand(OpndIdx, NewAlloca); in copyByValueOperandIntoLocalTemp()
608 CallInst *CI, int OpndIdx) { in copyLocalTempOfByValueOperandIntoArguments() argument
609 Type *AggTy = CI->getParamByValType(OpndIdx); in copyLocalTempOfByValueOperandIntoArguments()
614 Align Alignment(CI->getParamAlign(OpndIdx).valueOrOne()); in copyLocalTempOfByValueOperandIntoArguments()
616 IRBuilder<> Builder(CI); in copyLocalTempOfByValueOperandIntoArguments()
622 CI->getArgOperand(OpndIdx), in copyLocalTempOfByValueOperandIntoArguments()
626 bool TailRecursionEliminator::eliminateCall(CallInst *CI) { in eliminateCall() argument
627 ReturnInst *Ret = cast<ReturnInst>(CI->getParent()->getTerminator()); in eliminateCall()
634 BasicBlock::iterator BBI(CI); in eliminateCall()
636 if (canMoveAboveCall(&*BBI, CI, AA)) in eliminateCall()
643 if (AccPN || !canTransformAccumulatorRecursion(&*BBI, CI)) in eliminateCall()
655 return OptimizationRemark(DEBUG_TYPE, "tailcall-recursion", CI) in eliminateCall()
662 createTailRecurseLoopHeader(CI); in eliminateCall()
665 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) { in eliminateCall()
666 if (CI->isByValArgument(I)) in eliminateCall()
667 copyByValueOperandIntoLocalTemp(CI, I); in eliminateCall()
673 for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) { in eliminateCall()
674 if (CI->isByValArgument(I)) { in eliminateCall()
675 copyLocalTempOfByValueOperandIntoArguments(CI, I); in eliminateCall()
678 ArgumentPHIs[I]->addIncoming(CI->getArgOperand(I), BB); in eliminateCall()
687 AccRecInstr->setOperand(AccRecInstr->getOperand(0) != CI, AccPN); in eliminateCall()
692 if (Ret->getReturnValue() == CI || AccRecInstr) { in eliminateCall()
715 NewBI->setDebugLoc(CI->getDebugLoc()); in eliminateCall()
718 BB->getInstList().erase(CI); // Remove call. in eliminateCall()
809 CallInst *CI = findTRECandidate(&BB); in processBlock() local
811 if (!CI) in processBlock()
827 eliminateCall(CI); in processBlock()
830 CallInst *CI = findTRECandidate(&BB); in processBlock() local
832 if (CI) in processBlock()
833 return eliminateCall(CI); in processBlock()