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};
54
56public:
59 : MBuf(Buf), LineIt(*Buf, /*SkipBlanks=*/true, /*CommentMarker=*/'#'){};
60
62
63 // Returns true if basic block sections profile exist for function \p
64 // FuncName.
65 bool isFunctionHot(StringRef FuncName) const;
66
67 // Returns a pair with first element representing whether basic block sections
68 // profile exist for the function \p FuncName, and the second element
69 // representing the basic block sections profile (cluster info) for this
70 // function. If the first element is true and the second element is empty, it
71 // means unique basic block sections are desired for all basic blocks of the
72 // function.
73 std::pair<bool, SmallVector<BBClusterInfo>>
75
76 // Returns the path clonings for the given function.
79
80private:
81 StringRef getAliasName(StringRef FuncName) const {
82 auto R = FuncAliasMap.find(FuncName);
83 return R == FuncAliasMap.end() ? FuncName : R->second;
84 }
85
86 // Returns a profile parsing error for the current line.
87 Error createProfileParseError(Twine Message) const {
88 return make_error<StringError>(
89 Twine("invalid profile " + MBuf->getBufferIdentifier() + " at line " +
90 Twine(LineIt.line_number()) + ": " + Message),
92 }
93
94 // Parses a `UniqueBBID` from `S`. `S` must be in the form "<bbid>"
95 // (representing an original block) or "<bbid>.<cloneid>" (representing a
96 // cloned block) where bbid is a non-negative integer and cloneid is a
97 // positive integer.
98 Expected<UniqueBBID> parseUniqueBBID(StringRef S) const;
99
100 // Reads the basic block sections profile for functions in this module.
101 Error ReadProfile();
102
103 // Reads version 0 profile.
104 // TODO: Remove this function once version 0 is deprecated.
105 Error ReadV0Profile();
106
107 // Reads version 1 profile.
108 Error ReadV1Profile();
109
110 // This contains the basic-block-sections profile.
111 const MemoryBuffer *MBuf = nullptr;
112
113 // Iterator to the line being parsed.
114 line_iterator LineIt;
115
116 // Map from every function name in the module to its debug info filename or
117 // empty string if no debug info is available.
118 StringMap<SmallString<128>> FunctionNameToDIFilename;
119
120 // This contains the BB cluster information for the whole program.
121 //
122 // For every function name, it contains the cloning and cluster information
123 // for (all or some of) its basic blocks. The cluster information for every
124 // basic block includes its cluster ID along with the position of the basic
125 // block in that cluster.
126 StringMap<FunctionPathAndClusterInfo> ProgramPathAndClusterInfo;
127
128 // Some functions have alias names. We use this map to find the main alias
129 // name which appears in ProgramPathAndClusterInfo as a key.
130 StringMap<StringRef> FuncAliasMap;
131};
132
133// Creates a BasicBlockSectionsProfileReader pass to parse the basic block
134// sections profile. \p Buf is a memory buffer that contains the list of
135// functions and basic block ids to selectively enable basic block sections.
136ImmutablePass *
138
139/// Analysis pass providing the \c BasicBlockSectionsProfileReader.
140///
141/// Note that this pass's result cannot be invalidated, it is immutable for the
142/// life of the module.
144 : public AnalysisInfoMixin<BasicBlockSectionsProfileReaderAnalysis> {
145
146public:
150
152
153private:
154 const TargetMachine *TM;
155};
156
158public:
159 static char ID;
161
166 };
167
172 }
173
174 StringRef getPassName() const override {
175 return "Basic Block Sections Profile Reader";
176 }
177
178 bool isFunctionHot(StringRef FuncName) const;
179
180 std::pair<bool, SmallVector<BBClusterInfo>>
181 getClusterInfoForFunction(StringRef FuncName) const;
182
184 getClonePathsForFunction(StringRef FuncName) const;
185
186 // Initializes the FunctionNameToDIFilename map for the current module and
187 // then reads the profile for the matching functions.
188 bool doInitialization(Module &M) override;
189
191};
192
193} // namespace llvm
194#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.
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
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:159
ImmutablePass class - This class is used to provide information that does not need to be run.
Definition: Pass.h:285
This interface provides simple read-only access to a block of memory, and provides simple methods for...
Definition: MemoryBuffer.h:52
virtual StringRef getBufferIdentifier() const
Return an identifier for this buffer, typically the filename it was read from.
Definition: MemoryBuffer.h:77
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.
Definition: SmallVector.h:1197
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.
Definition: TargetMachine.h:83
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.
Definition: LineIterator.h:69
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
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)
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
SmallVector< SmallVector< unsigned > > ClonePaths