LLVM 20.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"
23#include "llvm/IR/Module.h"
24#include "llvm/IR/PassManager.h"
26#include "llvm/Pass.h"
27#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 ID (`MachineBasicBlock::BBID`).
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};
54
55// Provides DenseMapInfo for UniqueBBID.
56template <> struct DenseMapInfo<UniqueBBID> {
57 static inline UniqueBBID getEmptyKey() {
58 unsigned EmptyKey = DenseMapInfo<unsigned>::getEmptyKey();
59 return UniqueBBID{EmptyKey, EmptyKey};
60 }
61 static inline UniqueBBID getTombstoneKey() {
62 unsigned TombstoneKey = DenseMapInfo<unsigned>::getTombstoneKey();
63 return UniqueBBID{TombstoneKey, TombstoneKey};
64 }
65 static unsigned getHashValue(const UniqueBBID &Val) {
66 std::pair<unsigned, unsigned> PairVal =
67 std::make_pair(Val.BaseID, Val.CloneID);
68 return DenseMapInfo<std::pair<unsigned, unsigned>>::getHashValue(PairVal);
69 }
70 static bool isEqual(const UniqueBBID &LHS, const UniqueBBID &RHS) {
71 return DenseMapInfo<unsigned>::isEqual(LHS.BaseID, RHS.BaseID) &&
72 DenseMapInfo<unsigned>::isEqual(LHS.CloneID, RHS.CloneID);
73 }
74};
75
77public:
80 : MBuf(Buf), LineIt(*Buf, /*SkipBlanks=*/true, /*CommentMarker=*/'#'){};
81
83
84 // Returns true if basic block sections profile exist for function \p
85 // FuncName.
86 bool isFunctionHot(StringRef FuncName) const;
87
88 // Returns a pair with first element representing whether basic block sections
89 // profile exist for the function \p FuncName, and the second element
90 // representing the basic block sections profile (cluster info) for this
91 // function. If the first element is true and the second element is empty, it
92 // means unique basic block sections are desired for all basic blocks of the
93 // function.
94 std::pair<bool, SmallVector<BBClusterInfo>>
96
97 // Returns the path clonings for the given function.
100
101private:
102 StringRef getAliasName(StringRef FuncName) const {
103 auto R = FuncAliasMap.find(FuncName);
104 return R == FuncAliasMap.end() ? FuncName : R->second;
105 }
106
107 // Returns a profile parsing error for the current line.
108 Error createProfileParseError(Twine Message) const {
109 return make_error<StringError>(
110 Twine("invalid profile " + MBuf->getBufferIdentifier() + " at line " +
111 Twine(LineIt.line_number()) + ": " + Message),
113 }
114
115 // Parses a `UniqueBBID` from `S`. `S` must be in the form "<bbid>"
116 // (representing an original block) or "<bbid>.<cloneid>" (representing a
117 // cloned block) where bbid is a non-negative integer and cloneid is a
118 // positive integer.
119 Expected<UniqueBBID> parseUniqueBBID(StringRef S) const;
120
121 // Reads the basic block sections profile for functions in this module.
122 Error ReadProfile();
123
124 // Reads version 0 profile.
125 // TODO: Remove this function once version 0 is deprecated.
126 Error ReadV0Profile();
127
128 // Reads version 1 profile.
129 Error ReadV1Profile();
130
131 // This contains the basic-block-sections profile.
132 const MemoryBuffer *MBuf = nullptr;
133
134 // Iterator to the line being parsed.
135 line_iterator LineIt;
136
137 // Map from every function name in the module to its debug info filename or
138 // empty string if no debug info is available.
139 StringMap<SmallString<128>> FunctionNameToDIFilename;
140
141 // This contains the BB cluster information for the whole program.
142 //
143 // For every function name, it contains the cloning and cluster information
144 // for (all or some of) its basic blocks. The cluster information for every
145 // basic block includes its cluster ID along with the position of the basic
146 // block in that cluster.
147 StringMap<FunctionPathAndClusterInfo> ProgramPathAndClusterInfo;
148
149 // Some functions have alias names. We use this map to find the main alias
150 // name which appears in ProgramPathAndClusterInfo as a key.
151 StringMap<StringRef> FuncAliasMap;
152};
153
154// Creates a BasicBlockSectionsProfileReader pass to parse the basic block
155// sections profile. \p Buf is a memory buffer that contains the list of
156// functions and basic block ids to selectively enable basic block sections.
157ImmutablePass *
159
160/// Analysis pass providing the \c BasicBlockSectionsProfileReader.
161///
162/// Note that this pass's result cannot be invalidated, it is immutable for the
163/// life of the module.
165 : public AnalysisInfoMixin<BasicBlockSectionsProfileReaderAnalysis> {
166
167public:
171
173
174private:
175 const TargetMachine *TM;
176};
177
179public:
180 static char ID;
182
187 };
188
193 }
194
195 StringRef getPassName() const override {
196 return "Basic Block Sections Profile Reader";
197 }
198
199 bool isFunctionHot(StringRef FuncName) const;
200
201 std::pair<bool, SmallVector<BBClusterInfo>>
202 getClusterInfoForFunction(StringRef FuncName) const;
203
205 getClonePathsForFunction(StringRef FuncName) const;
206
207 // Initializes the FunctionNameToDIFilename map for the current module and
208 // then reads the profile for the matching functions.
209 bool doInitialization(Module &M) override;
210
212};
213
214} // namespace llvm
215#endif // LLVM_CODEGEN_BASICBLOCKSECTIONSPROFILEREADER_H
This file defines the StringMap class.
basic Basic Alias true
#define F(x, y, z)
Definition: MD5.cpp:55
Module.h This file contains the declarations for the Module class.
const char LLVMTargetMachineRef TM
This header defines various interfaces for pass management in LLVM.
This file defines the SmallString class.
This file defines the SmallVector class.
Value * RHS
Value * LHS
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
Analysis pass providing the BasicBlockSectionsProfileReader.
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
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
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition: Pass.h:281
This interface provides simple read-only access to a block of memory, and provides simple methods for...
Definition: MemoryBuffer.h:51
virtual StringRef getBufferIdentifier() const
Return an identifier for this buffer, typically the filename it was read from.
Definition: MemoryBuffer.h:76
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
static 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.
Definition: SmallVector.h:1210
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:77
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
int64_t line_number() const
Return the current line number. May return any number at EOF.
Definition: LineIterator.h:66
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition: Error.cpp:98
void initializeBasicBlockSectionsProfileReaderWrapperPassPass(PassRegistry &)
ImmutablePass * createBasicBlockSectionsProfileReaderWrapperPass(const MemoryBuffer *Buf)
A CRTP mix-in that provides informational APIs needed for analysis passes.
Definition: PassManager.h:92
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:28
static bool isEqual(const UniqueBBID &LHS, const UniqueBBID &RHS)
static unsigned getHashValue(const UniqueBBID &Val)
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:52
SmallVector< SmallVector< unsigned > > ClonePaths