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/STLFunctionalExtras.h" 17 #include "llvm/Analysis/CallGraph.h" 18 #include "llvm/Support/ScaledNumber.h" 19 20 namespace 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. 27 template <typename CallGraphType> class SyntheticCountsUtils { 28 public: 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 = 38 function_ref<std::optional<Scaled64>(NodeRef, EdgeRef)>; 39 using AddCountTy = function_ref<void(NodeRef, Scaled64)>; 40 41 static void propagate(const CallGraphType &CG, GetProfCountTy GetProfCount, 42 AddCountTy AddCount); 43 44 private: 45 static void propagateFromSCC(const SccTy &SCC, GetProfCountTy GetProfCount, 46 AddCountTy AddCount); 47 }; 48 } // namespace llvm 49 50 #endif 51