[PATCH] CodeGen: Emit warnings when dropping profile data during PGO
Bob Wilson
bob.wilson at apple.com
Thu Apr 10 13:46:10 PDT 2014
On Apr 10, 2014, at 11:53 AM, Justin Bogner <mail at justinbogner.com> wrote:
> This adds a warning that triggers when profile data doesn't match for
> the source that's being compiled with -fprofile-instr-use=. This fires
> only once per translation unit, as warning on every mismatched function
> would be quite noisy.
>
> The warning is added to DiagnosticSemaKinds because several other
> warnings in IRGen seem to live there and there is no
> DiagnosticCodeGenKinds. If there's a more appropriate place, please let
> me know.
> diff --git a/include/clang/Basic/DiagnosticGroups.td b/include/clang/Basic/Diag\
> nosticGroups.td
> index c21a313..d6e0d64 100644
> --- a/include/clang/Basic/DiagnosticGroups.td
> +++ b/include/clang/Basic/DiagnosticGroups.td
> @@ -665,3 +665,6 @@ def BackendInlineAsm : DiagGroup<"inline-asm">;
> def BackendFrameLargerThan : DiagGroup<"frame-larger-than">;
> def BackendPlugin : DiagGroup<"backend-plugin">;
> def RemarkBackendPlugin : DiagGroup<"remark-backend-plugin">;
> +
> +// Instrumentation based profiling warnings.
> +def InstrProfMismatch : DiagGroup<"instr-prof-mismatch">;
I know we had already discussed that warning name, but I’m now wondering whether it should be “profile-instr-mismatch” to match the command line options. What do you think?
> diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/D\
> iagnosticSemaKinds.td
> index 0eefcd7..a213430 100644
> --- a/include/clang/Basic/DiagnosticSemaKinds.td
> +++ b/include/clang/Basic/DiagnosticSemaKinds.td
> @@ -6981,4 +6981,10 @@ def warn_not_a_doxygen_trailing_member_comment : Warning\
> <
> "not a Doxygen trailing comment">, InGroup<Documentation>, DefaultIgnore;
> } // end of documentation issue category
>
> +let CategoryName = "Instrumentation Issue" in {
> +def warn_profile_data_dropped : Warning<
> + "profile data mismatch for %0 of the %1 function%s1 in the translation unit"\
> >,
> + InGroup<InstrProfMismatch>;
> +} // end of instrumentation issue category
> +
> } // end of sema component.
>
This still doesn’t say much about what effect the mismatch may have or how to fix it. Maybe something like:
"mismatched profile data ignored for %0 of %1 function%s1; updating the profile may improve optimizations”
> diff --git a/lib/CodeGen/CodeGenPGO.cpp b/lib/CodeGen/CodeGenPGO.cpp
> index 2e562ca..2047302 100644
> --- a/lib/CodeGen/CodeGenPGO.cpp
> +++ b/lib/CodeGen/CodeGenPGO.cpp
> @@ -273,6 +273,12 @@ llvm::GlobalVariable *CodeGenPGO::buildDataVar() {
> return Data;
> }
>
> +void CodeGenPGO::updateInstrumentationStats(InstrProfStats &Stats) {
> + if (HasMismatchedData)
> + Stats.MismatchedFunctions++;
> + Stats.VisitedFunctions++;
> +}
> +
> void CodeGenPGO::emitInstrumentationData() {
> if (!CGM.getCodeGenOpts().ProfileInstrGenerate)
> return;
> @@ -949,9 +955,12 @@ void CodeGenPGO::loadRegionCounts(PGOProfileData *PGOData)\
> {
> // hash value based on some characteristics of the input.
> RegionCounts.reset(new std::vector<uint64_t>);
> uint64_t Hash;
> - if (PGOData->getFunctionCounts(getFuncName(), Hash, *RegionCounts) ||
> - Hash != FunctionHash || RegionCounts->size() != NumRegionCounters)
> + if (PGOData->getFunctionCounts(getFuncName(), Hash, *RegionCounts))
> RegionCounts.reset();
> + if (Hash != FunctionHash || RegionCounts->size() != NumRegionCounters) {
> + HasMismatchedData = true;
> + RegionCounts.reset();
> + }
> }
>
> void CodeGenPGO::destroyRegionCounters() {
Isn’t there a way to update the stats directly from CodeGenPGO::loadRegionCounts? I don’t see why you need to add the new updateInstrumentationStats function.
More information about the cfe-commits
mailing list