Lines Matching full:cb

86 static void addNonNullAttribute(CallBase &CB, Value *Op) {
88 for (auto &I : CB.args()) {
90 CB.addParamAttr(ArgNo, Attribute::NonNull);
95 static void setConstantInArgument(CallBase &CB, Value *Op,
98 for (auto &I : CB.args()) {
102 CB.removeParamAttr(ArgNo, Attribute::NonNull);
103 CB.setArgOperand(ArgNo, ConstValue);
109 static bool isCondRelevantToAnyCallArgument(ICmpInst *Cmp, CallBase &CB) {
113 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I, ++ArgNo) {
115 if (isa<Constant>(*I) || CB.paramHasAttr(ArgNo, Attribute::NonNull))
128 /// if it is relevant to any argument at CB.
129 static void recordCondition(CallBase &CB, BasicBlock *From, BasicBlock *To,
142 if (isCondRelevantToAnyCallArgument(Cmp, CB))
148 /// Record ICmp conditions relevant to any argument in CB following Pred's
152 static void recordConditions(CallBase &CB, BasicBlock *Pred,
159 recordCondition(CB, From, To, Conditions);
165 static void addConditions(CallBase &CB, const ConditionsTy &Conditions) {
170 setConstantInArgument(CB, Arg, ConstVal);
173 addNonNullAttribute(CB, Arg);
184 static bool canSplitCallSite(CallBase &CB, TargetTransformInfo &TTI) {
185 if (CB.isConvergent() || CB.cannotDuplicate())
190 if (!isa<CallInst>(CB))
193 BasicBlock *CallSiteBB = CB.getParent();
211 llvm::make_range(CallSiteBB->begin(), CB.getIterator())) {
302 static void splitCallSite(CallBase &CB,
305 BasicBlock *TailBB = CB.getParent();
306 bool IsMustTailCall = CB.isMustTailCall();
313 if (!IsMustTailCall && !CB.use_empty()) {
314 CallPN = PHINode::Create(CB.getType(), Preds.size(), "phi.call");
315 CallPN->setDebugLoc(CB.getDebugLoc());
318 LLVM_DEBUG(dbgs() << "split call-site : " << CB << " into \n");
327 TailBB, PredBB, &*std::next(CB.getIterator()), ValueToValueMaps[i],
338 for (auto &CI : CB.args()) {
352 copyMustTailReturn(SplitBlock, &CB, NewCI);
379 CB.replaceAllUsesWith(CallPN);
389 auto I = CB.getReverseIterator();
416 static bool isPredicatedOnPHI(CallBase &CB) {
417 BasicBlock *Parent = CB.getParent();
418 if (&CB != Parent->getFirstNonPHIOrDbg())
422 for (auto &Arg : CB.args()) {
443 static PredsWithCondsTy shouldSplitOnPHIPredicatedArgument(CallBase &CB) {
444 if (!isPredicatedOnPHI(CB))
447 auto Preds = getTwoPredecessors(CB.getParent());
454 static PredsWithCondsTy shouldSplitOnPredicatedArgument(CallBase &CB,
456 auto Preds = getTwoPredecessors(CB.getParent());
465 auto *CSDTNode = DTU.getDomTree().getNode(CB.getParent());
472 recordCondition(CB, Pred, CB.getParent(), Conditions);
474 recordConditions(CB, Pred, Conditions, StopAt);
486 static bool tryToSplitCallSite(CallBase &CB, TargetTransformInfo &TTI,
489 if (!CB.arg_size() || !canSplitCallSite(CB, TTI))
492 auto PredsWithConds = shouldSplitOnPredicatedArgument(CB, DTU);
494 PredsWithConds = shouldSplitOnPHIPredicatedArgument(CB);
498 splitCallSite(CB, PredsWithConds, DTU);
515 CallBase *CB = dyn_cast<CallBase>(&*II++);
516 if (!CB || isa<IntrinsicInst>(CB) || isInstructionTriviallyDead(CB, &TLI))
519 Function *Callee = CB->getCalledFunction();
525 bool IsMustTail = CB->isMustTailCall();
527 Changed |= tryToSplitCallSite(*CB, TTI, DTU);