diff --git a/llvm/include/llvm/IR/ProfDataUtils.h b/llvm/include/llvm/IR/ProfDataUtils.h index 404875285beae..b8386ddc86ca8 100644 --- a/llvm/include/llvm/IR/ProfDataUtils.h +++ b/llvm/include/llvm/IR/ProfDataUtils.h @@ -180,7 +180,11 @@ inline uint32_t scaleBranchCount(uint64_t Count, uint64_t Scale) { /// info. LLVM_ABI void setExplicitlyUnknownBranchWeights(Instruction &I); -LLVM_ABI bool isExplicitlyUnknownBranchWeightsMetadata(const MDNode &MD); +/// Analogous to setExplicitlyUnknownBranchWeights, but for functions and their +/// entry counts. +LLVM_ABI void setExplicitlyUnknownFunctionEntryCount(Function &F); + +LLVM_ABI bool isExplicitlyUnknownProfileMetadata(const MDNode &MD); LLVM_ABI bool hasExplicitlyUnknownBranchWeights(const Instruction &I); /// Scaling the profile data attached to 'I' using the ratio of S/T. diff --git a/llvm/lib/IR/ProfDataUtils.cpp b/llvm/lib/IR/ProfDataUtils.cpp index d24263f8b3bda..b41256f599096 100644 --- a/llvm/lib/IR/ProfDataUtils.cpp +++ b/llvm/lib/IR/ProfDataUtils.cpp @@ -250,7 +250,15 @@ void setExplicitlyUnknownBranchWeights(Instruction &I) { MDB.createString(MDProfLabels::UnknownBranchWeightsMarker))); } -bool isExplicitlyUnknownBranchWeightsMetadata(const MDNode &MD) { +void setExplicitlyUnknownFunctionEntryCount(Function &F) { + MDBuilder MDB(F.getContext()); + F.setMetadata( + LLVMContext::MD_prof, + MDNode::get(F.getContext(), + MDB.createString(MDProfLabels::UnknownBranchWeightsMarker))); +} + +bool isExplicitlyUnknownProfileMetadata(const MDNode &MD) { if (MD.getNumOperands() != 1) return false; return MD.getOperand(0).equalsStr(MDProfLabels::UnknownBranchWeightsMarker); @@ -260,7 +268,7 @@ bool hasExplicitlyUnknownBranchWeights(const Instruction &I) { auto *MD = I.getMetadata(LLVMContext::MD_prof); if (!MD) return false; - return isExplicitlyUnknownBranchWeightsMetadata(*MD); + return isExplicitlyUnknownProfileMetadata(*MD); } void setBranchWeights(Instruction &I, ArrayRef Weights, diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index b28515083d1d2..4e71a673bde6b 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -2529,12 +2529,11 @@ void Verifier::verifyFunctionMetadata( for (const auto &Pair : MDs) { if (Pair.first == LLVMContext::MD_prof) { MDNode *MD = Pair.second; - if (isExplicitlyUnknownBranchWeightsMetadata(*MD)) { - CheckFailed("'unknown' !prof metadata should appear only on " - "instructions supporting the 'branch_weights' metadata", - MD); + // We may have functions that are synthesized by the compiler, e.g. in + // WPD, that we can't currently determine the entry count. + if (isExplicitlyUnknownProfileMetadata(*MD)) continue; - } + Check(MD->getNumOperands() >= 2, "!prof annotations should have no less than 2 operands", MD); diff --git a/llvm/lib/Transforms/Utils/ProfileVerify.cpp b/llvm/lib/Transforms/Utils/ProfileVerify.cpp index 41647f7717a43..faacd422c009c 100644 --- a/llvm/lib/Transforms/Utils/ProfileVerify.cpp +++ b/llvm/lib/Transforms/Utils/ProfileVerify.cpp @@ -155,12 +155,15 @@ PreservedAnalyses ProfileVerifierPass::run(Function &F, FunctionAnalysisManager &FAM) { const auto EntryCount = F.getEntryCount(/*AllowSynthetic=*/true); if (!EntryCount) { - F.getContext().emitError("Profile verification failed: function entry " - "count missing (set to 0 if cold)"); + auto *MD = F.getMetadata(LLVMContext::MD_prof); + if (!MD || !isExplicitlyUnknownProfileMetadata(*MD)) { + F.getContext().emitError("Profile verification failed: function entry " + "count missing (set to 0 if cold)"); + return PreservedAnalyses::all(); + } + } else if (EntryCount->getCount() == 0) { return PreservedAnalyses::all(); } - if (EntryCount->getCount() == 0) - return PreservedAnalyses::all(); for (const auto &BB : F) { if (AnnotateSelect) { for (const auto &I : BB) diff --git a/llvm/test/Verifier/branch-weight.ll b/llvm/test/Verifier/branch-weight.ll index 4c87a98359019..d4f92c191e231 100644 --- a/llvm/test/Verifier/branch-weight.ll +++ b/llvm/test/Verifier/branch-weight.ll @@ -11,7 +11,7 @@ ; RUN: opt -passes=verify %t/unknown-correct.ll --disable-output ; RUN: not opt -passes=verify %t/unknown-invalid.ll --disable-output 2>&1 | FileCheck %s --check-prefix=EXTRA-ARGS -; RUN: not opt -passes=verify %t/unknown-on-function1.ll --disable-output 2>&1 | FileCheck %s --check-prefix=ON-FUNCTION1 +; RUN: opt -passes=verify %t/unknown-on-function1.ll -S -o - | FileCheck %s --check-prefix=ON-FUNCTION1 ; RUN: not opt -passes=verify %t/unknown-on-function2.ll --disable-output 2>&1 | FileCheck %s --check-prefix=ON-FUNCTION2 ; RUN: not opt -passes=verify %t/invalid-unknown-placement.ll --disable-output 2>&1 | FileCheck %s --check-prefix=INVALID-UNKNOWN-PLACEMENT @@ -132,7 +132,7 @@ define void @test() !prof !0 { } !0 = !{!"unknown"} -; ON-FUNCTION1: 'unknown' !prof metadata should appear only on instructions supporting the 'branch_weights' metadata +; ON-FUNCTION1: define void @test() !prof !0 ;--- unknown-on-function2.ll define void @test() !prof !0 {