bool IRTranslator::translateCall(const CallInst &CI) { auto TII = MIRBuilder.getMF().getTarget().getIntrinsicInfo(); const Function &F = *CI.getCalledFunction(); Intrinsic::ID ID = F.getIntrinsicID(); if (TII && ID == Intrinsic::not_intrinsic) ID = static_cast<Intrinsic::ID>(TII->getIntrinsicID(&F)); assert(ID != Intrinsic::not_intrinsic && "FIXME: support real calls"); // Need types (starting with return) & args. SmallVector<LLT, 4> Tys; Tys.emplace_back(*CI.getType()); for (auto &Arg : CI.arg_operands()) Tys.emplace_back(*Arg->getType()); unsigned Res = CI.getType()->isVoidTy() ? 0 : getOrCreateVReg(CI); MachineInstrBuilder MIB = MIRBuilder.buildIntrinsic(Tys, ID, Res, !CI.doesNotAccessMemory()); for (auto &Arg : CI.arg_operands()) { if (ConstantInt *CI = dyn_cast<ConstantInt>(Arg)) MIB.addImm(CI->getSExtValue()); else MIB.addUse(getOrCreateVReg(*Arg)); } return true; }