mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-22 04:22:57 +02:00
2f995f2098
This new patch fixes a few bugs that exposed in last submit. It also improves the test cases. --Original Commit Message-- This patch implements a minimum spanning tree (MST) based instrumentation for PGO. The use of MST guarantees minimum number of CFG edges getting instrumented. An addition optimization is to instrument the less executed edges to further reduce the instrumentation overhead. The patch contains both the instrumentation and the use of the profile to set the branch weights. Differential Revision: http://reviews.llvm.org/D12781 llvm-svn: 255132
78 lines
2.8 KiB
C++
78 lines
2.8 KiB
C++
//===-- Instrumentation.cpp - TransformUtils Infrastructure ---------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the common initialization infrastructure for the
|
|
// Instrumentation library.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Transforms/Instrumentation.h"
|
|
#include "llvm-c/Initialization.h"
|
|
#include "llvm/IR/IntrinsicInst.h"
|
|
#include "llvm/InitializePasses.h"
|
|
#include "llvm/PassRegistry.h"
|
|
|
|
using namespace llvm;
|
|
|
|
/// Moves I before IP. Returns new insert point.
|
|
static BasicBlock::iterator moveBeforeInsertPoint(BasicBlock::iterator I, BasicBlock::iterator IP) {
|
|
// If I is IP, move the insert point down.
|
|
if (I == IP)
|
|
return ++IP;
|
|
// Otherwise, move I before IP and return IP.
|
|
I->moveBefore(&*IP);
|
|
return IP;
|
|
}
|
|
|
|
/// Instrumentation passes often insert conditional checks into entry blocks.
|
|
/// Call this function before splitting the entry block to move instructions
|
|
/// that must remain in the entry block up before the split point. Static
|
|
/// allocas and llvm.localescape calls, for example, must remain in the entry
|
|
/// block.
|
|
BasicBlock::iterator llvm::PrepareToSplitEntryBlock(BasicBlock &BB,
|
|
BasicBlock::iterator IP) {
|
|
assert(&BB.getParent()->getEntryBlock() == &BB);
|
|
for (auto I = IP, E = BB.end(); I != E; ++I) {
|
|
bool KeepInEntry = false;
|
|
if (auto *AI = dyn_cast<AllocaInst>(I)) {
|
|
if (AI->isStaticAlloca())
|
|
KeepInEntry = true;
|
|
} else if (auto *II = dyn_cast<IntrinsicInst>(I)) {
|
|
if (II->getIntrinsicID() == llvm::Intrinsic::localescape)
|
|
KeepInEntry = true;
|
|
}
|
|
if (KeepInEntry)
|
|
IP = moveBeforeInsertPoint(I, IP);
|
|
}
|
|
return IP;
|
|
}
|
|
|
|
/// initializeInstrumentation - Initialize all passes in the TransformUtils
|
|
/// library.
|
|
void llvm::initializeInstrumentation(PassRegistry &Registry) {
|
|
initializeAddressSanitizerPass(Registry);
|
|
initializeAddressSanitizerModulePass(Registry);
|
|
initializeBoundsCheckingPass(Registry);
|
|
initializeGCOVProfilerPass(Registry);
|
|
initializePGOInstrumentationGenPass(Registry);
|
|
initializePGOInstrumentationUsePass(Registry);
|
|
initializeInstrProfilingPass(Registry);
|
|
initializeMemorySanitizerPass(Registry);
|
|
initializeThreadSanitizerPass(Registry);
|
|
initializeSanitizerCoverageModulePass(Registry);
|
|
initializeDataFlowSanitizerPass(Registry);
|
|
initializeSafeStackPass(Registry);
|
|
}
|
|
|
|
/// LLVMInitializeInstrumentation - C binding for
|
|
/// initializeInstrumentation.
|
|
void LLVMInitializeInstrumentation(LLVMPassRegistryRef R) {
|
|
initializeInstrumentation(*unwrap(R));
|
|
}
|