Lines Matching full:cb
88 static void addNonNullAttribute(CallBase &CB, Value *Op) { in addNonNullAttribute() argument
90 for (auto &I : CB.args()) { in addNonNullAttribute()
92 CB.addParamAttr(ArgNo, Attribute::NonNull); in addNonNullAttribute()
97 static void setConstantInArgument(CallBase &CB, Value *Op, in setConstantInArgument() argument
100 for (auto &I : CB.args()) { in setConstantInArgument()
104 CB.removeParamAttr(ArgNo, Attribute::NonNull); in setConstantInArgument()
105 CB.setArgOperand(ArgNo, ConstValue); in setConstantInArgument()
111 static bool isCondRelevantToAnyCallArgument(ICmpInst *Cmp, CallBase &CB) { in isCondRelevantToAnyCallArgument() argument
115 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I, ++ArgNo) { in isCondRelevantToAnyCallArgument()
117 if (isa<Constant>(*I) || CB.paramHasAttr(ArgNo, Attribute::NonNull)) in isCondRelevantToAnyCallArgument()
130 /// if it is relevant to any argument at CB.
131 static void recordCondition(CallBase &CB, BasicBlock *From, BasicBlock *To, in recordCondition() argument
144 if (isCondRelevantToAnyCallArgument(Cmp, CB)) in recordCondition()
150 /// Record ICmp conditions relevant to any argument in CB following Pred's
154 static void recordConditions(CallBase &CB, BasicBlock *Pred, in recordConditions() argument
161 recordCondition(CB, From, To, Conditions); in recordConditions()
167 static void addConditions(CallBase &CB, const ConditionsTy &Conditions) { in addConditions() argument
172 setConstantInArgument(CB, Arg, ConstVal); in addConditions()
175 addNonNullAttribute(CB, Arg); in addConditions()
186 static bool canSplitCallSite(CallBase &CB, TargetTransformInfo &TTI) { in canSplitCallSite() argument
187 if (CB.isConvergent() || CB.cannotDuplicate()) in canSplitCallSite()
192 if (!isa<CallInst>(CB)) in canSplitCallSite()
195 BasicBlock *CallSiteBB = CB.getParent(); in canSplitCallSite()
213 llvm::make_range(CallSiteBB->begin(), CB.getIterator())) { in canSplitCallSite()
305 CallBase &CB, in splitCallSite() argument
308 BasicBlock *TailBB = CB.getParent(); in splitCallSite()
309 bool IsMustTailCall = CB.isMustTailCall(); in splitCallSite()
316 if (!IsMustTailCall && !CB.use_empty()) { in splitCallSite()
317 CallPN = PHINode::Create(CB.getType(), Preds.size(), "phi.call"); in splitCallSite()
318 CallPN->setDebugLoc(CB.getDebugLoc()); in splitCallSite()
321 LLVM_DEBUG(dbgs() << "split call-site : " << CB << " into \n"); in splitCallSite()
330 TailBB, PredBB, &*std::next(CB.getIterator()), ValueToValueMaps[i], in splitCallSite()
341 for (auto &CI : CB.args()) { in splitCallSite()
355 copyMustTailReturn(SplitBlock, &CB, NewCI); in splitCallSite()
382 CB.replaceAllUsesWith(CallPN); in splitCallSite()
392 auto I = CB.getReverseIterator(); in splitCallSite()
417 static bool isPredicatedOnPHI(CallBase &CB) { in isPredicatedOnPHI() argument
418 BasicBlock *Parent = CB.getParent(); in isPredicatedOnPHI()
419 if (&CB != Parent->getFirstNonPHIOrDbg()) in isPredicatedOnPHI()
423 for (auto &Arg : CB.args()) { in isPredicatedOnPHI()
444 static PredsWithCondsTy shouldSplitOnPHIPredicatedArgument(CallBase &CB) { in shouldSplitOnPHIPredicatedArgument() argument
445 if (!isPredicatedOnPHI(CB)) in shouldSplitOnPHIPredicatedArgument()
448 auto Preds = getTwoPredecessors(CB.getParent()); in shouldSplitOnPHIPredicatedArgument()
455 static PredsWithCondsTy shouldSplitOnPredicatedArgument(CallBase &CB, in shouldSplitOnPredicatedArgument() argument
457 auto Preds = getTwoPredecessors(CB.getParent()); in shouldSplitOnPredicatedArgument()
466 auto *CSDTNode = DTU.getDomTree().getNode(CB.getParent()); in shouldSplitOnPredicatedArgument()
473 recordCondition(CB, Pred, CB.getParent(), Conditions); in shouldSplitOnPredicatedArgument()
475 recordConditions(CB, Pred, Conditions, StopAt); in shouldSplitOnPredicatedArgument()
487 static bool tryToSplitCallSite(CallBase &CB, TargetTransformInfo &TTI, in tryToSplitCallSite() argument
490 if (!CB.arg_size() || !canSplitCallSite(CB, TTI)) in tryToSplitCallSite()
493 auto PredsWithConds = shouldSplitOnPredicatedArgument(CB, DTU); in tryToSplitCallSite()
495 PredsWithConds = shouldSplitOnPHIPredicatedArgument(CB); in tryToSplitCallSite()
499 splitCallSite(CB, PredsWithConds, DTU); in tryToSplitCallSite()
517 CallBase *CB = dyn_cast<CallBase>(&*II++); in doCallSiteSplitting() local
518 if (!CB || isa<IntrinsicInst>(CB) || isInstructionTriviallyDead(CB, &TLI)) in doCallSiteSplitting()
521 Function *Callee = CB->getCalledFunction(); in doCallSiteSplitting()
527 bool IsMustTail = CB->isMustTailCall(); in doCallSiteSplitting()
529 Changed |= tryToSplitCallSite(*CB, TTI, DTU); in doCallSiteSplitting()