summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 4ea0951692d..788823d18d1 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -187,12 +187,25 @@ bool IRTranslator::translateCast(unsigned Opcode, const CastInst &CI) {
bool IRTranslator::translateCall(const CallInst &CI) {
auto TII = MIRBuilder.getMF().getTarget().getIntrinsicInfo();
- const Function &F = *CI.getCalledFunction();
- Intrinsic::ID ID = F.getIntrinsicID();
+ const Function *F = CI.getCalledFunction();
+
+ if (!F || !F->isIntrinsic()) {
+ // FIXME: handle multiple return values.
+ unsigned Res = CI.getType()->isVoidTy() ? 0 : getOrCreateVReg(CI);
+ SmallVector<unsigned, 8> Args;
+ for (auto &Arg: CI.arg_operands())
+ Args.push_back(getOrCreateVReg(*Arg));
+
+ return CLI->lowerCall(MIRBuilder, CI,
+ F ? 0 : getOrCreateVReg(*CI.getCalledValue()), Res,
+ Args);
+ }
+
+ Intrinsic::ID ID = F->getIntrinsicID();
if (TII && ID == Intrinsic::not_intrinsic)
- ID = static_cast<Intrinsic::ID>(TII->getIntrinsicID(&F));
+ ID = static_cast<Intrinsic::ID>(TII->getIntrinsicID(F));
- assert(ID != Intrinsic::not_intrinsic && "FIXME: support real calls");
+ assert(ID != Intrinsic::not_intrinsic && "unknown intrinsic");
// Need types (starting with return) & args.
SmallVector<LLT, 4> Tys;
OpenPOWER on IntegriCloud