1 //===-- lib/CodeGen/GlobalISel/CallLowering.cpp - Call lowering -----------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file implements some simple delegations needed for call lowering. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/CodeGen/Analysis.h" 15 #include "llvm/CodeGen/GlobalISel/CallLowering.h" 16 #include "llvm/CodeGen/GlobalISel/Utils.h" 17 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" 18 #include "llvm/CodeGen/MachineOperand.h" 19 #include "llvm/CodeGen/MachineRegisterInfo.h" 20 #include "llvm/CodeGen/TargetLowering.h" 21 #include "llvm/IR/DataLayout.h" 22 #include "llvm/IR/Instructions.h" 23 #include "llvm/IR/LLVMContext.h" 24 #include "llvm/IR/Module.h" 25 #include "llvm/Target/TargetMachine.h" 26 27 #define DEBUG_TYPE "call-lowering" 28 29 using namespace llvm; 30 31 void CallLowering::anchor() {} 32 33 /// Helper function which updates \p Flags when \p AttrFn returns true. 34 static void 35 addFlagsUsingAttrFn(ISD::ArgFlagsTy &Flags, 36 const std::function<bool(Attribute::AttrKind)> &AttrFn) { 37 if (AttrFn(Attribute::SExt)) 38 Flags.setSExt(); 39 if (AttrFn(Attribute::ZExt)) 40 Flags.setZExt(); 41 if (AttrFn(Attribute::InReg)) 42 Flags.setInReg(); 43 if (AttrFn(Attribute::StructRet)) 44 Flags.setSRet(); 45 if (AttrFn(Attribute::Nest)) 46 Flags.setNest(); 47 if (AttrFn(Attribute::ByVal)) 48 Flags.setByVal(); 49 if (AttrFn(Attribute::Preallocated)) 50 Flags.setPreallocated(); 51 if (AttrFn(Attribute::InAlloca)) 52 Flags.setInAlloca(); 53 if (AttrFn(Attribute::Returned)) 54 Flags.setReturned(); 55 if (AttrFn(Attribute::SwiftSelf)) 56 Flags.setSwiftSelf(); 57 if (AttrFn(Attribute::SwiftError)) 58 Flags.setSwiftError(); 59 } 60 61 ISD::ArgFlagsTy CallLowering::getAttributesForArgIdx(const CallBase &Call, 62 unsigned ArgIdx) const { 63 ISD::ArgFlagsTy Flags; 64 addFlagsUsingAttrFn(Flags, [&Call, &ArgIdx](Attribute::AttrKind Attr) { 65 return Call.paramHasAttr(ArgIdx, Attr); 66 }); 67 return Flags; 68 } 69 70 void CallLowering::addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags, 71 const AttributeList &Attrs, 72 unsigned OpIdx) const { 73 addFlagsUsingAttrFn(Flags, [&Attrs, &OpIdx](Attribute::AttrKind Attr) { 74 return Attrs.hasAttribute(OpIdx, Attr); 75 }); 76 } 77 78 bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB, 79 ArrayRef<Register> ResRegs, 80 ArrayRef<ArrayRef<Register>> ArgRegs, 81 Register SwiftErrorVReg, 82 std::function<unsigned()> GetCalleeReg) const { 83 CallLoweringInfo Info; 84 const DataLayout &DL = MIRBuilder.getDataLayout(); 85 MachineFunction &MF = MIRBuilder.getMF(); 86 bool CanBeTailCalled = CB.isTailCall() && 87 isInTailCallPosition(CB, MF.getTarget()) && 88 (MF.getFunction() 89 .getFnAttribute("disable-tail-calls") 90 .getValueAsString() != "true"); 91 92 CallingConv::ID CallConv = CB.getCallingConv(); 93 Type *RetTy = CB.getType(); 94 bool IsVarArg = CB.getFunctionType()->isVarArg(); 95 96 SmallVector<BaseArgInfo, 4> SplitArgs; 97 getReturnInfo(CallConv, RetTy, CB.getAttributes(), SplitArgs, DL); 98 Info.CanLowerReturn = 99 canLowerReturn(MF, CallConv, SplitArgs, IsVarArg, RetTy->getContext()); 100 101 if (!Info.CanLowerReturn) { 102 // Callee requires sret demotion. 103 insertSRetOutgoingArgument(MIRBuilder, CB, Info); 104 105 // The sret demotion isn't compatible with tail-calls, since the sret 106 // argument points into the caller's stack frame. 107 CanBeTailCalled = false; 108 } 109 110 // First step is to marshall all the function's parameters into the correct 111 // physregs and memory locations. Gather the sequence of argument types that 112 // we'll pass to the assigner function. 113 unsigned i = 0; 114 unsigned NumFixedArgs = CB.getFunctionType()->getNumParams(); 115 for (auto &Arg : CB.args()) { 116 ArgInfo OrigArg{ArgRegs[i], Arg->getType(), getAttributesForArgIdx(CB, i), 117 i < NumFixedArgs}; 118 setArgFlags(OrigArg, i + AttributeList::FirstArgIndex, DL, CB); 119 120 // If we have an explicit sret argument that is an Instruction, (i.e., it 121 // might point to function-local memory), we can't meaningfully tail-call. 122 if (OrigArg.Flags[0].isSRet() && isa<Instruction>(&Arg)) 123 CanBeTailCalled = false; 124 125 Info.OrigArgs.push_back(OrigArg); 126 ++i; 127 } 128 129 // Try looking through a bitcast from one function type to another. 130 // Commonly happens with calls to objc_msgSend(). 131 const Value *CalleeV = CB.getCalledOperand()->stripPointerCasts(); 132 if (const Function *F = dyn_cast<Function>(CalleeV)) 133 Info.Callee = MachineOperand::CreateGA(F, 0); 134 else 135 Info.Callee = MachineOperand::CreateReg(GetCalleeReg(), false); 136 137 Info.OrigRet = ArgInfo{ResRegs, RetTy, ISD::ArgFlagsTy{}}; 138 if (!Info.OrigRet.Ty->isVoidTy()) 139 setArgFlags(Info.OrigRet, AttributeList::ReturnIndex, DL, CB); 140 141 Info.KnownCallees = CB.getMetadata(LLVMContext::MD_callees); 142 Info.CallConv = CallConv; 143 Info.SwiftErrorVReg = SwiftErrorVReg; 144 Info.IsMustTailCall = CB.isMustTailCall(); 145 Info.IsTailCall = CanBeTailCalled; 146 Info.IsVarArg = IsVarArg; 147 return lowerCall(MIRBuilder, Info); 148 } 149 150 template <typename FuncInfoTy> 151 void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx, 152 const DataLayout &DL, 153 const FuncInfoTy &FuncInfo) const { 154 auto &Flags = Arg.Flags[0]; 155 const AttributeList &Attrs = FuncInfo.getAttributes(); 156 addArgFlagsFromAttributes(Flags, Attrs, OpIdx); 157 158 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated()) { 159 Type *ElementTy = cast<PointerType>(Arg.Ty)->getElementType(); 160 161 auto Ty = Attrs.getAttribute(OpIdx, Attribute::ByVal).getValueAsType(); 162 Flags.setByValSize(DL.getTypeAllocSize(Ty ? Ty : ElementTy)); 163 164 // For ByVal, alignment should be passed from FE. BE will guess if 165 // this info is not there but there are cases it cannot get right. 166 Align FrameAlign; 167 if (auto ParamAlign = FuncInfo.getParamAlign(OpIdx - 2)) 168 FrameAlign = *ParamAlign; 169 else 170 FrameAlign = Align(getTLI()->getByValTypeAlignment(ElementTy, DL)); 171 Flags.setByValAlign(FrameAlign); 172 } 173 Flags.setOrigAlign(DL.getABITypeAlign(Arg.Ty)); 174 } 175 176 template void 177 CallLowering::setArgFlags<Function>(CallLowering::ArgInfo &Arg, unsigned OpIdx, 178 const DataLayout &DL, 179 const Function &FuncInfo) const; 180 181 template void 182 CallLowering::setArgFlags<CallBase>(CallLowering::ArgInfo &Arg, unsigned OpIdx, 183 const DataLayout &DL, 184 const CallBase &FuncInfo) const; 185 186 Register CallLowering::packRegs(ArrayRef<Register> SrcRegs, Type *PackedTy, 187 MachineIRBuilder &MIRBuilder) const { 188 assert(SrcRegs.size() > 1 && "Nothing to pack"); 189 190 const DataLayout &DL = MIRBuilder.getMF().getDataLayout(); 191 MachineRegisterInfo *MRI = MIRBuilder.getMRI(); 192 193 LLT PackedLLT = getLLTForType(*PackedTy, DL); 194 195 SmallVector<LLT, 8> LLTs; 196 SmallVector<uint64_t, 8> Offsets; 197 computeValueLLTs(DL, *PackedTy, LLTs, &Offsets); 198 assert(LLTs.size() == SrcRegs.size() && "Regs / types mismatch"); 199 200 Register Dst = MRI->createGenericVirtualRegister(PackedLLT); 201 MIRBuilder.buildUndef(Dst); 202 for (unsigned i = 0; i < SrcRegs.size(); ++i) { 203 Register NewDst = MRI->createGenericVirtualRegister(PackedLLT); 204 MIRBuilder.buildInsert(NewDst, Dst, SrcRegs[i], Offsets[i]); 205 Dst = NewDst; 206 } 207 208 return Dst; 209 } 210 211 void CallLowering::unpackRegs(ArrayRef<Register> DstRegs, Register SrcReg, 212 Type *PackedTy, 213 MachineIRBuilder &MIRBuilder) const { 214 assert(DstRegs.size() > 1 && "Nothing to unpack"); 215 216 const DataLayout &DL = MIRBuilder.getDataLayout(); 217 218 SmallVector<LLT, 8> LLTs; 219 SmallVector<uint64_t, 8> Offsets; 220 computeValueLLTs(DL, *PackedTy, LLTs, &Offsets); 221 assert(LLTs.size() == DstRegs.size() && "Regs / types mismatch"); 222 223 for (unsigned i = 0; i < DstRegs.size(); ++i) 224 MIRBuilder.buildExtract(DstRegs[i], SrcReg, Offsets[i]); 225 } 226 227 bool CallLowering::handleAssignments(MachineIRBuilder &MIRBuilder, 228 SmallVectorImpl<ArgInfo> &Args, 229 ValueHandler &Handler) const { 230 MachineFunction &MF = MIRBuilder.getMF(); 231 const Function &F = MF.getFunction(); 232 SmallVector<CCValAssign, 16> ArgLocs; 233 CCState CCInfo(F.getCallingConv(), F.isVarArg(), MF, ArgLocs, F.getContext()); 234 return handleAssignments(CCInfo, ArgLocs, MIRBuilder, Args, Handler); 235 } 236 237 bool CallLowering::handleAssignments(CCState &CCInfo, 238 SmallVectorImpl<CCValAssign> &ArgLocs, 239 MachineIRBuilder &MIRBuilder, 240 SmallVectorImpl<ArgInfo> &Args, 241 ValueHandler &Handler) const { 242 MachineFunction &MF = MIRBuilder.getMF(); 243 const Function &F = MF.getFunction(); 244 const DataLayout &DL = F.getParent()->getDataLayout(); 245 246 unsigned NumArgs = Args.size(); 247 for (unsigned i = 0; i != NumArgs; ++i) { 248 EVT CurVT = EVT::getEVT(Args[i].Ty); 249 if (CurVT.isSimple() && 250 !Handler.assignArg(i, CurVT.getSimpleVT(), CurVT.getSimpleVT(), 251 CCValAssign::Full, Args[i], Args[i].Flags[0], 252 CCInfo)) 253 continue; 254 255 MVT NewVT = TLI->getRegisterTypeForCallingConv( 256 F.getContext(), F.getCallingConv(), EVT(CurVT)); 257 258 // If we need to split the type over multiple regs, check it's a scenario 259 // we currently support. 260 unsigned NumParts = TLI->getNumRegistersForCallingConv( 261 F.getContext(), F.getCallingConv(), CurVT); 262 263 if (NumParts == 1) { 264 // Try to use the register type if we couldn't assign the VT. 265 if (Handler.assignArg(i, NewVT, NewVT, CCValAssign::Full, Args[i], 266 Args[i].Flags[0], CCInfo)) 267 return false; 268 continue; 269 } 270 271 assert(NumParts > 1); 272 // For now only handle exact splits. 273 if (NewVT.getSizeInBits() * NumParts != CurVT.getSizeInBits()) 274 return false; 275 276 // For incoming arguments (physregs to vregs), we could have values in 277 // physregs (or memlocs) which we want to extract and copy to vregs. 278 // During this, we might have to deal with the LLT being split across 279 // multiple regs, so we have to record this information for later. 280 // 281 // If we have outgoing args, then we have the opposite case. We have a 282 // vreg with an LLT which we want to assign to a physical location, and 283 // we might have to record that the value has to be split later. 284 if (Handler.isIncomingArgumentHandler()) { 285 // We're handling an incoming arg which is split over multiple regs. 286 // E.g. passing an s128 on AArch64. 287 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0]; 288 Args[i].OrigRegs.push_back(Args[i].Regs[0]); 289 Args[i].Regs.clear(); 290 Args[i].Flags.clear(); 291 LLT NewLLT = getLLTForMVT(NewVT); 292 // For each split register, create and assign a vreg that will store 293 // the incoming component of the larger value. These will later be 294 // merged to form the final vreg. 295 for (unsigned Part = 0; Part < NumParts; ++Part) { 296 Register Reg = 297 MIRBuilder.getMRI()->createGenericVirtualRegister(NewLLT); 298 ISD::ArgFlagsTy Flags = OrigFlags; 299 if (Part == 0) { 300 Flags.setSplit(); 301 } else { 302 Flags.setOrigAlign(Align(1)); 303 if (Part == NumParts - 1) 304 Flags.setSplitEnd(); 305 } 306 Args[i].Regs.push_back(Reg); 307 Args[i].Flags.push_back(Flags); 308 if (Handler.assignArg(i, NewVT, NewVT, CCValAssign::Full, Args[i], 309 Args[i].Flags[Part], CCInfo)) { 310 // Still couldn't assign this smaller part type for some reason. 311 return false; 312 } 313 } 314 } else { 315 // This type is passed via multiple registers in the calling convention. 316 // We need to extract the individual parts. 317 Register LargeReg = Args[i].Regs[0]; 318 LLT SmallTy = LLT::scalar(NewVT.getSizeInBits()); 319 auto Unmerge = MIRBuilder.buildUnmerge(SmallTy, LargeReg); 320 assert(Unmerge->getNumOperands() == NumParts + 1); 321 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0]; 322 // We're going to replace the regs and flags with the split ones. 323 Args[i].Regs.clear(); 324 Args[i].Flags.clear(); 325 for (unsigned PartIdx = 0; PartIdx < NumParts; ++PartIdx) { 326 ISD::ArgFlagsTy Flags = OrigFlags; 327 if (PartIdx == 0) { 328 Flags.setSplit(); 329 } else { 330 Flags.setOrigAlign(Align(1)); 331 if (PartIdx == NumParts - 1) 332 Flags.setSplitEnd(); 333 } 334 Args[i].Regs.push_back(Unmerge.getReg(PartIdx)); 335 Args[i].Flags.push_back(Flags); 336 if (Handler.assignArg(i, NewVT, NewVT, CCValAssign::Full, 337 Args[i], Args[i].Flags[PartIdx], CCInfo)) 338 return false; 339 } 340 } 341 } 342 343 for (unsigned i = 0, e = Args.size(), j = 0; i != e; ++i, ++j) { 344 assert(j < ArgLocs.size() && "Skipped too many arg locs"); 345 346 CCValAssign &VA = ArgLocs[j]; 347 assert(VA.getValNo() == i && "Location doesn't correspond to current arg"); 348 349 if (VA.needsCustom()) { 350 unsigned NumArgRegs = 351 Handler.assignCustomValue(Args[i], makeArrayRef(ArgLocs).slice(j)); 352 if (!NumArgRegs) 353 return false; 354 j += NumArgRegs; 355 continue; 356 } 357 358 // FIXME: Pack registers if we have more than one. 359 Register ArgReg = Args[i].Regs[0]; 360 361 EVT OrigVT = EVT::getEVT(Args[i].Ty); 362 EVT VAVT = VA.getValVT(); 363 const LLT OrigTy = getLLTForType(*Args[i].Ty, DL); 364 365 // Expected to be multiple regs for a single incoming arg. 366 // There should be Regs.size() ArgLocs per argument. 367 unsigned NumArgRegs = Args[i].Regs.size(); 368 369 assert((j + (NumArgRegs - 1)) < ArgLocs.size() && 370 "Too many regs for number of args"); 371 for (unsigned Part = 0; Part < NumArgRegs; ++Part) { 372 // There should be Regs.size() ArgLocs per argument. 373 VA = ArgLocs[j + Part]; 374 if (VA.isMemLoc()) { 375 // Don't currently support loading/storing a type that needs to be split 376 // to the stack. Should be easy, just not implemented yet. 377 if (NumArgRegs > 1) { 378 LLVM_DEBUG( 379 dbgs() 380 << "Load/store a split arg to/from the stack not implemented yet\n"); 381 return false; 382 } 383 384 // FIXME: Use correct address space for pointer size 385 EVT LocVT = VA.getValVT(); 386 unsigned MemSize = LocVT == MVT::iPTR ? DL.getPointerSize() 387 : LocVT.getStoreSize(); 388 unsigned Offset = VA.getLocMemOffset(); 389 MachinePointerInfo MPO; 390 Register StackAddr = Handler.getStackAddress(MemSize, Offset, MPO); 391 Handler.assignValueToAddress(Args[i], StackAddr, 392 MemSize, MPO, VA); 393 continue; 394 } 395 396 assert(VA.isRegLoc() && "custom loc should have been handled already"); 397 398 // GlobalISel does not currently work for scalable vectors. 399 if (OrigVT.getFixedSizeInBits() >= VAVT.getFixedSizeInBits() || 400 !Handler.isIncomingArgumentHandler()) { 401 // This is an argument that might have been split. There should be 402 // Regs.size() ArgLocs per argument. 403 404 // Insert the argument copies. If VAVT < OrigVT, we'll insert the merge 405 // to the original register after handling all of the parts. 406 Handler.assignValueToReg(Args[i].Regs[Part], VA.getLocReg(), VA); 407 continue; 408 } 409 410 // This ArgLoc covers multiple pieces, so we need to split it. 411 const LLT VATy(VAVT.getSimpleVT()); 412 Register NewReg = 413 MIRBuilder.getMRI()->createGenericVirtualRegister(VATy); 414 Handler.assignValueToReg(NewReg, VA.getLocReg(), VA); 415 // If it's a vector type, we either need to truncate the elements 416 // or do an unmerge to get the lower block of elements. 417 if (VATy.isVector() && 418 VATy.getNumElements() > OrigVT.getVectorNumElements()) { 419 // Just handle the case where the VA type is 2 * original type. 420 if (VATy.getNumElements() != OrigVT.getVectorNumElements() * 2) { 421 LLVM_DEBUG(dbgs() 422 << "Incoming promoted vector arg has too many elts"); 423 return false; 424 } 425 auto Unmerge = MIRBuilder.buildUnmerge({OrigTy, OrigTy}, {NewReg}); 426 MIRBuilder.buildCopy(ArgReg, Unmerge.getReg(0)); 427 } else { 428 MIRBuilder.buildTrunc(ArgReg, {NewReg}).getReg(0); 429 } 430 } 431 432 // Now that all pieces have been handled, re-pack any arguments into any 433 // wider, original registers. 434 if (Handler.isIncomingArgumentHandler()) { 435 if (VAVT.getFixedSizeInBits() < OrigVT.getFixedSizeInBits()) { 436 assert(NumArgRegs >= 2); 437 438 // Merge the split registers into the expected larger result vreg 439 // of the original call. 440 MIRBuilder.buildMerge(Args[i].OrigRegs[0], Args[i].Regs); 441 } 442 } 443 444 j += NumArgRegs - 1; 445 } 446 447 return true; 448 } 449 450 void CallLowering::insertSRetLoads(MachineIRBuilder &MIRBuilder, Type *RetTy, 451 ArrayRef<Register> VRegs, Register DemoteReg, 452 int FI) const { 453 MachineFunction &MF = MIRBuilder.getMF(); 454 MachineRegisterInfo &MRI = MF.getRegInfo(); 455 const DataLayout &DL = MF.getDataLayout(); 456 457 SmallVector<EVT, 4> SplitVTs; 458 SmallVector<uint64_t, 4> Offsets; 459 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, &Offsets, 0); 460 461 assert(VRegs.size() == SplitVTs.size()); 462 463 unsigned NumValues = SplitVTs.size(); 464 Align BaseAlign = DL.getPrefTypeAlign(RetTy); 465 Type *RetPtrTy = RetTy->getPointerTo(DL.getAllocaAddrSpace()); 466 LLT OffsetLLTy = getLLTForType(*DL.getIntPtrType(RetPtrTy), DL); 467 468 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, FI); 469 470 for (unsigned I = 0; I < NumValues; ++I) { 471 Register Addr; 472 MIRBuilder.materializePtrAdd(Addr, DemoteReg, OffsetLLTy, Offsets[I]); 473 auto *MMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOLoad, 474 MRI.getType(VRegs[I]).getSizeInBytes(), 475 commonAlignment(BaseAlign, Offsets[I])); 476 MIRBuilder.buildLoad(VRegs[I], Addr, *MMO); 477 } 478 } 479 480 void CallLowering::insertSRetStores(MachineIRBuilder &MIRBuilder, Type *RetTy, 481 ArrayRef<Register> VRegs, 482 Register DemoteReg) const { 483 MachineFunction &MF = MIRBuilder.getMF(); 484 MachineRegisterInfo &MRI = MF.getRegInfo(); 485 const DataLayout &DL = MF.getDataLayout(); 486 487 SmallVector<EVT, 4> SplitVTs; 488 SmallVector<uint64_t, 4> Offsets; 489 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, &Offsets, 0); 490 491 assert(VRegs.size() == SplitVTs.size()); 492 493 unsigned NumValues = SplitVTs.size(); 494 Align BaseAlign = DL.getPrefTypeAlign(RetTy); 495 unsigned AS = DL.getAllocaAddrSpace(); 496 LLT OffsetLLTy = 497 getLLTForType(*DL.getIntPtrType(RetTy->getPointerTo(AS)), DL); 498 499 MachinePointerInfo PtrInfo(AS); 500 501 for (unsigned I = 0; I < NumValues; ++I) { 502 Register Addr; 503 MIRBuilder.materializePtrAdd(Addr, DemoteReg, OffsetLLTy, Offsets[I]); 504 auto *MMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore, 505 MRI.getType(VRegs[I]).getSizeInBytes(), 506 commonAlignment(BaseAlign, Offsets[I])); 507 MIRBuilder.buildStore(VRegs[I], Addr, *MMO); 508 } 509 } 510 511 void CallLowering::insertSRetIncomingArgument( 512 const Function &F, SmallVectorImpl<ArgInfo> &SplitArgs, Register &DemoteReg, 513 MachineRegisterInfo &MRI, const DataLayout &DL) const { 514 unsigned AS = DL.getAllocaAddrSpace(); 515 DemoteReg = MRI.createGenericVirtualRegister( 516 LLT::pointer(AS, DL.getPointerSizeInBits(AS))); 517 518 Type *PtrTy = PointerType::get(F.getReturnType(), AS); 519 520 SmallVector<EVT, 1> ValueVTs; 521 ComputeValueVTs(*TLI, DL, PtrTy, ValueVTs); 522 523 // NOTE: Assume that a pointer won't get split into more than one VT. 524 assert(ValueVTs.size() == 1); 525 526 ArgInfo DemoteArg(DemoteReg, ValueVTs[0].getTypeForEVT(PtrTy->getContext())); 527 setArgFlags(DemoteArg, AttributeList::ReturnIndex, DL, F); 528 DemoteArg.Flags[0].setSRet(); 529 SplitArgs.insert(SplitArgs.begin(), DemoteArg); 530 } 531 532 void CallLowering::insertSRetOutgoingArgument(MachineIRBuilder &MIRBuilder, 533 const CallBase &CB, 534 CallLoweringInfo &Info) const { 535 const DataLayout &DL = MIRBuilder.getDataLayout(); 536 Type *RetTy = CB.getType(); 537 unsigned AS = DL.getAllocaAddrSpace(); 538 LLT FramePtrTy = LLT::pointer(AS, DL.getPointerSizeInBits(AS)); 539 540 int FI = MIRBuilder.getMF().getFrameInfo().CreateStackObject( 541 DL.getTypeAllocSize(RetTy), DL.getPrefTypeAlign(RetTy), false); 542 543 Register DemoteReg = MIRBuilder.buildFrameIndex(FramePtrTy, FI).getReg(0); 544 ArgInfo DemoteArg(DemoteReg, PointerType::get(RetTy, AS)); 545 setArgFlags(DemoteArg, AttributeList::ReturnIndex, DL, CB); 546 DemoteArg.Flags[0].setSRet(); 547 548 Info.OrigArgs.insert(Info.OrigArgs.begin(), DemoteArg); 549 Info.DemoteStackIndex = FI; 550 Info.DemoteRegister = DemoteReg; 551 } 552 553 bool CallLowering::checkReturn(CCState &CCInfo, 554 SmallVectorImpl<BaseArgInfo> &Outs, 555 CCAssignFn *Fn) const { 556 for (unsigned I = 0, E = Outs.size(); I < E; ++I) { 557 MVT VT = MVT::getVT(Outs[I].Ty); 558 if (Fn(I, VT, VT, CCValAssign::Full, Outs[I].Flags[0], CCInfo)) 559 return false; 560 } 561 return true; 562 } 563 564 void CallLowering::getReturnInfo(CallingConv::ID CallConv, Type *RetTy, 565 AttributeList Attrs, 566 SmallVectorImpl<BaseArgInfo> &Outs, 567 const DataLayout &DL) const { 568 LLVMContext &Context = RetTy->getContext(); 569 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy(); 570 571 SmallVector<EVT, 4> SplitVTs; 572 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs); 573 addArgFlagsFromAttributes(Flags, Attrs, AttributeList::ReturnIndex); 574 575 for (EVT VT : SplitVTs) { 576 unsigned NumParts = 577 TLI->getNumRegistersForCallingConv(Context, CallConv, VT); 578 MVT RegVT = TLI->getRegisterTypeForCallingConv(Context, CallConv, VT); 579 Type *PartTy = EVT(RegVT).getTypeForEVT(Context); 580 581 for (unsigned I = 0; I < NumParts; ++I) { 582 Outs.emplace_back(PartTy, Flags); 583 } 584 } 585 } 586 587 bool CallLowering::checkReturnTypeForCallConv(MachineFunction &MF) const { 588 const auto &F = MF.getFunction(); 589 Type *ReturnType = F.getReturnType(); 590 CallingConv::ID CallConv = F.getCallingConv(); 591 592 SmallVector<BaseArgInfo, 4> SplitArgs; 593 getReturnInfo(CallConv, ReturnType, F.getAttributes(), SplitArgs, 594 MF.getDataLayout()); 595 return canLowerReturn(MF, CallConv, SplitArgs, F.isVarArg(), 596 ReturnType->getContext()); 597 } 598 599 bool CallLowering::analyzeArgInfo(CCState &CCState, 600 SmallVectorImpl<ArgInfo> &Args, 601 CCAssignFn &AssignFnFixed, 602 CCAssignFn &AssignFnVarArg) const { 603 for (unsigned i = 0, e = Args.size(); i < e; ++i) { 604 MVT VT = MVT::getVT(Args[i].Ty); 605 CCAssignFn &Fn = Args[i].IsFixed ? AssignFnFixed : AssignFnVarArg; 606 if (Fn(i, VT, VT, CCValAssign::Full, Args[i].Flags[0], CCState)) { 607 // Bail out on anything we can't handle. 608 LLVM_DEBUG(dbgs() << "Cannot analyze " << EVT(VT).getEVTString() 609 << " (arg number = " << i << "\n"); 610 return false; 611 } 612 } 613 return true; 614 } 615 616 bool CallLowering::resultsCompatible(CallLoweringInfo &Info, 617 MachineFunction &MF, 618 SmallVectorImpl<ArgInfo> &InArgs, 619 CCAssignFn &CalleeAssignFnFixed, 620 CCAssignFn &CalleeAssignFnVarArg, 621 CCAssignFn &CallerAssignFnFixed, 622 CCAssignFn &CallerAssignFnVarArg) const { 623 const Function &F = MF.getFunction(); 624 CallingConv::ID CalleeCC = Info.CallConv; 625 CallingConv::ID CallerCC = F.getCallingConv(); 626 627 if (CallerCC == CalleeCC) 628 return true; 629 630 SmallVector<CCValAssign, 16> ArgLocs1; 631 CCState CCInfo1(CalleeCC, false, MF, ArgLocs1, F.getContext()); 632 if (!analyzeArgInfo(CCInfo1, InArgs, CalleeAssignFnFixed, 633 CalleeAssignFnVarArg)) 634 return false; 635 636 SmallVector<CCValAssign, 16> ArgLocs2; 637 CCState CCInfo2(CallerCC, false, MF, ArgLocs2, F.getContext()); 638 if (!analyzeArgInfo(CCInfo2, InArgs, CallerAssignFnFixed, 639 CalleeAssignFnVarArg)) 640 return false; 641 642 // We need the argument locations to match up exactly. If there's more in 643 // one than the other, then we are done. 644 if (ArgLocs1.size() != ArgLocs2.size()) 645 return false; 646 647 // Make sure that each location is passed in exactly the same way. 648 for (unsigned i = 0, e = ArgLocs1.size(); i < e; ++i) { 649 const CCValAssign &Loc1 = ArgLocs1[i]; 650 const CCValAssign &Loc2 = ArgLocs2[i]; 651 652 // We need both of them to be the same. So if one is a register and one 653 // isn't, we're done. 654 if (Loc1.isRegLoc() != Loc2.isRegLoc()) 655 return false; 656 657 if (Loc1.isRegLoc()) { 658 // If they don't have the same register location, we're done. 659 if (Loc1.getLocReg() != Loc2.getLocReg()) 660 return false; 661 662 // They matched, so we can move to the next ArgLoc. 663 continue; 664 } 665 666 // Loc1 wasn't a RegLoc, so they both must be MemLocs. Check if they match. 667 if (Loc1.getLocMemOffset() != Loc2.getLocMemOffset()) 668 return false; 669 } 670 671 return true; 672 } 673 674 Register CallLowering::ValueHandler::extendRegister(Register ValReg, 675 CCValAssign &VA, 676 unsigned MaxSizeBits) { 677 LLT LocTy{VA.getLocVT()}; 678 LLT ValTy = MRI.getType(ValReg); 679 if (LocTy.getSizeInBits() == ValTy.getSizeInBits()) 680 return ValReg; 681 682 if (LocTy.isScalar() && MaxSizeBits && MaxSizeBits < LocTy.getSizeInBits()) { 683 if (MaxSizeBits <= ValTy.getSizeInBits()) 684 return ValReg; 685 LocTy = LLT::scalar(MaxSizeBits); 686 } 687 688 switch (VA.getLocInfo()) { 689 default: break; 690 case CCValAssign::Full: 691 case CCValAssign::BCvt: 692 // FIXME: bitconverting between vector types may or may not be a 693 // nop in big-endian situations. 694 return ValReg; 695 case CCValAssign::AExt: { 696 auto MIB = MIRBuilder.buildAnyExt(LocTy, ValReg); 697 return MIB.getReg(0); 698 } 699 case CCValAssign::SExt: { 700 Register NewReg = MRI.createGenericVirtualRegister(LocTy); 701 MIRBuilder.buildSExt(NewReg, ValReg); 702 return NewReg; 703 } 704 case CCValAssign::ZExt: { 705 Register NewReg = MRI.createGenericVirtualRegister(LocTy); 706 MIRBuilder.buildZExt(NewReg, ValReg); 707 return NewReg; 708 } 709 } 710 llvm_unreachable("unable to extend register"); 711 } 712 713 void CallLowering::ValueHandler::anchor() {} 714