Skip to content

Commit b5d7f5f

Browse files
committed
[CGData][MachineOutliner] Global Outlining
This commit introduces support for outlining functions across modules using codegen data generated from previous codegen. The codegen data currently manages the outlined hash tree, which records outlining instances that occurred locally in the past. The machine outliner now operates in one of three modes: 1. CGDataMode::None: This is the default outliner mode that uses the suffix tree to identify (local) outlining candidates within a module. This mode is also used by (full)LTO to maintain optimal behavior with the combined module. 2. CGDataMode::Write (`codegen-data-generate`): This mode is identical to the default mode, but it also publishes the stable hash sequences of instructions in the outlined functions into a local outlined hash tree. It then encodes this into the `__llvm_outline` section, which will be dead-stripped at link time. 3. CGDataMode::Read (`codegen-data-use-path={.cgdata}`): This mode reads a codegen data file (.cgdata) and initializes a global outlined hash tree. This tree is used to generate global outlining candidates. Note that the codegen data file has been post-processed with the raw `__llvm_outline` sections from all native objects using the `llvm-cgdata` tool (or a linker, `LLD`, or a new ThinLTO pipeline later).
1 parent 7faa264 commit b5d7f5f

14 files changed

+736
-5
lines changed

llvm/include/llvm/CodeGen/MachineOutliner.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/CodeGen/LiveRegUnits.h"
1919
#include "llvm/CodeGen/MachineFunction.h"
2020
#include "llvm/CodeGen/MachineRegisterInfo.h"
21+
#include "llvm/CodeGen/MachineStableHash.h"
2122
#include <initializer_list>
2223

2324
namespace llvm {
@@ -274,6 +275,41 @@ struct OutlinedFunction {
274275
OutlinedFunction() = delete;
275276
virtual ~OutlinedFunction() = default;
276277
};
278+
279+
/// The information necessary to create an outlined function that is matched
280+
/// globally.
281+
struct GlobalOutlinedFunction : public OutlinedFunction {
282+
GlobalOutlinedFunction(OutlinedFunction &OF, unsigned GlobalOccurrenceCount)
283+
: OutlinedFunction(OF.Candidates, OF.SequenceSize, OF.FrameOverhead,
284+
OF.FrameConstructionID),
285+
GlobalOccurrenceCount(GlobalOccurrenceCount) {}
286+
287+
unsigned GlobalOccurrenceCount;
288+
289+
/// Return the number of times that appear globally.
290+
/// Global outlining candidate is uniquely created per each match, but this
291+
/// might be erased out when it's overlapped with the previous outlining
292+
/// instance.
293+
unsigned getOccurrenceCount() const override {
294+
assert(Candidates.size() <= 1);
295+
return Candidates.empty() ? 0 : GlobalOccurrenceCount;
296+
}
297+
298+
/// Return the outlining cost using the global occurrence count
299+
/// with the same cost as the first (unique) candidate.
300+
unsigned getOutliningCost() const override {
301+
assert(Candidates.size() <= 1);
302+
unsigned CallOverhead =
303+
Candidates.empty()
304+
? 0
305+
: Candidates[0].getCallOverhead() * getOccurrenceCount();
306+
return CallOverhead + SequenceSize + FrameOverhead;
307+
}
308+
309+
GlobalOutlinedFunction() = delete;
310+
~GlobalOutlinedFunction() = default;
311+
};
312+
277313
} // namespace outliner
278314
} // namespace llvm
279315

llvm/lib/CodeGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ add_llvm_component_library(LLVMCodeGen
266266
Analysis
267267
BitReader
268268
BitWriter
269+
CodeGenData
269270
CodeGenTypes
270271
Core
271272
MC

0 commit comments

Comments
 (0)