123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- ////===- SampleProfileLoadBaseUtil.h - Profile loader util func --*- C++-*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- /// \file
- /// This file provides the utility functions for the sampled PGO loader base
- /// implementation.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_TRANSFORMS_UTILS_SAMPLEPROFILELOADERBASEUTIL_H
- #define LLVM_TRANSFORMS_UTILS_SAMPLEPROFILELOADERBASEUTIL_H
- #include "llvm/ADT/DenseMap.h"
- #include "llvm/ProfileData/SampleProf.h"
- #include "llvm/Support/CommandLine.h"
- namespace llvm {
- using namespace sampleprof;
- class ProfileSummaryInfo;
- class Module;
- extern cl::opt<unsigned> SampleProfileMaxPropagateIterations;
- extern cl::opt<unsigned> SampleProfileRecordCoverage;
- extern cl::opt<unsigned> SampleProfileSampleCoverage;
- extern cl::opt<bool> NoWarnSampleUnused;
- namespace sampleprofutil {
- class SampleCoverageTracker {
- public:
- bool markSamplesUsed(const FunctionSamples *FS, uint32_t LineOffset,
- uint32_t Discriminator, uint64_t Samples);
- unsigned computeCoverage(unsigned Used, unsigned Total) const;
- unsigned countUsedRecords(const FunctionSamples *FS,
- ProfileSummaryInfo *PSI) const;
- unsigned countBodyRecords(const FunctionSamples *FS,
- ProfileSummaryInfo *PSI) const;
- uint64_t getTotalUsedSamples() const { return TotalUsedSamples; }
- uint64_t countBodySamples(const FunctionSamples *FS,
- ProfileSummaryInfo *PSI) const;
- void clear() {
- SampleCoverage.clear();
- TotalUsedSamples = 0;
- }
- void setProfAccForSymsInList(bool V) { ProfAccForSymsInList = V; }
- private:
- using BodySampleCoverageMap = std::map<LineLocation, unsigned>;
- using FunctionSamplesCoverageMap =
- DenseMap<const FunctionSamples *, BodySampleCoverageMap>;
- /// Coverage map for sampling records.
- ///
- /// This map keeps a record of sampling records that have been matched to
- /// an IR instruction. This is used to detect some form of staleness in
- /// profiles (see flag -sample-profile-check-coverage).
- ///
- /// Each entry in the map corresponds to a FunctionSamples instance. This is
- /// another map that counts how many times the sample record at the
- /// given location has been used.
- FunctionSamplesCoverageMap SampleCoverage;
- /// Number of samples used from the profile.
- ///
- /// When a sampling record is used for the first time, the samples from
- /// that record are added to this accumulator. Coverage is later computed
- /// based on the total number of samples available in this function and
- /// its callsites.
- ///
- /// Note that this accumulator tracks samples used from a single function
- /// and all the inlined callsites. Strictly, we should have a map of counters
- /// keyed by FunctionSamples pointers, but these stats are cleared after
- /// every function, so we just need to keep a single counter.
- uint64_t TotalUsedSamples = 0;
- // For symbol in profile symbol list, whether to regard their profiles
- // to be accurate. This is passed from the SampleLoader instance.
- bool ProfAccForSymsInList = false;
- };
- /// Return true if the given callsite is hot wrt to hot cutoff threshold.
- bool callsiteIsHot(const FunctionSamples *CallsiteFS, ProfileSummaryInfo *PSI,
- bool ProfAccForSymsInList);
- /// Create a global variable to flag FSDiscriminators are used.
- void createFSDiscriminatorVariable(Module *M);
- } // end of namespace sampleprofutil
- } // end of namespace llvm
- #endif // LLVM_TRANSFORMS_UTILS_SAMPLEPROFILELOADERBASEUTIL_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|