diff options
Diffstat (limited to 'llvm/lib/IR/ProfDataUtils.cpp')
-rw-r--r-- | llvm/lib/IR/ProfDataUtils.cpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/llvm/lib/IR/ProfDataUtils.cpp b/llvm/lib/IR/ProfDataUtils.cpp index 99029c1..edeca97 100644 --- a/llvm/lib/IR/ProfDataUtils.cpp +++ b/llvm/lib/IR/ProfDataUtils.cpp @@ -12,6 +12,7 @@ #include "llvm/IR/ProfDataUtils.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" @@ -19,6 +20,7 @@ #include "llvm/IR/LLVMContext.h" #include "llvm/IR/MDBuilder.h" #include "llvm/IR/Metadata.h" +#include "llvm/Support/CommandLine.h" using namespace llvm; @@ -84,10 +86,31 @@ static void extractFromBranchWeightMD(const MDNode *ProfileData, } } +/// Push the weights right to fit in uint32_t. +static SmallVector<uint32_t> fitWeights(ArrayRef<uint64_t> Weights) { + SmallVector<uint32_t> Ret; + Ret.reserve(Weights.size()); + uint64_t Max = *llvm::max_element(Weights); + if (Max > UINT_MAX) { + unsigned Offset = 32 - llvm::countl_zero(Max); + for (const uint64_t &Value : Weights) + Ret.push_back(static_cast<uint32_t>(Value >> Offset)); + } else { + append_range(Ret, Weights); + } + return Ret; +} + } // namespace namespace llvm { - +cl::opt<bool> ElideAllZeroBranchWeights("elide-all-zero-branch-weights", +#if defined(LLVM_ENABLE_PROFCHECK) + cl::init(false) +#else + cl::init(true) +#endif +); const char *MDProfLabels::BranchWeights = "branch_weights"; const char *MDProfLabels::ExpectedBranchWeights = "expected"; const char *MDProfLabels::ValueProfile = "VP"; @@ -282,12 +305,23 @@ bool hasExplicitlyUnknownBranchWeights(const Instruction &I) { } void setBranchWeights(Instruction &I, ArrayRef<uint32_t> Weights, - bool IsExpected) { + bool IsExpected, bool ElideAllZero) { + if ((ElideAllZeroBranchWeights && ElideAllZero) && + llvm::all_of(Weights, [](uint32_t V) { return V == 0; })) { + I.setMetadata(LLVMContext::MD_prof, nullptr); + return; + } + MDBuilder MDB(I.getContext()); MDNode *BranchWeights = MDB.createBranchWeights(Weights, IsExpected); I.setMetadata(LLVMContext::MD_prof, BranchWeights); } +void setFittedBranchWeights(Instruction &I, ArrayRef<uint64_t> Weights, + bool IsExpected, bool ElideAllZero) { + setBranchWeights(I, fitWeights(Weights), IsExpected, ElideAllZero); +} + SmallVector<uint32_t> downscaleWeights(ArrayRef<uint64_t> Weights, std::optional<uint64_t> KnownMaxCount) { uint64_t MaxCount = KnownMaxCount.has_value() ? KnownMaxCount.value() |