]> granicus.if.org Git - llvm/commitdiff
[GlobalISel] Fallback when failing to translate invoke.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Fri, 10 Mar 2017 00:25:35 +0000 (00:25 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Fri, 10 Mar 2017 00:25:35 +0000 (00:25 +0000)
We unintentionally stopped falling back in r293670.

While there, change an unusual construct.

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

lib/CodeGen/GlobalISel/IRTranslator.cpp
test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll

index b2ab3c12bc15444138d3ee788eefb19574a7cfd4..1e8f6c222d71f6fc723de4c8e406900df49030e0 100644 (file)
@@ -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);
index 4510f5cf054586785c5e1bc964c1f2cecf401a42..087faa293ded47fb30bc050a6ce65a62068b8e42 100644 (file)
@@ -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
+}