[IR] Don't copy profile metadata in createCallMatchingInvoke()
authorHans Wennborg <hans@chromium.org>
Wed, 17 Jun 2020 08:26:30 +0000 (10:26 +0200)
committerHans Wennborg <hans@chromium.org>
Wed, 17 Jun 2020 09:18:23 +0000 (11:18 +0200)
The invoke instruction can have profile metadata with branch_weights,
which does not make sense for a call instruction and will be
rejected by the verifier.

Differential revision: https://reviews.llvm.org/D81996

llvm/lib/Transforms/Utils/Local.cpp
llvm/test/Transforms/SimplifyCFG/invoke_unwind.ll

index 7c0cb51..d0f0c8f 100644 (file)
@@ -1985,6 +1985,11 @@ CallInst *llvm::createCallMatchingInvoke(InvokeInst *II) {
   NewCall->setAttributes(II->getAttributes());
   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);
+
   return NewCall;
 }
 
index b11b7c1..5758b67 100644 (file)
@@ -7,9 +7,10 @@ declare void @bar()
 define i32 @test1() personality i32 (...)* @__gxx_personality_v0 {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT: call void @bar()
+; CHECK-NOT: !prof
 ; CHECK-NEXT: ret i32 0
         invoke void @bar( )
-                        to label %1 unwind label %Rethrow
+                        to label %1 unwind label %Rethrow, !prof !0
         ret i32 0
 Rethrow:
         %exn = landingpad {i8*, i32}
@@ -17,6 +18,8 @@ Rethrow:
         resume { i8*, i32 } %exn
 }
 
+!0 = !{!"branch_weights", i32 369, i32 0}
+
 define i32 @test2() personality i32 (...)* @__gxx_personality_v0 {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT: call void @bar() [ "foo"(i32 100) ]