summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmed Bougacha <ahmed.bougacha@gmail.com>2017-03-10 00:25:35 +0000
committerAhmed Bougacha <ahmed.bougacha@gmail.com>2017-03-10 00:25:35 +0000
commit4ec6d5abed9ecb760a53a97ce0468378ec0a8ce2 (patch)
treec4bd689043ff8c2bb34c53fbcea424fe60448b2d
parent04d9e746f1792ecf610d823eb486332e1ab8030b (diff)
downloadbcm5719-llvm-4ec6d5abed9ecb760a53a97ce0468378ec0a8ce2.tar.gz
bcm5719-llvm-4ec6d5abed9ecb760a53a97ce0468378ec0a8ce2.zip
[GlobalISel] Fallback when failing to translate invoke.
We unintentionally stopped falling back in r293670. While there, change an unusual construct. llvm-svn: 297425
-rw-r--r--llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp7
-rw-r--r--llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll20
2 files changed, 24 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index b2ab3c12bc1..1e8f6c222d7 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -787,7 +787,7 @@ bool IRTranslator::translateInvoke(const User &U,
const BasicBlock *ReturnBB = I.getSuccessor(0);
const BasicBlock *EHPadBB = I.getSuccessor(1);
- const Value *Callee(I.getCalledValue());
+ const Value *Callee = I.getCalledValue();
const Function *Fn = dyn_cast<Function>(Callee);
if (isa<InlineAsm>(Callee))
return false;
@@ -815,8 +815,9 @@ bool IRTranslator::translateInvoke(const User &U,
for (auto &Arg: I.arg_operands())
Args.push_back(getOrCreateVReg(*Arg));
- CLI->lowerCall(MIRBuilder, I, Res, Args,
- [&]() { return getOrCreateVReg(*I.getCalledValue()); });
+ if (!CLI->lowerCall(MIRBuilder, I, Res, Args,
+ [&]() { return getOrCreateVReg(*I.getCalledValue()); }))
+ return false;
MCSymbol *EndSymbol = Context.createTempSymbol();
MIRBuilder.buildInstr(TargetOpcode::EH_LABEL).addSym(EndSymbol);
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
index 4510f5cf054..087faa293de 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
@@ -118,3 +118,23 @@ define void @test_write_register_intrin() {
call void @llvm.write_register.i64(metadata !{!"sp"}, i64 0)
ret void
}
+
+@_ZTIi = external global i8*
+declare i32 @__gxx_personality_v0(...)
+
+; Check that we fallback on invoke translation failures.
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to translate instruction: invoke: ' invoke void %callee(i128 0)
+; FALLBACK-WITH-REPORT-NEXT: to label %continue unwind label %broken' (in function: invoke_weird_type)
+; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for invoke_weird_type
+; FALLBACK-WITH-REPORT-OUT-LABEL: invoke_weird_type:
+define void @invoke_weird_type(void(i128)* %callee) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+ invoke void %callee(i128 0)
+ to label %continue unwind label %broken
+
+broken:
+ landingpad { i8*, i32 } catch i8* bitcast(i8** @_ZTIi to i8*)
+ ret void
+
+continue:
+ ret void
+}
OpenPOWER on IntegriCloud