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