================ @@ -572,6 +575,89 @@ CallBase &llvm::promoteCallWithIfThenElse(CallBase &CB, Function *Callee, return promoteCall(NewInst, Callee); } +CallBase *llvm::promoteCallWithIfThenElse(CallBase &CB, Function &Callee, + PGOContextualProfile &CtxProf) { + assert(CB.isIndirectCall()); + if (!CtxProf.isFunctionKnown(Callee)) + return nullptr; + auto &Caller = *CB.getParent()->getParent(); + auto *CSInstr = CtxProfAnalysis::getCallsiteInstrumentation(CB); + if (!CSInstr) + return nullptr; + const auto CSIndex = CSInstr->getIndex()->getZExtValue(); + + CallBase &DirectCall = promoteCall( + versionCallSite(CB, &Callee, /*BranchWeights=*/nullptr), &Callee); + CSInstr->moveBefore(&CB); + const auto NewCSID = CtxProf.allocateNextCallsiteIndex(Caller); + auto *NewCSInstr = cast<InstrProfCallsite>(CSInstr->clone()); + NewCSInstr->setIndex(NewCSID); + NewCSInstr->setCallee(&Callee); + NewCSInstr->insertBefore(&DirectCall); + auto &DirectBB = *DirectCall.getParent(); + auto &IndirectBB = *CB.getParent(); + + assert((CtxProfAnalysis::getBBInstrumentation(IndirectBB) == nullptr) && + "The ICP direct BB is new, it shouldn't have instrumentation"); + assert((CtxProfAnalysis::getBBInstrumentation(DirectBB) == nullptr) && + "The ICP indirect BB is new, it shouldn't have instrumentation"); + + // Make the 2 new BBs have counters. + const uint32_t DirectID = CtxProf.allocateNextCounterIndex(Caller); + const uint32_t IndirectID = CtxProf.allocateNextCounterIndex(Caller); + const uint32_t NewCountersSize = IndirectID + 1; + auto *EntryBBIns = + CtxProfAnalysis::getBBInstrumentation(Caller.getEntryBlock()); + auto *DirectBBIns = cast<InstrProfCntrInstBase>(EntryBBIns->clone()); + DirectBBIns->setIndex(DirectID); + DirectBBIns->insertInto(&DirectBB, DirectBB.getFirstInsertionPt()); + + auto *IndirectBBIns = cast<InstrProfCntrInstBase>(EntryBBIns->clone()); + IndirectBBIns->setIndex(IndirectID); + IndirectBBIns->insertInto(&IndirectBB, IndirectBB.getFirstInsertionPt()); + + const GlobalValue::GUID CalleeGUID = AssignGUIDPass::getGUID(Callee); + + auto ProfileUpdater = [&](PGOCtxProfContext &Ctx) { + assert(Ctx.guid() == AssignGUIDPass::getGUID(Caller)); + assert(NewCountersSize - 2 == Ctx.counters().size()); + // Regardless what next, all the ctx-es belonging to a function must have ---------------- mtrofin wrote:
dropped. https://github.com/llvm/llvm-project/pull/105469 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits