From c9cd9a006632419ce7346e50564e6347a93181cc Mon Sep 17 00:00:00 2001 From: Wei Mi Date: Fri, 22 Jan 2021 15:09:21 -0800 Subject: [PATCH] [SampleFDO] Report error when reading a bad/incompatible profile instead of turning off SampleFDO silently. Currently sample loader pass turns off SampleFDO optimization silently when it sees error in reading the profile. This behavior will defeat the tests which could have caught those bad/incompatible profile problems. This patch change the behavior to report error. Differential Revision: https://reviews.llvm.org/D95269 --- llvm/lib/Transforms/IPO/SampleProfile.cpp | 9 ++++++--- .../SampleProfile/Inputs/bad.extbinary.afdo | Bin 0 -> 341 bytes .../Transforms/SampleProfile/profile-format.ll | 5 +++++ 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/SampleProfile/Inputs/bad.extbinary.afdo 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 0000000000000000000000000000000000000000..173bdde2d045188e4dad3d78b637ea5f11c60201 GIT binary patch literal 341 zcmZp9a$)0_lT%g%r?WCZ03(!!QJbKQEGW$clYr7PP!0T0J`0+B5LBKSDz1PguML$~ zhl<10!IZ)D!}xPAGH%pnU}Y4T;I~nmaX~K|kUTJp2S`3xF4V8Z)UZ_oNG>=eH(!(W zzk9nDxK(;e8^lLFNGBYwf(FHnpz9s`Bh+qN{42+Bn07LyfhX4Qo literal 0 HcmV?d00001 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: