1//===- SyntheticCountsUtils.h - utilities for count propagation--*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines utilities for synthetic counts propagation. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_ANALYSIS_SYNTHETICCOUNTSUTILS_H 14#define LLVM_ANALYSIS_SYNTHETICCOUNTSUTILS_H 15 16#include "llvm/ADT/STLExtras.h" 17#include "llvm/Analysis/CallGraph.h" 18#include "llvm/Support/ScaledNumber.h" 19 20namespace llvm { 21 22/// Class with methods to propagate synthetic entry counts. 23/// 24/// This class is templated on the type of the call graph and designed to work 25/// with the traditional per-module callgraph and the summary callgraphs used in 26/// ThinLTO. This contains only static methods and alias templates. 27template <typename CallGraphType> class SyntheticCountsUtils { 28public: 29 using Scaled64 = ScaledNumber<uint64_t>; 30 using CGT = GraphTraits<CallGraphType>; 31 using NodeRef = typename CGT::NodeRef; 32 using EdgeRef = typename CGT::EdgeRef; 33 using SccTy = std::vector<NodeRef>; 34 35 // Not all EdgeRef have information about the source of the edge. Hence 36 // NodeRef corresponding to the source of the EdgeRef is explicitly passed. 37 using GetProfCountTy = function_ref<Optional<Scaled64>(NodeRef, EdgeRef)>; 38 using AddCountTy = function_ref<void(NodeRef, Scaled64)>; 39 40 static void propagate(const CallGraphType &CG, GetProfCountTy GetProfCount, 41 AddCountTy AddCount); 42 43private: 44 static void propagateFromSCC(const SccTy &SCC, GetProfCountTy GetProfCount, 45 AddCountTy AddCount); 46}; 47} // namespace llvm 48 49#endif 50