]> granicus.if.org Git - llvm/commitdiff
GlobalISel: correctly translate invoke when callee is a register.
authorTim Northover <tnorthover@apple.com>
Mon, 30 Jan 2017 21:45:21 +0000 (21:45 +0000)
committerTim Northover <tnorthover@apple.com>
Mon, 30 Jan 2017 21:45:21 +0000 (21:45 +0000)
This should fix the GlobalISel verifier.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293550 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/GlobalISel/IRTranslator.cpp
test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll

index 21657827a93694066c7ff3e2d9c8be54e2c0d191..0f66bd9d1716cebcbc32940a718139fe0892df39 100644 (file)
@@ -737,7 +737,11 @@ bool IRTranslator::translateInvoke(const User &U,
   for (auto &Arg: I.arg_operands())
     Args.emplace_back(getOrCreateVReg(*Arg), Arg->getType());
 
-  if (!CLI->lowerCall(MIRBuilder, MachineOperand::CreateGA(Fn, 0),
+  auto CalleeMO =
+      Fn ? MachineOperand::CreateGA(Fn, 0)
+         : MachineOperand::CreateReg(getOrCreateVReg(*Callee), false);
+
+  if (!CLI->lowerCall(MIRBuilder, CalleeMO,
                       CallLowering::ArgInfo(Res, I.getType()), Args))
     return false;
 
index f5eacda8b0956aa557d622f4b2a5d12051234696..412f70e17b2cdd1935ab6a715e5ffc8e04f782e1 100644 (file)
@@ -6,7 +6,7 @@ declare i32 @foo(i32)
 declare i32 @__gxx_personality_v0(...)
 declare i32 @llvm.eh.typeid.for(i8*)
 
-; CHECK: name: bar
+; CHECK-LABEL: name: bar
 ; CHECK: body:
 ; CHECK-NEXT:   bb.1 (%ir-block.0):
 ; CHECK:     successors: %[[GOOD:bb.[0-9]+.continue]]{{.*}}%[[BAD:bb.[0-9]+.broken]]
@@ -43,3 +43,17 @@ continue:
   %res.good = insertvalue { i8*, i32 } undef, i32 %sel.int, 1
   ret { i8*, i32 } %res.good
 }
+
+; CHECK-LABEL: name: test_invoke_indirect
+; CHECK: [[CALLEE:%[0-9]+]](p0) = COPY %x0
+; CHECK: BLR [[CALLEE]]
+define void @test_invoke_indirect(void()* %callee) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+  invoke void %callee() to label %continue unwind label %broken
+
+broken:
+  landingpad { i8*, i32 } catch i8* bitcast(i8** @_ZTIi to i8*)
+  ret void
+
+continue:
+  ret void
+}