|  | #include "llvm/Analysis/StaticDataProfileInfo.h" | 
|  | #include "llvm/Analysis/ProfileSummaryInfo.h" | 
|  | #include "llvm/IR/Constant.h" | 
|  | #include "llvm/IR/GlobalVariable.h" | 
|  | #include "llvm/InitializePasses.h" | 
|  | #include "llvm/ProfileData/InstrProf.h" | 
|  |  | 
|  | using namespace llvm; | 
|  | void StaticDataProfileInfo::addConstantProfileCount( | 
|  | const Constant *C, std::optional<uint64_t> Count) { | 
|  | if (!Count) { | 
|  | ConstantWithoutCounts.insert(C); | 
|  | return; | 
|  | } | 
|  | uint64_t &OriginalCount = ConstantProfileCounts[C]; | 
|  | OriginalCount = llvm::SaturatingAdd(*Count, OriginalCount); | 
|  | // Clamp the count to getInstrMaxCountValue. InstrFDO reserves a few | 
|  | // large values for special use. | 
|  | if (OriginalCount > getInstrMaxCountValue()) | 
|  | OriginalCount = getInstrMaxCountValue(); | 
|  | } | 
|  |  | 
|  | std::optional<uint64_t> | 
|  | StaticDataProfileInfo::getConstantProfileCount(const Constant *C) const { | 
|  | auto I = ConstantProfileCounts.find(C); | 
|  | if (I == ConstantProfileCounts.end()) | 
|  | return std::nullopt; | 
|  | return I->second; | 
|  | } | 
|  |  | 
|  | StringRef StaticDataProfileInfo::getConstantSectionPrefix( | 
|  | const Constant *C, const ProfileSummaryInfo *PSI) const { | 
|  | auto Count = getConstantProfileCount(C); | 
|  | if (!Count) | 
|  | return ""; | 
|  | // The accummulated counter shows the constant is hot. Return 'hot' whether | 
|  | // this variable is seen by unprofiled functions or not. | 
|  | if (PSI->isHotCount(*Count)) | 
|  | return "hot"; | 
|  | // The constant is not hot, and seen by unprofiled functions. We don't want to | 
|  | // assign it to unlikely sections, even if the counter says 'cold'. So return | 
|  | // an empty prefix before checking whether the counter is cold. | 
|  | if (ConstantWithoutCounts.count(C)) | 
|  | return ""; | 
|  | // The accummulated counter shows the constant is cold. Return 'unlikely'. | 
|  | if (PSI->isColdCount(*Count)) | 
|  | return "unlikely"; | 
|  | // The counter says lukewarm. Return an empty prefix. | 
|  | return ""; | 
|  | } | 
|  |  | 
|  | bool StaticDataProfileInfoWrapperPass::doInitialization(Module &M) { | 
|  | Info.reset(new StaticDataProfileInfo()); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool StaticDataProfileInfoWrapperPass::doFinalization(Module &M) { | 
|  | Info.reset(); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | INITIALIZE_PASS(StaticDataProfileInfoWrapperPass, "static-data-profile-info", | 
|  | "Static Data Profile Info", false, true) | 
|  |  | 
|  | StaticDataProfileInfoWrapperPass::StaticDataProfileInfoWrapperPass() | 
|  | : ImmutablePass(ID) {} | 
|  |  | 
|  | char StaticDataProfileInfoWrapperPass::ID = 0; |