LLVM 22.0.0git
BasicBlockSectionsProfileReader.h
Go to the documentation of this file.
1//===-- BasicBlockSectionsProfileReader.h - BB sections profile reader pass ==//
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 pass creates the basic block cluster info by reading the basic block
10// sections profile. The cluster info will be used by the basic-block-sections
11// pass to arrange basic blocks in their sections.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_BASICBLOCKSECTIONSPROFILEREADER_H
16#define LLVM_CODEGEN_BASICBLOCKSECTIONSPROFILEREADER_H
17
20#include "llvm/ADT/StringMap.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/IR/Module.h"
23#include "llvm/IR/PassManager.h"
25#include "llvm/Pass.h"
26#include "llvm/Support/Error.h"
31
32namespace llvm {
33
34// This struct represents the cluster information for a machine basic block,
35// which is specifed by a unique basic block ID.
37 // Basic block ID.
39 // Cluster ID this basic block belongs to.
40 unsigned ClusterID;
41 // Position of basic block within the cluster.
43};
44
45// This represents the raw input profile for one function.
47 // BB Cluster information specified by `UniqueBBID`s.
49 // Paths to clone. A path a -> b -> c -> d implies cloning b, c, and d along
50 // the edge a -> b (a is not cloned). The index of the path in this vector
51 // determines the `UniqueBBID::CloneID` of the cloned blocks in that path.
53 // Node counts for each basic block.
55 // Edge counts for each edge, stored as a nested map.
57};
58
60public:
63 : MBuf(Buf), LineIt(*Buf, /*SkipBlanks=*/true, /*CommentMarker=*/'#'){};
64
66
67 // Returns true if basic block sections profile exist for function \p
68 // FuncName.
69 bool isFunctionHot(StringRef FuncName) const;
70
71 // Returns a pair with first element representing whether basic block sections
72 // profile exist for the function \p FuncName, and the second element
73 // representing the basic block sections profile (cluster info) for this
74 // function. If the first element is true and the second element is empty, it
75 // means unique basic block sections are desired for all basic blocks of the
76 // function.
77 std::pair<bool, SmallVector<BBClusterInfo>>
79
80 // Returns the path clonings for the given function.
83
84 // Returns the profile count for the edge from `SrcBBID` to `SinkBBID` in
85 // function `FuncName` or zero if it does not exist.
86 uint64_t getEdgeCount(StringRef FuncName, const UniqueBBID &SrcBBID,
87 const UniqueBBID &SinkBBID) const;
88
89private:
90 StringRef getAliasName(StringRef FuncName) const {
91 auto R = FuncAliasMap.find(FuncName);
92 return R == FuncAliasMap.end() ? FuncName : R->second;
93 }
94
95 // Returns a profile parsing error for the current line.
96 Error createProfileParseError(Twine Message) const {
98 Twine("invalid profile " + MBuf->getBufferIdentifier() + " at line " +
99 Twine(LineIt.line_number()) + ": " + Message),
101 }
102
103 // Parses a `UniqueBBID` from `S`. `S` must be in the form "<bbid>"
104 // (representing an original block) or "<bbid>.<cloneid>" (representing a
105 // cloned block) where bbid is a non-negative integer and cloneid is a
106 // positive integer.
107 Expected<UniqueBBID> parseUniqueBBID(StringRef S) const;
108
109 // Reads the basic block sections profile for functions in this module.
110 Error ReadProfile();
111
112 // Reads version 0 profile.
113 // TODO: Remove this function once version 0 is deprecated.
114 Error ReadV0Profile();
115
116 // Reads version 1 profile.
117 Error ReadV1Profile();
118
119 // This contains the basic-block-sections profile.
120 const MemoryBuffer *MBuf = nullptr;
121
122 // Iterator to the line being parsed.
123 line_iterator LineIt;
124
125 // Map from every function name in the module to its debug info filename or
126 // empty string if no debug info is available.
127 StringMap<SmallString<128>> FunctionNameToDIFilename;
128
129 // This contains the BB cluster information for the whole program.
130 //
131 // For every function name, it contains the cloning and cluster information
132 // for (all or some of) its basic blocks. The cluster information for every
133 // basic block includes its cluster ID along with the position of the basic
134 // block in that cluster.
135 StringMap<FunctionPathAndClusterInfo> ProgramPathAndClusterInfo;
136
137 // Some functions have alias names. We use this map to find the main alias
138 // name which appears in ProgramPathAndClusterInfo as a key.
139 StringMap<StringRef> FuncAliasMap;
140};
141
142// Creates a BasicBlockSectionsProfileReader pass to parse the basic block
143// sections profile. \p Buf is a memory buffer that contains the list of
144// functions and basic block ids to selectively enable basic block sections.
147
148/// Analysis pass providing the \c BasicBlockSectionsProfileReader.
149///
150/// Note that this pass's result cannot be invalidated, it is immutable for the
151/// life of the module.
153 : public AnalysisInfoMixin<BasicBlockSectionsProfileReaderAnalysis> {
154
155public:
159
161
162private:
163 const TargetMachine *TM;
164};
165
167public:
168 static char ID;
170
176
182
183 StringRef getPassName() const override {
184 return "Basic Block Sections Profile Reader";
185 }
186
187 bool isFunctionHot(StringRef FuncName) const;
188
189 std::pair<bool, SmallVector<BBClusterInfo>>
190 getClusterInfoForFunction(StringRef FuncName) const;
191
193 getClonePathsForFunction(StringRef FuncName) const;
194
195 uint64_t getEdgeCount(StringRef FuncName, const UniqueBBID &SrcBBID,
196 const UniqueBBID &DestBBID) const;
197
198 // Initializes the FunctionNameToDIFilename map for the current module and
199 // then reads the profile for the matching functions.
200 bool doInitialization(Module &M) override;
201
203};
204
205} // namespace llvm
206#endif // LLVM_CODEGEN_BASICBLOCKSECTIONSPROFILEREADER_H
This file defines the StringMap class.
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:55
This file defines the SmallString class.
This file defines the SmallVector class.
Result run(Function &F, FunctionAnalysisManager &AM)
bool doInitialization(Module &M) override
doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...
SmallVector< SmallVector< unsigned > > getClonePathsForFunction(StringRef FuncName) const
uint64_t getEdgeCount(StringRef FuncName, const UniqueBBID &SrcBBID, const UniqueBBID &DestBBID) const
StringRef getPassName() const override
getPassName - Return a nice clean name for a pass.
std::pair< bool, SmallVector< BBClusterInfo > > getClusterInfoForFunction(StringRef FuncName) const
bool isFunctionHot(StringRef FuncName) const
std::pair< bool, SmallVector< BBClusterInfo > > getClusterInfoForFunction(StringRef FuncName) const
SmallVector< SmallVector< unsigned > > getClonePathsForFunction(StringRef FuncName) const
uint64_t getEdgeCount(StringRef FuncName, const UniqueBBID &SrcBBID, const UniqueBBID &SinkBBID) const
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition Pass.h:285
ImmutablePass(char &pid)
Definition Pass.h:287
This interface provides simple read-only access to a block of memory, and provides simple methods for...
virtual StringRef getBufferIdentifier() const
Return an identifier for this buffer, typically the filename it was read from.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Primary interface to the complete machine description for the target machine.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
int64_t line_number() const
Return the current line number. May return any number at EOF.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void initializeBasicBlockSectionsProfileReaderWrapperPassPass(PassRegistry &)
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition Error.cpp:98
ImmutablePass * createBasicBlockSectionsProfileReaderWrapperPass(const MemoryBuffer *Buf)
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
Definition Error.h:340
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
A CRTP mix-in that provides informational APIs needed for analysis passes.
Definition PassManager.h:93
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
DenseMap< UniqueBBID, DenseMap< UniqueBBID, uint64_t > > EdgeCounts
DenseMap< UniqueBBID, uint64_t > NodeCounts
SmallVector< SmallVector< unsigned > > ClonePaths