//===- bolt/Passes/ReorderAlgorithm.h - Basic block reorderng ---*- 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 // //===----------------------------------------------------------------------===// // // Interface to different basic block reordering algorithms. // //===----------------------------------------------------------------------===// #ifndef BOLT_PASSES_REORDER_ALGORITHM_H #define BOLT_PASSES_REORDER_ALGORITHM_H #include "bolt/Core/BinaryFunction.h" #include <memory> #include <unordered_map> #include <vector> namespace llvm { class raw_ostream; namespace bolt { /// Objects of this class implement various basic block clustering algorithms. /// Basic block clusters are chains of basic blocks that should be laid out /// in this order to maximize performace. These algorithms group basic blocks /// into clusters using execution profile data and various heuristics. class ClusterAlgorithm { … }; /// Base class for a greedy clustering algorithm that selects edges in order /// based on some heuristic and uses them to join basic blocks into clusters. class GreedyClusterAlgorithm : public ClusterAlgorithm { … }; /// This clustering algorithm is based on a greedy heuristic suggested by /// Pettis and Hansen (PLDI '90). class PHGreedyClusterAlgorithm : public GreedyClusterAlgorithm { … }; /// This clustering algorithm is based on a greedy heuristic that is a /// modification of the heuristic suggested by Pettis (PLDI '90). It is /// geared towards minimizing branches. class MinBranchGreedyClusterAlgorithm : public GreedyClusterAlgorithm { … }; /// Objects of this class implement various basic block reordering algorithms. /// Most of these algorithms depend on a clustering algorithm. /// Here we have 3 conflicting goals as to how to layout clusters. If we want /// to minimize jump offsets, we should put clusters with heavy inter-cluster /// dependence as close as possible. If we want to maximize the probability /// that all inter-cluster edges are predicted as not-taken, we should enforce /// a topological order to make targets appear after sources, creating forward /// branches. If we want to separate hot from cold blocks to maximize the /// probability that unfrequently executed code doesn't pollute the cache, we /// should put clusters in descending order of hotness. class ReorderAlgorithm { … }; /// Dynamic programming implementation for the TSP, applied to BB layout. Find /// the optimal way to maximize weight during a path traversing all BBs. In /// this way, we will convert the hottest branches into fall-throughs. /// /// Uses exponential amount of memory on the number of basic blocks and should /// only be used for small functions. class TSPReorderAlgorithm : public ReorderAlgorithm { … }; /// Simple algorithm that groups basic blocks into clusters and then /// lays them out cluster after cluster. class OptimizeReorderAlgorithm : public ReorderAlgorithm { … }; /// This reorder algorithm tries to ensure that all inter-cluster edges are /// predicted as not-taken, by enforcing a topological order to make /// targets appear after sources, creating forward branches. class OptimizeBranchReorderAlgorithm : public ReorderAlgorithm { … }; /// This reorder tries to separate hot from cold blocks to maximize the /// probability that unfrequently executed code doesn't pollute the cache, by /// putting clusters in descending order of hotness. class OptimizeCacheReorderAlgorithm : public ReorderAlgorithm { … }; /// A new reordering algorithm for basic blocks, ext-tsp class ExtTSPReorderAlgorithm : public ReorderAlgorithm { … }; /// Toy example that simply reverses the original basic block order. class ReverseReorderAlgorithm : public ReorderAlgorithm { … }; /// Create clusters as usual and place them in random order. class RandomClusterReorderAlgorithm : public ReorderAlgorithm { … }; } // namespace bolt } // namespace llvm #endif