Files
archived-llvm/include/llvm/Transforms/Utils/ImportedFunctionsInliningStatistics.h
Chandler Carruth e3e43d9d57 Sort the remaining #include lines in include/... and lib/....
I did this a long time ago with a janky python script, but now
clang-format has built-in support for this. I fed clang-format every
line with a #include and let it re-sort things according to the precise
LLVM rules for include ordering baked into clang-format these days.

I've reverted a number of files where the results of sorting includes
isn't healthy. Either places where we have legacy code relying on
particular include ordering (where possible, I'll fix these separately)
or where we have particular formatting around #include lines that
I didn't want to disturb in this patch.

This patch is *entirely* mechanical. If you get merge conflicts or
anything, just ignore the changes in this patch and run clang-format
over your #include lines in the files.

Sorry for any noise here, but it is important to keep these things
stable. I was seeing an increasing number of patches with irrelevant
re-ordering of #include lines because clang-format was used. This patch
at least isolates that churn, makes it easy to skip when resolving
conflicts, and gets us to a clean baseline (again).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304787 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-06 11:49:48 +00:00

108 lines
4.3 KiB
C++

//===-- ImportedFunctionsInliningStats.h ------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// Generating inliner statistics for imported functions, mostly useful for
// ThinLTO.
//===----------------------------------------------------------------------===//
#ifndef LLVM_TRANSFORMS_UTILS_IMPORTEDFUNCTIONSINLININGSTATISTICS_H
#define LLVM_TRANSFORMS_UTILS_IMPORTEDFUNCTIONSINLININGSTATISTICS_H
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include <string>
#include <vector>
namespace llvm {
class Module;
class Function;
/// \brief Calculate and dump ThinLTO specific inliner stats.
/// The main statistics are:
/// (1) Number of inlined imported functions,
/// (2) Number of imported functions inlined into importing module (indirect),
/// (3) Number of non imported functions inlined into importing module
/// (indirect).
/// The difference between first and the second is that first stat counts
/// all performed inlines on imported functions, but the second one only the
/// functions that have been eventually inlined to a function in the importing
/// module (by a chain of inlines). Because llvm uses bottom-up inliner, it is
/// possible to e.g. import function `A`, `B` and then inline `B` to `A`,
/// and after this `A` might be too big to be inlined into some other function
/// that calls it. It calculates this statistic by building graph, where
/// the nodes are functions, and edges are performed inlines and then by marking
/// the edges starting from not imported function.
///
/// If `Verbose` is set to true, then it also dumps statistics
/// per each inlined function, sorted by the greatest inlines count like
/// - number of performed inlines
/// - number of performed inlines to importing module
class ImportedFunctionsInliningStatistics {
private:
/// InlineGraphNode represents node in graph of inlined functions.
struct InlineGraphNode {
// Default-constructible and movable.
InlineGraphNode() = default;
InlineGraphNode(InlineGraphNode &&) = default;
InlineGraphNode &operator=(InlineGraphNode &&) = default;
llvm::SmallVector<InlineGraphNode *, 8> InlinedCallees;
/// Incremented every direct inline.
int32_t NumberOfInlines = 0;
/// Number of inlines into non imported function (possibly indirect via
/// intermediate inlines). Computed based on graph search.
int32_t NumberOfRealInlines = 0;
bool Imported = false;
bool Visited = false;
};
public:
ImportedFunctionsInliningStatistics() = default;
ImportedFunctionsInliningStatistics(
const ImportedFunctionsInliningStatistics &) = delete;
/// Set information like AllFunctions, ImportedFunctions, ModuleName.
void setModuleInfo(const Module &M);
/// Record inline of @param Callee to @param Caller for statistis.
void recordInline(const Function &Caller, const Function &Callee);
/// Dump stats computed with InlinerStatistics class.
/// If @param Verbose is true then separate statistics for every inlined
/// function will be printed.
void dump(bool Verbose);
private:
/// Creates new Node in NodeMap and sets attributes, or returns existed one.
InlineGraphNode &createInlineGraphNode(const Function &);
void calculateRealInlines();
void dfs(InlineGraphNode &GraphNode);
using NodesMapTy =
llvm::StringMap<std::unique_ptr<InlineGraphNode>>;
using SortedNodesTy =
std::vector<const NodesMapTy::MapEntryTy*>;
/// Returns vector of elements sorted by
/// (-NumberOfInlines, -NumberOfRealInlines, FunctionName).
SortedNodesTy getSortedNodes();
private:
/// This map manage life of all InlineGraphNodes. Unique pointer to
/// InlineGraphNode used since the node pointers are also saved in the
/// InlinedCallees vector. If it would store InlineGraphNode instead then the
/// address of the node would not be invariant.
NodesMapTy NodesMap;
/// Non external functions that have some other function inlined inside.
std::vector<StringRef> NonImportedCallers;
int AllFunctions = 0;
int ImportedFunctions = 0;
StringRef ModuleName;
};
} // llvm
#endif // LLVM_TRANSFORMS_UTILS_IMPORTEDFUNCTIONSINLININGSTATISTICS_H