diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -1986,9 +1986,16 @@ 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; } diff --git a/llvm/test/Transforms/SimplifyCFG/invoke_unwind.ll b/llvm/test/Transforms/SimplifyCFG/invoke_unwind.ll --- a/llvm/test/Transforms/SimplifyCFG/invoke_unwind.ll +++ b/llvm/test/Transforms/SimplifyCFG/invoke_unwind.ll @@ -6,8 +6,7 @@ ; 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 @@ 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 @@ } declare i32 @__gxx_personality_v0(...) + +; CHECK: ![[PROF]] = !{!"branch_weights", i32 371}