[PGO] Add PGO to LDC. Supported for LLVM >= 3.7

Add the commandline options -fprofile-instr-generate[=filename] and -profile-instr-use=filename
-fprofile-instr-generate
-- Add instrumentation on branches, switches, and function entry; uses LLVM's InstrProf pass.
-- Link to profile runtime that writes instrumentation counters to a file.
-fprofile-instr-use
-- Read profile data from a file and apply branch weights to branches and switches, and annotate functions with entrycount in LLVM IR.
-- Functions with low or high entrycount are marked with 'cold' or 'inlinehint'.

The only statement type without PGO yet is "try-finally".

A new pragma, `pragma(LDC_profile_instr, [ true | false ])`, is added to selectively disable/enable instrumentation of functions (granularity = whole functions).

The runtime library ldc-profile-rt is a copy of LLVM compiler-rt lib/profile. It has to be exactly in-sync with the LLVM version, and thus we need a copy for each PGO-supported LLVM (>=3.7).
import ldc.profile for a D interface to ldc-profile-rt (for example to reset execution counts after a program startup phase).

The instrumentation data is mainly passed on to LLVM: function-entry counts and branch counts/probabilities. LDC marks functions as hot when "execution count is 30% of the maximum function execution count", and marks functions as cold if their count is 1% of maximum function execution count.

The source of LLVM's llvm-profdata tool is hereby included in LDCs repository (different source for each LLVM version), and the binary is included in the install bin folder.
The executable is named "ldc-profdata" to avoid clashing with llvm-profdata on the same machine. This is needed because profdata executable has to be in-sync with the LLVM version used to build LDC.

Maintenance burden: for trunk LLVM, we have to keep ldc-profile-rt and llvm-profdata in sync. There is no diff with upstream; but because of active development there are the occasional API changes.
This commit is contained in:
Johan Engelen 2015-11-17 00:52:59 +01:00 committed by Johan Engelen
parent a81ac7d790
commit e0d9c58443
99 changed files with 11857 additions and 64 deletions

View file

@ -31,6 +31,7 @@
#include "gen/mangling.h"
#include "gen/nested.h"
#include "gen/optimizer.h"
#include "gen/pgo.h"
#include "gen/pragma.h"
#include "gen/runtime.h"
#include "gen/tollvm.h"
@ -953,6 +954,9 @@ void DtoDefineFunction(FuncDeclaration *fd) {
if (fd->parameters)
defineParameters(irFty, *fd->parameters);
// Initialize PGO state for this function
irFunc->pgo.assignRegionCounters(fd, irFunc->func);
{
ScopeStack scopeStack(gIR);
irFunc->scopes = &scopeStack;
@ -980,6 +984,9 @@ void DtoDefineFunction(FuncDeclaration *fd) {
DtoAllocaDump(irFunc->_arguments, 0, "_arguments_mem");
}
irFunc->pgo.emitCounterIncrement(fd->fbody);
irFunc->pgo.setCurrentStmt(fd->fbody);
// output function body
Statement_toIR(fd->fbody, gIR);