//===- llvm/Analysis/ProfileSummaryInfo.h - profile summary ---*- 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 // //===----------------------------------------------------------------------===// // // This file contains a pass that provides access to profile summary // information. // //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_PROFILESUMMARYINFO_H #define LLVM_ANALYSIS_PROFILESUMMARYINFO_H #include "llvm/ADT/DenseMap.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/PassManager.h" #include "llvm/IR/ProfileSummary.h" #include "llvm/Pass.h" #include "llvm/Support/BlockFrequency.h" #include <memory> #include <optional> namespace llvm { class BlockFrequencyInfo; class MachineFunction; /// Analysis providing profile information. /// /// This is an immutable analysis pass that provides ability to query global /// (program-level) profile information. The main APIs are isHotCount and /// isColdCount that tells whether a given profile count is considered hot/cold /// based on the profile summary. This also provides convenience methods to /// check whether a function is hot or cold. // FIXME: Provide convenience methods to determine hotness/coldness of other IR // units. This would require making this depend on BFI. class ProfileSummaryInfo { … }; template <> inline std::optional<uint64_t> ProfileSummaryInfo::getTotalCallCount<Function>(const Function *F) const { … } // Declare template specialization for llvm::MachineFunction. Do not implement // here, because we cannot include MachineFunction header here, that would break // dependency rules. template <> std::optional<Function::ProfileCount> ProfileSummaryInfo::getEntryCount<MachineFunction>( const MachineFunction *F) const; /// An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo. class ProfileSummaryInfoWrapperPass : public ImmutablePass { … }; /// An analysis pass based on the new PM to deliver ProfileSummaryInfo. class ProfileSummaryAnalysis : public AnalysisInfoMixin<ProfileSummaryAnalysis> { … }; /// Printer pass that uses \c ProfileSummaryAnalysis. class ProfileSummaryPrinterPass : public PassInfoMixin<ProfileSummaryPrinterPass> { … }; } // end namespace llvm #endif