diff --git a/lib/CodeGen/GlobalISel/IRTranslator.cpp b/lib/CodeGen/GlobalISel/IRTranslator.cpp index 21657827a93..0f66bd9d171 100644 --- a/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -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; diff --git a/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll b/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll index f5eacda8b09..412f70e17b2 100644 --- a/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll +++ b/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll @@ -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 +}