[PGO] Move the instrumentation point closer to the value site.
For terminator instructions, the value profiling instrumentation happens in a basic block other than where the value site resides. This CR moves the instrumentation point prior to the value site. Mostly NFC. llvm-svn: 264783
This commit is contained in:
parent
e11e08bd1f
commit
cb6f5f16e6
|
@ -757,10 +757,10 @@ void CodeGenPGO::valueProfile(CGBuilderTy &Builder, uint32_t ValueKind,
|
|||
|
||||
bool InstrumentValueSites = CGM.getCodeGenOpts().hasProfileClangInstr();
|
||||
if (InstrumentValueSites && RegionCounterMap) {
|
||||
llvm::LLVMContext &Ctx = CGM.getLLVMContext();
|
||||
auto *I8PtrTy = llvm::Type::getInt8PtrTy(Ctx);
|
||||
auto BuilderInsertPoint = Builder.saveIP();
|
||||
Builder.SetInsertPoint(ValueSite);
|
||||
llvm::Value *Args[5] = {
|
||||
llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy),
|
||||
llvm::ConstantExpr::getBitCast(FuncNameVar, Builder.getInt8PtrTy()),
|
||||
Builder.getInt64(FunctionHash),
|
||||
Builder.CreatePtrToInt(ValuePtr, Builder.getInt64Ty()),
|
||||
Builder.getInt32(ValueKind),
|
||||
|
@ -768,6 +768,7 @@ void CodeGenPGO::valueProfile(CGBuilderTy &Builder, uint32_t ValueKind,
|
|||
};
|
||||
Builder.CreateCall(
|
||||
CGM.getIntrinsic(llvm::Intrinsic::instrprof_value_profile), Args);
|
||||
Builder.restoreIP(BuilderInsertPoint);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
// Check the data structures emitted by instrumentation.
|
||||
// Check the value profiling instrinsics emitted by instrumentation.
|
||||
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-indirect-call.c %s -o - -emit-llvm -fprofile-instrument=clang -mllvm -enable-value-profiling | FileCheck %s
|
||||
|
||||
void (*foo)(void);
|
||||
|
||||
int main(void) {
|
||||
// CHECK: [[REG1:%[0-9]+]] = load void ()*, void ()** @foo, align 8
|
||||
// CHECK-NEXT: call void [[REG1]]()
|
||||
// CHECK-NEXT: [[REG2:%[0-9]+]] = ptrtoint void ()* [[REG1]] to i64
|
||||
// CHECK-NEXT: call void @__llvm_profile_instrument_target(i64 [[REG2]], i8* bitcast ({{.*}}* @__profd_main to i8*), i32 0)
|
||||
// CHECK-NEXT: call void [[REG1]]()
|
||||
foo();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// Check the value profiling instrinsics emitted by instrumentation.
|
||||
|
||||
// RUN: %clangxx %s -o - -emit-llvm -S -fprofile-instr-generate -mllvm -enable-value-profiling -fexceptions -target %itanium_abi_triple | FileCheck %s
|
||||
|
||||
void (*foo) (void);
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
// CHECK: [[REG1:%[0-9]+]] = load void ()*, void ()** @foo, align 4
|
||||
// CHECK-NEXT: [[REG2:%[0-9]+]] = ptrtoint void ()* [[REG1]] to i64
|
||||
// CHECK-NEXT: call void @__llvm_profile_instrument_target(i64 [[REG2]], i8* bitcast ({{.*}}* @__profd_main to i8*), i32 0)
|
||||
// CHECK-NEXT: invoke void [[REG1]]()
|
||||
try {
|
||||
foo();
|
||||
} catch (int) {}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// CHECK: declare void @__llvm_profile_instrument_target(i64, i8*, i32)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue