diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp index 9dc7173bf529..73ad42fb5824 100644 --- a/llvm/lib/Transforms/IPO/SampleProfile.cpp +++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp @@ -1948,7 +1948,12 @@ bool SampleProfileLoader::doInitialization(Module &M, Reader = std::move(ReaderOrErr.get()); Reader->setSkipFlatProf(LTOPhase == ThinOrFullLTOPhase::ThinLTOPostLink); Reader->collectFuncsFrom(M); - ProfileIsValid = (Reader->read() == sampleprof_error::success); + if (std::error_code EC = Reader->read()) { + std::string Msg = "profile reading failed: " + EC.message(); + Ctx.diagnose(DiagnosticInfoSampleProfile(Filename, Msg)); + return false; + } + PSL = Reader->getProfileSymbolList(); // While profile-sample-accurate is on, ignore symbol list. @@ -2001,8 +2006,6 @@ ModulePass *llvm::createSampleProfileLoaderPass(StringRef Name) { bool SampleProfileLoader::runOnModule(Module &M, ModuleAnalysisManager *AM, ProfileSummaryInfo *_PSI, CallGraph *CG) { - if (!ProfileIsValid) - return false; GUIDToFuncNameMapper Mapper(M, *Reader, GUIDToFuncNameMap); PSI = _PSI; diff --git a/llvm/test/Transforms/SampleProfile/Inputs/bad.extbinary.afdo b/llvm/test/Transforms/SampleProfile/Inputs/bad.extbinary.afdo new file mode 100644 index 000000000000..173bdde2d045 Binary files /dev/null and b/llvm/test/Transforms/SampleProfile/Inputs/bad.extbinary.afdo differ diff --git a/llvm/test/Transforms/SampleProfile/profile-format.ll b/llvm/test/Transforms/SampleProfile/profile-format.ll index 3809a9618a39..72765c305490 100644 --- a/llvm/test/Transforms/SampleProfile/profile-format.ll +++ b/llvm/test/Transforms/SampleProfile/profile-format.ll @@ -8,6 +8,8 @@ ; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/inline.md5extbinary.afdo -S | FileCheck %s ; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/inline.fixlenmd5.extbinary.afdo -S | FileCheck %s ; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/inline.fixlenmd5.extbinary.afdo -S | FileCheck %s +; RUN: not opt < %s -sample-profile -sample-profile-file=%S/Inputs/bad.extbinary.afdo -S 2>&1 | FileCheck %s -check-prefix=BAD-PROFILE +; RUN: not opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/bad.extbinary.afdo -S 2>&1 | FileCheck %s -check-prefix=BAD-PROFILE ; Original C++ test case ; @@ -38,6 +40,9 @@ ; CHECK: ![[IDX2]] = !{!"branch_weights", i32 5280, i32 113} ; CHECK: ![[IDX3]] = !{!"branch_weights", i32 1} +; Check sample-profile phase will report error when it is reading a bad profile. +; BAD-PROFILE: error: {{.*}}bad.extbinary.afdo: profile reading failed: Malformed sample profile data + ; Function Attrs: nounwind uwtable define i32 @_Z3sumii(i32 %x, i32 %y) #0 !dbg !4 { entry: