[IR] Convert profile metadata in createCallMatchingInvoke()

When an invoke instruction is converted to a call its
profile metadata is dropped because it has incompatible
format (see commit 16ad6eeb94).
This patch adds an attempt to convert profile data to
format of the call instruction. This used to work well
before the commit dcfa78a4cc.

Reviewers: reames
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D82071
This commit is contained in:
Yevgeny Rouban 2020-06-20 12:06:01 +07:00
parent dd48c57da3
commit 6429471e8b
2 changed files with 14 additions and 6 deletions

View File

@ -1986,9 +1986,16 @@ CallInst *llvm::createCallMatchingInvoke(InvokeInst *II) {
NewCall->setDebugLoc(II->getDebugLoc());
NewCall->copyMetadata(*II);
// If the invoke had profile metadata, drop it.
if (NewCall->hasMetadata(LLVMContext::MD_prof))
NewCall->setMetadata(LLVMContext::MD_prof, nullptr);
// If the invoke had profile metadata, try converting them for CallInst.
uint64_t TotalWeight;
if (NewCall->extractProfTotalWeight(TotalWeight)) {
// Set the total weight if it fits into i32, otherwise reset.
MDBuilder MDB(NewCall->getContext());
auto NewWeights = uint32_t(TotalWeight) != TotalWeight
? nullptr
: MDB.createBranchWeights({uint32_t(TotalWeight)});
NewCall->setMetadata(LLVMContext::MD_prof, NewWeights);
}
return NewCall;
}

View File

@ -6,8 +6,7 @@ declare void @bar()
; instructions to call instructions if the handler just rethrows the exception.
define i32 @test1() personality i32 (...)* @__gxx_personality_v0 {
; CHECK-LABEL: @test1(
; CHECK-NEXT: call void @bar()
; CHECK-NOT: !prof
; CHECK-NEXT: call void @bar(), !prof ![[PROF:[0-9]+]]
; CHECK-NEXT: ret i32 0
invoke void @bar( )
to label %1 unwind label %Rethrow, !prof !0
@ -18,7 +17,7 @@ Rethrow:
resume { i8*, i32 } %exn
}
!0 = !{!"branch_weights", i32 369, i32 0}
!0 = !{!"branch_weights", i32 369, i32 2}
define i32 @test2() personality i32 (...)* @__gxx_personality_v0 {
; CHECK-LABEL: @test2(
@ -76,3 +75,5 @@ lpad2:
}
declare i32 @__gxx_personality_v0(...)
; CHECK: ![[PROF]] = !{!"branch_weights", i32 371}