[PATCH] D18569: [PGO] Move the instrumentation point closer to the value site.
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 29 13:54:57 PDT 2016
Betul Buyukkurt <betulb at codeaurora.org> writes:
> betulb created this revision.
> betulb added reviewers: davidxl, bogner, xur.
> betulb added a subscriber: llvm-commits.
> betulb set the repository for this revision to rL LLVM.
> betulb changed the visibility of this Differential Revision from
> "Public (No Login Required)" to "All Users".
>
> 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.
>
> Repository:
> rL LLVM
>
> http://reviews.llvm.org/D18569
>
> Files:
> lib/CodeGen/CodeGenPGO.cpp
> test/Profile/c-indirect-call.c
> test/Profile/cxx-indirect-call.cpp
>
> Index: test/Profile/cxx-indirect-call.cpp
> ===================================================================
> --- /dev/null
> +++ test/Profile/cxx-indirect-call.cpp
> @@ -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)
> +
> +
> +
> Index: test/Profile/c-indirect-call.c
> ===================================================================
> --- test/Profile/c-indirect-call.c
> +++ test/Profile/c-indirect-call.c
> @@ -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;
> }
> Index: lib/CodeGen/CodeGenPGO.cpp
> ===================================================================
> --- lib/CodeGen/CodeGenPGO.cpp
> +++ lib/CodeGen/CodeGenPGO.cpp
> @@ -757,17 +757,18 @@
>
> 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),
> Builder.getInt32(NumValueSites[ValueKind]++)
> };
> Builder.CreateCall(
> CGM.getIntrinsic(llvm::Intrinsic::instrprof_value_profile), Args);
> + Builder.restoreIP(BuilderInsertPoint);
> return;
> }
>
LGTM.
More information about the llvm-commits
mailing list