LLVM 23.0.0git
CallLowering.cpp
Go to the documentation of this file.
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
23#include "llvm/IR/DataLayout.h"
24#include "llvm/IR/LLVMContext.h"
25#include "llvm/IR/Module.h"
27
28#define DEBUG_TYPE "call-lowering"
29
30using namespace llvm;
31
32void CallLowering::anchor() {}
33
34/// Helper function which updates \p Flags when \p AttrFn returns true.
35static void
37 const std::function<bool(Attribute::AttrKind)> &AttrFn) {
38 // TODO: There are missing flags. Add them here.
39 if (AttrFn(Attribute::SExt))
40 Flags.setSExt();
41 if (AttrFn(Attribute::ZExt))
42 Flags.setZExt();
43 if (AttrFn(Attribute::InReg))
44 Flags.setInReg();
45 if (AttrFn(Attribute::StructRet))
46 Flags.setSRet();
47 if (AttrFn(Attribute::Nest))
48 Flags.setNest();
49 if (AttrFn(Attribute::ByVal))
50 Flags.setByVal();
51 if (AttrFn(Attribute::ByRef))
52 Flags.setByRef();
53 if (AttrFn(Attribute::Preallocated))
54 Flags.setPreallocated();
55 if (AttrFn(Attribute::InAlloca))
56 Flags.setInAlloca();
57 if (AttrFn(Attribute::Returned))
58 Flags.setReturned();
59 if (AttrFn(Attribute::SwiftSelf))
60 Flags.setSwiftSelf();
61 if (AttrFn(Attribute::SwiftAsync))
62 Flags.setSwiftAsync();
63 if (AttrFn(Attribute::SwiftError))
64 Flags.setSwiftError();
65}
66
68 unsigned ArgIdx) const {
69 ISD::ArgFlagsTy Flags;
70 addFlagsUsingAttrFn(Flags, [&Call, &ArgIdx](Attribute::AttrKind Attr) {
71 return Call.paramHasAttr(ArgIdx, Attr);
72 });
73 return Flags;
74}
75
78 ISD::ArgFlagsTy Flags;
80 return Call.hasRetAttr(Attr);
81 });
82 return Flags;
83}
84
86 const AttributeList &Attrs,
87 unsigned OpIdx) const {
88 addFlagsUsingAttrFn(Flags, [&Attrs, &OpIdx](Attribute::AttrKind Attr) {
89 return Attrs.hasAttributeAtIndex(OpIdx, Attr);
90 });
91}
92
94 ArrayRef<Register> ResRegs,
96 Register SwiftErrorVReg,
97 std::optional<PtrAuthInfo> PAI,
98 Register ConvergenceCtrlToken,
99 std::function<Register()> GetCalleeReg) const {
100 CallLoweringInfo Info;
101 const DataLayout &DL = MIRBuilder.getDataLayout();
102 MachineFunction &MF = MIRBuilder.getMF();
104 bool CanBeTailCalled = CB.isTailCall() &&
106 (MF.getFunction()
107 .getFnAttribute("disable-tail-calls")
108 .getValueAsString() != "true");
109
110 CallingConv::ID CallConv = CB.getCallingConv();
111 Type *RetTy = CB.getType();
112 bool IsVarArg = CB.getFunctionType()->isVarArg();
113
115 getReturnInfo(CallConv, RetTy, CB.getAttributes(), SplitArgs, DL);
116 Info.CanLowerReturn = canLowerReturn(MF, CallConv, SplitArgs, IsVarArg);
117
118 Info.IsConvergent = CB.isConvergent();
119
120 if (!Info.CanLowerReturn) {
121 // Callee requires sret demotion.
122 insertSRetOutgoingArgument(MIRBuilder, CB, Info);
123
124 // The sret demotion isn't compatible with tail-calls, since the sret
125 // argument points into the caller's stack frame.
126 CanBeTailCalled = false;
127 }
128
129 // First step is to marshall all the function's parameters into the correct
130 // physregs and memory locations. Gather the sequence of argument types that
131 // we'll pass to the assigner function.
132 unsigned i = 0;
133 unsigned NumFixedArgs = CB.getFunctionType()->getNumParams();
134 for (const auto &Arg : CB.args()) {
135 ArgInfo OrigArg{ArgRegs[i], *Arg.get(), i, getAttributesForArgIdx(CB, i)};
136 setArgFlags(OrigArg, i + AttributeList::FirstArgIndex, DL, CB);
137 if (i >= NumFixedArgs)
138 OrigArg.Flags[0].setVarArg();
139
140 // If we have an explicit sret argument that is an Instruction, (i.e., it
141 // might point to function-local memory), we can't meaningfully tail-call.
142 if (OrigArg.Flags[0].isSRet() && isa<Instruction>(&Arg))
143 CanBeTailCalled = false;
144
145 Info.OrigArgs.push_back(OrigArg);
146 ++i;
147 }
148
149 // Try looking through a bitcast from one function type to another.
150 // Commonly happens with calls to objc_msgSend().
151 const Value *CalleeV = CB.getCalledOperand()->stripPointerCasts();
152
153 // If IRTranslator chose to drop the ptrauth info, we can turn this into
154 // a direct call.
156 CalleeV = cast<ConstantPtrAuth>(CalleeV)->getPointer();
157 assert(isa<Function>(CalleeV));
158 }
159
160 if (const Function *F = dyn_cast<Function>(CalleeV)) {
161 if (F->hasFnAttribute(Attribute::NonLazyBind)) {
162 LLT Ty = getLLTForType(*F->getType(), DL);
163 Register Reg = MIRBuilder.buildGlobalValue(Ty, F).getReg(0);
164 Info.Callee = MachineOperand::CreateReg(Reg, false);
165 } else {
166 Info.Callee = MachineOperand::CreateGA(F, 0);
167 }
168 } else if (isa<GlobalIFunc>(CalleeV) || isa<GlobalAlias>(CalleeV)) {
169 // IR IFuncs and Aliases can't be forward declared (only defined), so the
170 // callee must be in the same TU and therefore we can direct-call it without
171 // worrying about it being out of range.
172 Info.Callee = MachineOperand::CreateGA(cast<GlobalValue>(CalleeV), 0);
173 } else
174 Info.Callee = MachineOperand::CreateReg(GetCalleeReg(), false);
175
176 Register ReturnHintAlignReg;
177 Align ReturnHintAlign;
178
179 Info.OrigRet = ArgInfo{ResRegs, RetTy, 0, getAttributesForReturn(CB)};
180
181 if (!Info.OrigRet.Ty->isVoidTy()) {
182 setArgFlags(Info.OrigRet, AttributeList::ReturnIndex, DL, CB);
183
184 if (MaybeAlign Alignment = CB.getRetAlign()) {
185 if (*Alignment > Align(1)) {
186 ReturnHintAlignReg = MRI.cloneVirtualRegister(ResRegs[0]);
187 Info.OrigRet.Regs[0] = ReturnHintAlignReg;
188 ReturnHintAlign = *Alignment;
189 }
190 }
191 }
192
193 auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi);
194 if (Bundle && CB.isIndirectCall()) {
195 Info.CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
196 assert(Info.CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
197 }
198
200 Info.DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0]);
201 }
202
203 Info.CB = &CB;
204 Info.KnownCallees = CB.getMetadata(LLVMContext::MD_callees);
205 Info.CallConv = CallConv;
206 Info.SwiftErrorVReg = SwiftErrorVReg;
207 Info.PAI = PAI;
208 Info.ConvergenceCtrlToken = ConvergenceCtrlToken;
209 Info.IsMustTailCall = CB.isMustTailCall();
210 Info.IsTailCall = CanBeTailCalled;
211 Info.IsVarArg = IsVarArg;
212 if (!lowerCall(MIRBuilder, Info))
213 return false;
214
215 if (ReturnHintAlignReg && !Info.LoweredTailCall) {
216 MIRBuilder.buildAssertAlign(ResRegs[0], ReturnHintAlignReg,
217 ReturnHintAlign);
218 }
219
220 return true;
221}
222
223template <typename FuncInfoTy>
225 const DataLayout &DL,
226 const FuncInfoTy &FuncInfo) const {
227 auto &Flags = Arg.Flags[0];
228 const AttributeList &Attrs = FuncInfo.getAttributes();
229 addArgFlagsFromAttributes(Flags, Attrs, OpIdx);
230
232 if (PtrTy) {
233 Flags.setPointer();
234 Flags.setPointerAddrSpace(PtrTy->getPointerAddressSpace());
235 }
236
237 Align MemAlign = DL.getABITypeAlign(Arg.Ty);
238 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
239 Flags.isByRef()) {
240 assert(OpIdx >= AttributeList::FirstArgIndex);
241 unsigned ParamIdx = OpIdx - AttributeList::FirstArgIndex;
242
243 Type *ElementTy = FuncInfo.getParamByValType(ParamIdx);
244 if (!ElementTy)
245 ElementTy = FuncInfo.getParamByRefType(ParamIdx);
246 if (!ElementTy)
247 ElementTy = FuncInfo.getParamInAllocaType(ParamIdx);
248 if (!ElementTy)
249 ElementTy = FuncInfo.getParamPreallocatedType(ParamIdx);
250
251 assert(ElementTy && "Must have byval, inalloca or preallocated type");
252
253 uint64_t MemSize = DL.getTypeAllocSize(ElementTy);
254 if (Flags.isByRef())
255 Flags.setByRefSize(MemSize);
256 else
257 Flags.setByValSize(MemSize);
258
259 // For ByVal, alignment should be passed from FE. BE will guess if
260 // this info is not there but there are cases it cannot get right.
261 if (auto ParamAlign = FuncInfo.getParamStackAlign(ParamIdx))
262 MemAlign = *ParamAlign;
263 else if ((ParamAlign = FuncInfo.getParamAlign(ParamIdx)))
264 MemAlign = *ParamAlign;
265 else
266 MemAlign = getTLI()->getByValTypeAlignment(ElementTy, DL);
267 } else if (OpIdx >= AttributeList::FirstArgIndex) {
268 if (auto ParamAlign =
269 FuncInfo.getParamStackAlign(OpIdx - AttributeList::FirstArgIndex))
270 MemAlign = *ParamAlign;
271 }
272 Flags.setMemAlign(MemAlign);
273 Flags.setOrigAlign(DL.getABITypeAlign(Arg.Ty));
274
275 // Don't try to use the returned attribute if the argument is marked as
276 // swiftself, since it won't be passed in x0.
277 if (Flags.isSwiftSelf())
278 Flags.setReturned(false);
279}
280
281template void
283 const DataLayout &DL,
284 const Function &FuncInfo) const;
285
286template void
288 const DataLayout &DL,
289 const CallBase &FuncInfo) const;
290
292 SmallVectorImpl<ArgInfo> &SplitArgs,
293 const DataLayout &DL,
294 CallingConv::ID CallConv,
295 SmallVectorImpl<TypeSize> *Offsets) const {
296 SmallVector<Type *, 4> SplitTys;
297 ComputeValueTypes(DL, OrigArg.Ty, SplitTys, Offsets);
298
299 if (SplitTys.size() == 0)
300 return;
301
302 if (SplitTys.size() == 1) {
303 // No splitting to do, but we want to replace the original type (e.g. [1 x
304 // double] -> double).
305 SplitArgs.emplace_back(OrigArg.Regs[0], SplitTys[0], OrigArg.OrigArgIndex,
306 OrigArg.Flags[0], OrigArg.OrigValue);
307 return;
308 }
309
310 // Create one ArgInfo for each virtual register in the original ArgInfo.
311 assert(OrigArg.Regs.size() == SplitTys.size() && "Regs / types mismatch");
312
313 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
314 OrigArg.Ty, CallConv, false, DL);
315 for (unsigned i = 0, e = SplitTys.size(); i < e; ++i) {
316 SplitArgs.emplace_back(OrigArg.Regs[i], SplitTys[i], OrigArg.OrigArgIndex,
317 OrigArg.Flags[0]);
318 if (NeedsRegBlock)
319 SplitArgs.back().Flags[0].setInConsecutiveRegs();
320 }
321
322 SplitArgs.back().Flags[0].setInConsecutiveRegsLast();
323}
324
325/// Pack values \p SrcRegs to cover the vector type result \p DstRegs.
328 ArrayRef<Register> SrcRegs) {
329 MachineRegisterInfo &MRI = *B.getMRI();
330 LLT LLTy = MRI.getType(DstRegs[0]);
331 LLT PartLLT = MRI.getType(SrcRegs[0]);
332
333 // Deal with v3s16 split into v2s16
334 LLT LCMTy = getCoverTy(LLTy, PartLLT);
335 if (LCMTy == LLTy) {
336 // Common case where no padding is needed.
337 assert(DstRegs.size() == 1);
338 return B.buildConcatVectors(DstRegs[0], SrcRegs);
339 }
340
341 // We need to create an unmerge to the result registers, which may require
342 // widening the original value.
343 Register UnmergeSrcReg;
344 if (LCMTy != PartLLT) {
345 assert(DstRegs.size() == 1);
346 return B.buildDeleteTrailingVectorElements(
347 DstRegs[0], B.buildMergeLikeInstr(LCMTy, SrcRegs));
348 } else {
349 // We don't need to widen anything if we're extracting a scalar which was
350 // promoted to a vector e.g. s8 -> v4s8 -> s8
351 assert(SrcRegs.size() == 1);
352 UnmergeSrcReg = SrcRegs[0];
353 }
354
355 int NumDst = LCMTy.getSizeInBits() / LLTy.getSizeInBits();
356
357 SmallVector<Register, 8> PadDstRegs(NumDst);
358 llvm::copy(DstRegs, PadDstRegs.begin());
359
360 // Create the excess dead defs for the unmerge.
361 for (int I = DstRegs.size(); I != NumDst; ++I)
362 PadDstRegs[I] = MRI.createGenericVirtualRegister(LLTy);
363
364 if (PadDstRegs.size() == 1)
365 return B.buildDeleteTrailingVectorElements(DstRegs[0], UnmergeSrcReg);
366 return B.buildUnmerge(PadDstRegs, UnmergeSrcReg);
367}
368
370 ArrayRef<Register> OrigRegs,
371 ArrayRef<Register> Regs, LLT LLTy,
372 LLT PartLLT, const ISD::ArgFlagsTy Flags) {
373 MachineRegisterInfo &MRI = *B.getMRI();
374
375 if (PartLLT == LLTy) {
376 // We should have avoided introducing a new virtual register, and just
377 // directly assigned here.
378 assert(OrigRegs[0] == Regs[0]);
379 return;
380 }
381
382 if (PartLLT.getSizeInBits() == LLTy.getSizeInBits() && OrigRegs.size() == 1 &&
383 Regs.size() == 1) {
384 B.buildBitcast(OrigRegs[0], Regs[0]);
385 return;
386 }
387
388 // A vector PartLLT needs extending to LLTy's element size.
389 // E.g. <2 x s64> = G_SEXT <2 x s32>.
390 if (PartLLT.isVector() == LLTy.isVector() &&
391 PartLLT.getScalarSizeInBits() > LLTy.getScalarSizeInBits() &&
392 (!PartLLT.isVector() ||
393 PartLLT.getElementCount() == LLTy.getElementCount()) &&
394 OrigRegs.size() == 1 && Regs.size() == 1) {
395 Register SrcReg = Regs[0];
396
397 LLT LocTy = MRI.getType(SrcReg);
398
399 if (Flags.isSExt()) {
400 SrcReg = B.buildAssertSExt(LocTy, SrcReg, LLTy.getScalarSizeInBits())
401 .getReg(0);
402 } else if (Flags.isZExt()) {
403 SrcReg = B.buildAssertZExt(LocTy, SrcReg, LLTy.getScalarSizeInBits())
404 .getReg(0);
405 }
406
407 // Sometimes pointers are passed zero extended.
408 LLT OrigTy = MRI.getType(OrigRegs[0]);
409 if (OrigTy.isPointer()) {
410 LLT IntPtrTy = LLT::scalar(OrigTy.getSizeInBits());
411 B.buildIntToPtr(OrigRegs[0], B.buildTrunc(IntPtrTy, SrcReg));
412 return;
413 }
414
415 B.buildTrunc(OrigRegs[0], SrcReg);
416 return;
417 }
418
419 if (!LLTy.isVector() && !PartLLT.isVector()) {
420 assert(OrigRegs.size() == 1);
421 LLT OrigTy = MRI.getType(OrigRegs[0]);
422
423 unsigned SrcSize = PartLLT.getSizeInBits().getFixedValue() * Regs.size();
424 if (SrcSize == OrigTy.getSizeInBits())
425 B.buildMergeValues(OrigRegs[0], Regs);
426 else {
427 auto Widened = B.buildMergeLikeInstr(LLT::scalar(SrcSize), Regs);
428 B.buildTrunc(OrigRegs[0], Widened);
429 }
430
431 return;
432 }
433
434 if (PartLLT.isVector()) {
435 assert(OrigRegs.size() == 1);
436 SmallVector<Register> CastRegs(Regs);
437
438 // If PartLLT is a mismatched vector in both number of elements and element
439 // size, e.g. PartLLT == v2s64 and LLTy is v3s32, then first coerce it to
440 // have the same elt type, i.e. v4s32.
441 // TODO: Extend this coersion to element multiples other than just 2.
442 if (TypeSize::isKnownGT(PartLLT.getSizeInBits(), LLTy.getSizeInBits()) &&
443 PartLLT.getScalarSizeInBits() == LLTy.getScalarSizeInBits() * 2 &&
444 Regs.size() == 1) {
445 LLT NewTy = PartLLT.changeElementType(LLTy.getElementType())
446 .changeElementCount(PartLLT.getElementCount() * 2);
447 CastRegs[0] = B.buildBitcast(NewTy, Regs[0]).getReg(0);
448 PartLLT = NewTy;
449 }
450
451 if (LLTy.getScalarType() == PartLLT.getElementType()) {
452 mergeVectorRegsToResultRegs(B, OrigRegs, CastRegs);
453 } else {
454 unsigned I = 0;
455 LLT GCDTy = getGCDType(LLTy, PartLLT);
456
457 // We are both splitting a vector, and bitcasting its element types. Cast
458 // the source pieces into the appropriate number of pieces with the result
459 // element type.
460 for (Register SrcReg : CastRegs)
461 CastRegs[I++] = B.buildBitcast(GCDTy, SrcReg).getReg(0);
462 mergeVectorRegsToResultRegs(B, OrigRegs, CastRegs);
463 }
464
465 return;
466 }
467
468 assert(LLTy.isVector() && !PartLLT.isVector());
469
470 LLT DstEltTy = LLTy.getElementType();
471
472 // Pointer information was discarded. We'll need to coerce some register types
473 // to avoid violating type constraints.
474 LLT RealDstEltTy = MRI.getType(OrigRegs[0]).getElementType();
475
476 assert(DstEltTy.getSizeInBits() == RealDstEltTy.getSizeInBits());
477
478 if (DstEltTy == PartLLT) {
479 // Vector was trivially scalarized.
480
481 if (RealDstEltTy.isPointer()) {
482 for (Register Reg : Regs)
483 MRI.setType(Reg, RealDstEltTy);
484 }
485
486 B.buildBuildVector(OrigRegs[0], Regs);
487 } else if (DstEltTy.getSizeInBits() > PartLLT.getSizeInBits()) {
488 // Deal with vector with 64-bit elements decomposed to 32-bit
489 // registers. Need to create intermediate 64-bit elements.
490 SmallVector<Register, 8> EltMerges;
491 int PartsPerElt =
492 divideCeil(DstEltTy.getSizeInBits(), PartLLT.getSizeInBits());
493 LLT ExtendedPartTy = LLT::scalar(PartLLT.getSizeInBits() * PartsPerElt);
494
495 for (int I = 0, NumElts = LLTy.getNumElements(); I != NumElts; ++I) {
496 auto Merge =
497 B.buildMergeLikeInstr(ExtendedPartTy, Regs.take_front(PartsPerElt));
498 if (ExtendedPartTy.getSizeInBits() > RealDstEltTy.getSizeInBits())
499 Merge = B.buildTrunc(RealDstEltTy, Merge);
500 // Fix the type in case this is really a vector of pointers.
501 MRI.setType(Merge.getReg(0), RealDstEltTy);
502 EltMerges.push_back(Merge.getReg(0));
503 Regs = Regs.drop_front(PartsPerElt);
504 }
505
506 B.buildBuildVector(OrigRegs[0], EltMerges);
507 } else {
508 // Vector was split, and elements promoted to a wider type.
509 // FIXME: Should handle floating point promotions.
510 unsigned NumElts = LLTy.getNumElements();
511 LLT BVType = LLT::fixed_vector(NumElts, PartLLT);
512
513 Register BuildVec;
514 if (NumElts == Regs.size())
515 BuildVec = B.buildBuildVector(BVType, Regs).getReg(0);
516 else {
517 // Vector elements are packed in the inputs.
518 // e.g. we have a <4 x s16> but 2 x s32 in regs.
519 assert(NumElts > Regs.size());
520 LLT SrcEltTy = MRI.getType(Regs[0]);
521
522 LLT OriginalEltTy = MRI.getType(OrigRegs[0]).getElementType();
523
524 // Input registers contain packed elements.
525 // Determine how many elements per reg.
526 assert((SrcEltTy.getSizeInBits() % OriginalEltTy.getSizeInBits()) == 0);
527 unsigned EltPerReg =
528 (SrcEltTy.getSizeInBits() / OriginalEltTy.getSizeInBits());
529
531 BVRegs.reserve(Regs.size() * EltPerReg);
532 for (Register R : Regs) {
533 auto Unmerge = B.buildUnmerge(OriginalEltTy, R);
534 for (unsigned K = 0; K < EltPerReg; ++K)
535 BVRegs.push_back(B.buildAnyExt(PartLLT, Unmerge.getReg(K)).getReg(0));
536 }
537
538 // We may have some more elements in BVRegs, e.g. if we have 2 s32 pieces
539 // for a <3 x s16> vector. We should have less than EltPerReg extra items.
540 if (BVRegs.size() > NumElts) {
541 assert((BVRegs.size() - NumElts) < EltPerReg);
542 BVRegs.truncate(NumElts);
543 }
544 BuildVec = B.buildBuildVector(BVType, BVRegs).getReg(0);
545 }
546 B.buildTrunc(OrigRegs[0], BuildVec);
547 }
548}
549
551 ArrayRef<Register> DstRegs, Register SrcReg,
552 LLT SrcTy, LLT PartTy, unsigned ExtendOp) {
553 // We could just insert a regular copy, but this is unreachable at the moment.
554 assert(SrcTy != PartTy && "identical part types shouldn't reach here");
555
556 const TypeSize PartSize = PartTy.getSizeInBits();
557
558 if (PartSize == SrcTy.getSizeInBits() && DstRegs.size() == 1) {
559 // TODO: Handle int<->ptr casts. It just happens the ABI lowering
560 // assignments are not pointer aware.
561 B.buildBitcast(DstRegs[0], SrcReg);
562 return;
563 }
564
565 if (PartTy.isVector() == SrcTy.isVector() &&
566 PartTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits()) {
567 assert(DstRegs.size() == 1);
568 B.buildInstr(ExtendOp, {DstRegs[0]}, {SrcReg});
569 return;
570 }
571
572 if (SrcTy.isVector() && !PartTy.isVector() &&
573 TypeSize::isKnownGT(PartSize, SrcTy.getElementType().getSizeInBits()) &&
574 SrcTy.getElementCount() == ElementCount::getFixed(DstRegs.size())) {
575 // Vector was scalarized, and the elements extended.
576 auto UnmergeToEltTy = B.buildUnmerge(SrcTy.getElementType(), SrcReg);
577 for (int i = 0, e = DstRegs.size(); i != e; ++i)
578 B.buildAnyExt(DstRegs[i], UnmergeToEltTy.getReg(i));
579 return;
580 }
581
582 if (SrcTy.isVector() && PartTy.isVector() &&
583 PartTy.getSizeInBits() == SrcTy.getSizeInBits() &&
584 ElementCount::isKnownLT(SrcTy.getElementCount(),
585 PartTy.getElementCount())) {
586 // A coercion like: v2f32 -> v4f32 or nxv2f32 -> nxv4f32
587 Register DstReg = DstRegs.front();
588 B.buildPadVectorWithUndefElements(DstReg, SrcReg);
589 return;
590 }
591
592 LLT GCDTy = getGCDType(SrcTy, PartTy);
593 if (GCDTy == PartTy) {
594 // If this already evenly divisible, we can create a simple unmerge.
595 B.buildUnmerge(DstRegs, SrcReg);
596 return;
597 }
598
599 if (SrcTy.isVector() && !PartTy.isVector() &&
600 SrcTy.getScalarSizeInBits() > PartTy.getSizeInBits()) {
601 LLT ExtTy =
602 LLT::vector(SrcTy.getElementCount(),
603 LLT::scalar(PartTy.getScalarSizeInBits() * DstRegs.size() /
604 SrcTy.getNumElements()));
605 auto Ext = B.buildAnyExt(ExtTy, SrcReg);
606 B.buildUnmerge(DstRegs, Ext);
607 return;
608 }
609
610 MachineRegisterInfo &MRI = *B.getMRI();
611 LLT DstTy = MRI.getType(DstRegs[0]);
612 LLT CoverTy = getCoverTy(SrcTy, PartTy);
613 if (SrcTy.isVector() && DstRegs.size() > 1) {
614 TypeSize FullCoverSize =
615 DstTy.getSizeInBits().multiplyCoefficientBy(DstRegs.size());
616
617 LLT EltTy = SrcTy.getElementType();
618 TypeSize EltSize = EltTy.getSizeInBits();
619 if (FullCoverSize.isKnownMultipleOf(EltSize)) {
620 TypeSize VecSize = FullCoverSize.divideCoefficientBy(EltSize);
621 CoverTy =
622 LLT::vector(ElementCount::get(VecSize, VecSize.isScalable()), EltTy);
623 }
624 }
625
626 if (PartTy.isVector() && CoverTy == PartTy) {
627 assert(DstRegs.size() == 1);
628 B.buildPadVectorWithUndefElements(DstRegs[0], SrcReg);
629 return;
630 }
631
632 const unsigned DstSize = DstTy.getSizeInBits();
633 const unsigned SrcSize = SrcTy.getSizeInBits();
634 unsigned CoveringSize = CoverTy.getSizeInBits();
635
636 Register UnmergeSrc = SrcReg;
637
638 if (!CoverTy.isVector() && CoveringSize != SrcSize) {
639 // For scalars, it's common to be able to use a simple extension.
640 if (SrcTy.isScalar() && DstTy.isScalar()) {
641 CoveringSize = alignTo(SrcSize, DstSize);
642 LLT CoverTy = LLT::scalar(CoveringSize);
643 UnmergeSrc = B.buildInstr(ExtendOp, {CoverTy}, {SrcReg}).getReg(0);
644 } else {
645 // Widen to the common type.
646 // FIXME: This should respect the extend type
647 Register Undef = B.buildUndef(SrcTy).getReg(0);
648 SmallVector<Register, 8> MergeParts(1, SrcReg);
649 for (unsigned Size = SrcSize; Size != CoveringSize; Size += SrcSize)
650 MergeParts.push_back(Undef);
651 UnmergeSrc = B.buildMergeLikeInstr(CoverTy, MergeParts).getReg(0);
652 }
653 }
654
655 if (CoverTy.isVector() && CoveringSize != SrcSize)
656 UnmergeSrc = B.buildPadVectorWithUndefElements(CoverTy, SrcReg).getReg(0);
657
658 B.buildUnmerge(DstRegs, UnmergeSrc);
659}
660
662 ValueHandler &Handler, ValueAssigner &Assigner,
664 CallingConv::ID CallConv, bool IsVarArg,
665 ArrayRef<Register> ThisReturnRegs) const {
666 MachineFunction &MF = MIRBuilder.getMF();
667 const Function &F = MF.getFunction();
669
670 CCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, F.getContext());
671 if (!determineAssignments(Assigner, Args, CCInfo))
672 return false;
673
674 return handleAssignments(Handler, Args, CCInfo, ArgLocs, MIRBuilder,
675 ThisReturnRegs);
676}
677
679 if (Flags.isSExt())
680 return TargetOpcode::G_SEXT;
681 if (Flags.isZExt())
682 return TargetOpcode::G_ZEXT;
683 return TargetOpcode::G_ANYEXT;
684}
685
688 CCState &CCInfo) const {
689 LLVMContext &Ctx = CCInfo.getContext();
690 const DataLayout &DL = CCInfo.getMachineFunction().getDataLayout();
691 const CallingConv::ID CallConv = CCInfo.getCallingConv();
692
693 unsigned NumArgs = Args.size();
694 for (unsigned i = 0; i != NumArgs; ++i) {
695 EVT CurVT = TLI->getValueType(DL, Args[i].Ty);
696
697 MVT NewVT = TLI->getRegisterTypeForCallingConv(Ctx, CallConv, CurVT);
698
699 // If we need to split the type over multiple regs, check it's a scenario
700 // we currently support.
701 unsigned NumParts =
702 TLI->getNumRegistersForCallingConv(Ctx, CallConv, CurVT);
703
704 if (NumParts == 1) {
705 // Try to use the register type if we couldn't assign the VT.
706 if (Assigner.assignArg(i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
707 Args[i].Flags[0], CCInfo))
708 return false;
709 continue;
710 }
711
712 // For incoming arguments (physregs to vregs), we could have values in
713 // physregs (or memlocs) which we want to extract and copy to vregs.
714 // During this, we might have to deal with the LLT being split across
715 // multiple regs, so we have to record this information for later.
716 //
717 // If we have outgoing args, then we have the opposite case. We have a
718 // vreg with an LLT which we want to assign to a physical location, and
719 // we might have to record that the value has to be split later.
720
721 // We're handling an incoming arg which is split over multiple regs.
722 // E.g. passing an s128 on AArch64.
723 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0];
724 Args[i].Flags.clear();
725
726 for (unsigned Part = 0; Part < NumParts; ++Part) {
727 ISD::ArgFlagsTy Flags = OrigFlags;
728 if (Part == 0) {
729 Flags.setSplit();
730 } else {
731 Flags.setOrigAlign(Align(1));
732 if (Part == NumParts - 1)
733 Flags.setSplitEnd();
734 }
735
736 Args[i].Flags.push_back(Flags);
737 if (Assigner.assignArg(i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
738 Args[i].Flags[Part], CCInfo)) {
739 // Still couldn't assign this smaller part type for some reason.
740 return false;
741 }
742 }
743 }
744
745 return true;
746}
747
750 CCState &CCInfo,
752 MachineIRBuilder &MIRBuilder,
753 ArrayRef<Register> ThisReturnRegs) const {
754 MachineFunction &MF = MIRBuilder.getMF();
756 const Function &F = MF.getFunction();
757 const DataLayout &DL = F.getDataLayout();
758
759 const unsigned NumArgs = Args.size();
760
761 // Stores thunks for outgoing register assignments. This is used so we delay
762 // generating register copies until mem loc assignments are done. We do this
763 // so that if the target is using the delayed stack protector feature, we can
764 // find the split point of the block accurately. E.g. if we have:
765 // G_STORE %val, %memloc
766 // $x0 = COPY %foo
767 // $x1 = COPY %bar
768 // CALL func
769 // ... then the split point for the block will correctly be at, and including,
770 // the copy to $x0. If instead the G_STORE instruction immediately precedes
771 // the CALL, then we'd prematurely choose the CALL as the split point, thus
772 // generating a split block with a CALL that uses undefined physregs.
773 SmallVector<std::function<void()>> DelayedOutgoingRegAssignments;
774
775 for (unsigned i = 0, j = 0; i != NumArgs; ++i, ++j) {
776 assert(j < ArgLocs.size() && "Skipped too many arg locs");
777 CCValAssign &VA = ArgLocs[j];
778 assert(VA.getValNo() == i && "Location doesn't correspond to current arg");
779
780 if (VA.needsCustom()) {
781 std::function<void()> Thunk;
782 unsigned NumArgRegs = Handler.assignCustomValue(
783 Args[i], ArrayRef(ArgLocs).slice(j), &Thunk);
784 if (Thunk)
785 DelayedOutgoingRegAssignments.emplace_back(Thunk);
786 if (!NumArgRegs)
787 return false;
788 j += (NumArgRegs - 1);
789 continue;
790 }
791
792 auto AllocaAddressSpace = MF.getDataLayout().getAllocaAddrSpace();
793
794 const MVT ValVT = VA.getValVT();
795 const MVT LocVT = VA.getLocVT();
796
797 const LLT LocTy(LocVT);
798 const LLT ValTy(ValVT);
799 const LLT NewLLT = Handler.isIncomingArgumentHandler() ? LocTy : ValTy;
800 const EVT OrigVT = TLI->getValueType(DL, Args[i].Ty);
801 // Use the EVT here to strip pointerness.
802 const LLT OrigTy = getLLTForType(*OrigVT.getTypeForEVT(F.getContext()), DL);
803 const LLT PointerTy = LLT::pointer(
804 AllocaAddressSpace, DL.getPointerSizeInBits(AllocaAddressSpace));
805
806 // Expected to be multiple regs for a single incoming arg.
807 // There should be Regs.size() ArgLocs per argument.
808 // This should be the same as getNumRegistersForCallingConv
809 const unsigned NumParts = Args[i].Flags.size();
810
811 // Now split the registers into the assigned types.
812 Args[i].OrigRegs.assign(Args[i].Regs.begin(), Args[i].Regs.end());
813
814 if (NumParts != 1 || NewLLT != OrigTy) {
815 // If we can't directly assign the register, we need one or more
816 // intermediate values.
817 Args[i].Regs.resize(NumParts);
818
819 // When we have indirect parameter passing we are receiving a pointer,
820 // that points to the actual value, so we need one "temporary" pointer.
821 if (VA.getLocInfo() == CCValAssign::Indirect) {
822 if (Handler.isIncomingArgumentHandler())
823 Args[i].Regs[0] = MRI.createGenericVirtualRegister(PointerTy);
824 } else {
825 // For each split register, create and assign a vreg that will store
826 // the incoming component of the larger value. These will later be
827 // merged to form the final vreg.
828 for (unsigned Part = 0; Part < NumParts; ++Part)
829 Args[i].Regs[Part] = MRI.createGenericVirtualRegister(NewLLT);
830 }
831 }
832
833 assert((j + (NumParts - 1)) < ArgLocs.size() &&
834 "Too many regs for number of args");
835
836 // Coerce into outgoing value types before register assignment.
837 if (!Handler.isIncomingArgumentHandler() && OrigTy != ValTy &&
839 assert(Args[i].OrigRegs.size() == 1);
840 buildCopyToRegs(MIRBuilder, Args[i].Regs, Args[i].OrigRegs[0], OrigTy,
841 ValTy, extendOpFromFlags(Args[i].Flags[0]));
842 }
843
844 bool IndirectParameterPassingHandled = false;
845 bool BigEndianPartOrdering = TLI->hasBigEndianPartOrdering(OrigVT, DL);
846 for (unsigned Part = 0; Part < NumParts; ++Part) {
847 assert((VA.getLocInfo() != CCValAssign::Indirect || Part == 0) &&
848 "Only the first parameter should be processed when "
849 "handling indirect passing!");
850 Register ArgReg = Args[i].Regs[Part];
851 // There should be Regs.size() ArgLocs per argument.
852 unsigned Idx = BigEndianPartOrdering ? NumParts - 1 - Part : Part;
853 CCValAssign &VA = ArgLocs[j + Idx];
854 const ISD::ArgFlagsTy Flags = Args[i].Flags[Part];
855
856 // We found an indirect parameter passing, and we have an
857 // OutgoingValueHandler as our handler (so we are at the call site or the
858 // return value). In this case, start the construction of the following
859 // GMIR, that is responsible for the preparation of indirect parameter
860 // passing:
861 //
862 // %1(indirectly passed type) = The value to pass
863 // %3(pointer) = G_FRAME_INDEX %stack.0
864 // G_STORE %1, %3 :: (store (s128), align 8)
865 //
866 // After this GMIR, the remaining part of the loop body will decide how
867 // to get the value to the caller and we break out of the loop.
868 if (VA.getLocInfo() == CCValAssign::Indirect &&
869 !Handler.isIncomingArgumentHandler()) {
870 Align AlignmentForStored = DL.getPrefTypeAlign(Args[i].Ty);
871 MachineFrameInfo &MFI = MF.getFrameInfo();
872 // Get some space on the stack for the value, so later we can pass it
873 // as a reference.
874 int FrameIdx = MFI.CreateStackObject(OrigTy.getScalarSizeInBits(),
875 AlignmentForStored, false);
876 Register PointerToStackReg =
877 MIRBuilder.buildFrameIndex(PointerTy, FrameIdx).getReg(0);
878 MachinePointerInfo StackPointerMPO =
880 // Store the value in the previously created stack space.
881 MIRBuilder.buildStore(Args[i].OrigRegs[Part], PointerToStackReg,
882 StackPointerMPO,
883 inferAlignFromPtrInfo(MF, StackPointerMPO));
884
885 ArgReg = PointerToStackReg;
886 IndirectParameterPassingHandled = true;
887 }
888
889 if (VA.isMemLoc() && !Flags.isByVal()) {
890 // Individual pieces may have been spilled to the stack and others
891 // passed in registers.
892
893 // TODO: The memory size may be larger than the value we need to
894 // store. We may need to adjust the offset for big endian targets.
895 LLT MemTy = Handler.getStackValueStoreType(DL, VA, Flags);
896
898 Register StackAddr =
900 ? PointerTy.getSizeInBytes()
901 : MemTy.getSizeInBytes(),
902 VA.getLocMemOffset(), MPO, Flags);
903
904 // Finish the handling of indirect passing from the passers
905 // (OutgoingParameterHandler) side.
906 // This branch is needed, so the pointer to the value is loaded onto the
907 // stack.
909 Handler.assignValueToAddress(ArgReg, StackAddr, PointerTy, MPO, VA);
910 else
911 Handler.assignValueToAddress(Args[i], Part, StackAddr, MemTy, MPO,
912 VA);
913 } else if (VA.isMemLoc() && Flags.isByVal()) {
914 assert(Args[i].Regs.size() == 1 && "didn't expect split byval pointer");
915
916 if (Handler.isIncomingArgumentHandler()) {
917 // We just need to copy the frame index value to the pointer.
919 Register StackAddr = Handler.getStackAddress(
920 Flags.getByValSize(), VA.getLocMemOffset(), MPO, Flags);
921 MIRBuilder.buildCopy(Args[i].Regs[0], StackAddr);
922 } else {
923 // For outgoing byval arguments, insert the implicit copy byval
924 // implies, such that writes in the callee do not modify the caller's
925 // value.
926 uint64_t MemSize = Flags.getByValSize();
927 int64_t Offset = VA.getLocMemOffset();
928
929 MachinePointerInfo DstMPO;
930 Register StackAddr =
931 Handler.getStackAddress(MemSize, Offset, DstMPO, Flags);
932
933 MachinePointerInfo SrcMPO(Args[i].OrigValue);
934 if (!Args[i].OrigValue) {
935 // We still need to accurately track the stack address space if we
936 // don't know the underlying value.
937 const LLT PtrTy = MRI.getType(StackAddr);
938 SrcMPO = MachinePointerInfo(PtrTy.getAddressSpace());
939 }
940
941 Align DstAlign = std::max(Flags.getNonZeroByValAlign(),
942 inferAlignFromPtrInfo(MF, DstMPO));
943
944 Align SrcAlign = std::max(Flags.getNonZeroByValAlign(),
945 inferAlignFromPtrInfo(MF, SrcMPO));
946
947 Handler.copyArgumentMemory(Args[i], StackAddr, Args[i].Regs[0],
948 DstMPO, DstAlign, SrcMPO, SrcAlign,
949 MemSize, VA);
950 }
951 } else if (i == 0 && !ThisReturnRegs.empty() &&
952 Handler.isIncomingArgumentHandler() &&
954 Handler.assignValueToReg(ArgReg, ThisReturnRegs[Part], VA);
955 } else if (Handler.isIncomingArgumentHandler()) {
956 Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA);
957 } else {
958 DelayedOutgoingRegAssignments.emplace_back([=, &Handler]() {
959 Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA);
960 });
961 }
962
963 // Finish the handling of indirect parameter passing when receiving
964 // the value (we are in the called function or the caller when receiving
965 // the return value).
966 if (VA.getLocInfo() == CCValAssign::Indirect &&
967 Handler.isIncomingArgumentHandler()) {
968 Align Alignment = DL.getABITypeAlign(Args[i].Ty);
970
971 // Since we are doing indirect parameter passing, we know that the value
972 // in the temporary register is not the value passed to the function,
973 // but rather a pointer to that value. Let's load that value into the
974 // virtual register where the parameter should go.
975 MIRBuilder.buildLoad(Args[i].OrigRegs[0], Args[i].Regs[0], MPO,
976 Alignment);
977
978 IndirectParameterPassingHandled = true;
979 }
980
981 if (IndirectParameterPassingHandled)
982 break;
983 }
984
985 // Now that all pieces have been assigned, re-pack the register typed values
986 // into the original value typed registers. This is only necessary, when
987 // the value was passed in multiple registers, not indirectly.
988 if (Handler.isIncomingArgumentHandler() && OrigVT != LocVT &&
989 !IndirectParameterPassingHandled) {
990 // Merge the split registers into the expected larger result vregs of
991 // the original call.
992 buildCopyFromRegs(MIRBuilder, Args[i].OrigRegs, Args[i].Regs, OrigTy,
993 LocTy, Args[i].Flags[0]);
994 }
995
996 j += NumParts - 1;
997 }
998 for (auto &Fn : DelayedOutgoingRegAssignments)
999 Fn();
1000
1001 return true;
1002}
1003
1005 ArrayRef<Register> VRegs, Register DemoteReg,
1006 int FI) const {
1007 MachineFunction &MF = MIRBuilder.getMF();
1009 const DataLayout &DL = MF.getDataLayout();
1010
1011 SmallVector<EVT, 4> SplitVTs;
1013 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, /*MemVTs=*/nullptr, &Offsets, 0);
1014
1015 assert(VRegs.size() == SplitVTs.size());
1016
1017 unsigned NumValues = SplitVTs.size();
1018 Align BaseAlign = DL.getPrefTypeAlign(RetTy);
1019 Type *RetPtrTy =
1020 PointerType::get(RetTy->getContext(), DL.getAllocaAddrSpace());
1021 LLT OffsetLLTy = getLLTForType(*DL.getIndexType(RetPtrTy), DL);
1022
1024
1025 for (unsigned I = 0; I < NumValues; ++I) {
1026 Register Addr;
1027 MIRBuilder.materializeObjectPtrOffset(Addr, DemoteReg, OffsetLLTy,
1028 Offsets[I]);
1029 auto *MMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOLoad,
1030 MRI.getType(VRegs[I]),
1031 commonAlignment(BaseAlign, Offsets[I]));
1032 MIRBuilder.buildLoad(VRegs[I], Addr, *MMO);
1033 }
1034}
1035
1037 ArrayRef<Register> VRegs,
1038 Register DemoteReg) const {
1039 MachineFunction &MF = MIRBuilder.getMF();
1041 const DataLayout &DL = MF.getDataLayout();
1042
1043 SmallVector<EVT, 4> SplitVTs;
1045 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, /*MemVTs=*/nullptr, &Offsets, 0);
1046
1047 assert(VRegs.size() == SplitVTs.size());
1048
1049 unsigned NumValues = SplitVTs.size();
1050 Align BaseAlign = DL.getPrefTypeAlign(RetTy);
1051 unsigned AS = DL.getAllocaAddrSpace();
1052 LLT OffsetLLTy = getLLTForType(*DL.getIndexType(RetTy->getContext(), AS), DL);
1053
1054 MachinePointerInfo PtrInfo(AS);
1055
1056 for (unsigned I = 0; I < NumValues; ++I) {
1057 Register Addr;
1058 MIRBuilder.materializeObjectPtrOffset(Addr, DemoteReg, OffsetLLTy,
1059 Offsets[I]);
1060 auto *MMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
1061 MRI.getType(VRegs[I]),
1062 commonAlignment(BaseAlign, Offsets[I]));
1063 MIRBuilder.buildStore(VRegs[I], Addr, *MMO);
1064 }
1065}
1066
1068 const Function &F, SmallVectorImpl<ArgInfo> &SplitArgs, Register &DemoteReg,
1069 MachineRegisterInfo &MRI, const DataLayout &DL) const {
1070 unsigned AS = DL.getAllocaAddrSpace();
1071 DemoteReg = MRI.createGenericVirtualRegister(
1072 LLT::pointer(AS, DL.getPointerSizeInBits(AS)));
1073
1074 Type *PtrTy = PointerType::get(F.getContext(), AS);
1075
1076 SmallVector<EVT, 1> ValueVTs;
1077 ComputeValueVTs(*TLI, DL, PtrTy, ValueVTs);
1078
1079 // NOTE: Assume that a pointer won't get split into more than one VT.
1080 assert(ValueVTs.size() == 1);
1081
1082 ArgInfo DemoteArg(DemoteReg, ValueVTs[0].getTypeForEVT(PtrTy->getContext()),
1084 setArgFlags(DemoteArg, AttributeList::ReturnIndex, DL, F);
1085 DemoteArg.Flags[0].setSRet();
1086 SplitArgs.insert(SplitArgs.begin(), DemoteArg);
1087}
1088
1090 const CallBase &CB,
1091 CallLoweringInfo &Info) const {
1092 const DataLayout &DL = MIRBuilder.getDataLayout();
1093 Type *RetTy = CB.getType();
1094 unsigned AS = DL.getAllocaAddrSpace();
1095 LLT FramePtrTy = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
1096
1097 int FI = MIRBuilder.getMF().getFrameInfo().CreateStackObject(
1098 DL.getTypeAllocSize(RetTy), DL.getPrefTypeAlign(RetTy), false);
1099
1100 Register DemoteReg = MIRBuilder.buildFrameIndex(FramePtrTy, FI).getReg(0);
1101 ArgInfo DemoteArg(DemoteReg, PointerType::get(RetTy->getContext(), AS),
1103 setArgFlags(DemoteArg, AttributeList::ReturnIndex, DL, CB);
1104 DemoteArg.Flags[0].setSRet();
1105
1106 Info.OrigArgs.insert(Info.OrigArgs.begin(), DemoteArg);
1107 Info.DemoteStackIndex = FI;
1108 Info.DemoteRegister = DemoteReg;
1109}
1110
1113 CCAssignFn *Fn) const {
1114 for (unsigned I = 0, E = Outs.size(); I < E; ++I) {
1115 MVT VT = MVT::getVT(Outs[I].Ty);
1116 if (Fn(I, VT, VT, CCValAssign::Full, Outs[I].Flags[0], Outs[I].Ty, CCInfo))
1117 return false;
1118 }
1119 return true;
1120}
1121
1123 AttributeList Attrs,
1125 const DataLayout &DL) const {
1126 LLVMContext &Context = RetTy->getContext();
1128
1129 SmallVector<EVT, 4> SplitVTs;
1130 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs);
1131 addArgFlagsFromAttributes(Flags, Attrs, AttributeList::ReturnIndex);
1132
1133 for (EVT VT : SplitVTs) {
1134 unsigned NumParts =
1135 TLI->getNumRegistersForCallingConv(Context, CallConv, VT);
1136 MVT RegVT = TLI->getRegisterTypeForCallingConv(Context, CallConv, VT);
1137 Type *PartTy = EVT(RegVT).getTypeForEVT(Context);
1138
1139 for (unsigned I = 0; I < NumParts; ++I) {
1140 Outs.emplace_back(PartTy, Flags);
1141 }
1142 }
1143}
1144
1146 const auto &F = MF.getFunction();
1147 Type *ReturnType = F.getReturnType();
1148 CallingConv::ID CallConv = F.getCallingConv();
1149
1151 getReturnInfo(CallConv, ReturnType, F.getAttributes(), SplitArgs,
1152 MF.getDataLayout());
1153 return canLowerReturn(MF, CallConv, SplitArgs, F.isVarArg());
1154}
1155
1157 const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask,
1158 const SmallVectorImpl<CCValAssign> &OutLocs,
1159 const SmallVectorImpl<ArgInfo> &OutArgs) const {
1160 for (unsigned i = 0; i < OutLocs.size(); ++i) {
1161 const auto &ArgLoc = OutLocs[i];
1162 // If it's not a register, it's fine.
1163 if (!ArgLoc.isRegLoc())
1164 continue;
1165
1166 MCRegister PhysReg = ArgLoc.getLocReg();
1167
1168 // Only look at callee-saved registers.
1169 if (MachineOperand::clobbersPhysReg(CallerPreservedMask, PhysReg))
1170 continue;
1171
1172 LLVM_DEBUG(
1173 dbgs()
1174 << "... Call has an argument passed in a callee-saved register.\n");
1175
1176 // Check if it was copied from.
1177 const ArgInfo &OutInfo = OutArgs[i];
1178
1179 if (OutInfo.Regs.size() > 1) {
1180 LLVM_DEBUG(
1181 dbgs() << "... Cannot handle arguments in multiple registers.\n");
1182 return false;
1183 }
1184
1185 // Check if we copy the register, walking through copies from virtual
1186 // registers. Note that getDefIgnoringCopies does not ignore copies from
1187 // physical registers.
1188 MachineInstr *RegDef = getDefIgnoringCopies(OutInfo.Regs[0], MRI);
1189 if (!RegDef || RegDef->getOpcode() != TargetOpcode::COPY) {
1190 LLVM_DEBUG(
1191 dbgs()
1192 << "... Parameter was not copied into a VReg, cannot tail call.\n");
1193 return false;
1194 }
1195
1196 // Got a copy. Verify that it's the same as the register we want.
1197 Register CopyRHS = RegDef->getOperand(1).getReg();
1198 if (CopyRHS != PhysReg) {
1199 LLVM_DEBUG(dbgs() << "... Callee-saved register was not copied into "
1200 "VReg, cannot tail call.\n");
1201 return false;
1202 }
1203 }
1204
1205 return true;
1206}
1207
1209 MachineFunction &MF,
1211 ValueAssigner &CalleeAssigner,
1212 ValueAssigner &CallerAssigner) const {
1213 const Function &F = MF.getFunction();
1214 CallingConv::ID CalleeCC = Info.CallConv;
1215 CallingConv::ID CallerCC = F.getCallingConv();
1216
1217 if (CallerCC == CalleeCC)
1218 return true;
1219
1221 CCState CCInfo1(CalleeCC, Info.IsVarArg, MF, ArgLocs1, F.getContext());
1222 if (!determineAssignments(CalleeAssigner, InArgs, CCInfo1))
1223 return false;
1224
1226 CCState CCInfo2(CallerCC, F.isVarArg(), MF, ArgLocs2, F.getContext());
1227 if (!determineAssignments(CallerAssigner, InArgs, CCInfo2))
1228 return false;
1229
1230 // We need the argument locations to match up exactly. If there's more in
1231 // one than the other, then we are done.
1232 if (ArgLocs1.size() != ArgLocs2.size())
1233 return false;
1234
1235 // Make sure that each location is passed in exactly the same way.
1236 for (unsigned i = 0, e = ArgLocs1.size(); i < e; ++i) {
1237 const CCValAssign &Loc1 = ArgLocs1[i];
1238 const CCValAssign &Loc2 = ArgLocs2[i];
1239
1240 // We need both of them to be the same. So if one is a register and one
1241 // isn't, we're done.
1242 if (Loc1.isRegLoc() != Loc2.isRegLoc())
1243 return false;
1244
1245 if (Loc1.isRegLoc()) {
1246 // If they don't have the same register location, we're done.
1247 if (Loc1.getLocReg() != Loc2.getLocReg())
1248 return false;
1249
1250 // They matched, so we can move to the next ArgLoc.
1251 continue;
1252 }
1253
1254 // Loc1 wasn't a RegLoc, so they both must be MemLocs. Check if they match.
1255 if (Loc1.getLocMemOffset() != Loc2.getLocMemOffset())
1256 return false;
1257 }
1258
1259 return true;
1260}
1261
1263 const DataLayout &DL, const CCValAssign &VA, ISD::ArgFlagsTy Flags) const {
1264 const MVT ValVT = VA.getValVT();
1265 if (ValVT != MVT::iPTR) {
1266 LLT ValTy(ValVT);
1267
1268 // We lost the pointeriness going through CCValAssign, so try to restore it
1269 // based on the flags.
1270 if (Flags.isPointer()) {
1271 LLT PtrTy = LLT::pointer(Flags.getPointerAddrSpace(),
1272 ValTy.getScalarSizeInBits());
1273 if (ValVT.isVector() && ValVT.getVectorNumElements() != 1)
1274 return LLT::vector(ValTy.getElementCount(), PtrTy);
1275 return PtrTy;
1276 }
1277
1278 return ValTy;
1279 }
1280
1281 unsigned AddrSpace = Flags.getPointerAddrSpace();
1282 return LLT::pointer(AddrSpace, DL.getPointerSize(AddrSpace));
1283}
1284
1286 const ArgInfo &Arg, Register DstPtr, Register SrcPtr,
1287 const MachinePointerInfo &DstPtrInfo, Align DstAlign,
1288 const MachinePointerInfo &SrcPtrInfo, Align SrcAlign, uint64_t MemSize,
1289 CCValAssign &VA) const {
1290 MachineFunction &MF = MIRBuilder.getMF();
1292 SrcPtrInfo,
1294 SrcAlign);
1295
1297 DstPtrInfo,
1299 MemSize, DstAlign);
1300
1301 const LLT PtrTy = MRI.getType(DstPtr);
1302 const LLT SizeTy = LLT::scalar(PtrTy.getSizeInBits());
1303
1304 auto SizeConst = MIRBuilder.buildConstant(SizeTy, MemSize);
1305 MIRBuilder.buildMemCpy(DstPtr, SrcPtr, SizeConst, *DstMMO, *SrcMMO);
1306}
1307
1309 const CCValAssign &VA,
1310 unsigned MaxSizeBits) {
1311 LLT LocTy{VA.getLocVT()};
1312 LLT ValTy{VA.getValVT()};
1313
1314 if (LocTy.getSizeInBits() == ValTy.getSizeInBits())
1315 return ValReg;
1316
1317 if (LocTy.isScalar() && MaxSizeBits && MaxSizeBits < LocTy.getSizeInBits()) {
1318 if (MaxSizeBits <= ValTy.getSizeInBits())
1319 return ValReg;
1320 LocTy = LLT::scalar(MaxSizeBits);
1321 }
1322
1323 const LLT ValRegTy = MRI.getType(ValReg);
1324 if (ValRegTy.isPointer()) {
1325 // The x32 ABI wants to zero extend 32-bit pointers to 64-bit registers, so
1326 // we have to cast to do the extension.
1327 LLT IntPtrTy = LLT::scalar(ValRegTy.getSizeInBits());
1328 ValReg = MIRBuilder.buildPtrToInt(IntPtrTy, ValReg).getReg(0);
1329 }
1330
1331 switch (VA.getLocInfo()) {
1332 default:
1333 break;
1334 case CCValAssign::Full:
1335 case CCValAssign::BCvt:
1336 // FIXME: bitconverting between vector types may or may not be a
1337 // nop in big-endian situations.
1338 return ValReg;
1339 case CCValAssign::AExt: {
1340 auto MIB = MIRBuilder.buildAnyExt(LocTy, ValReg);
1341 return MIB.getReg(0);
1342 }
1343 case CCValAssign::SExt: {
1344 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
1345 MIRBuilder.buildSExt(NewReg, ValReg);
1346 return NewReg;
1347 }
1348 case CCValAssign::ZExt: {
1349 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
1350 MIRBuilder.buildZExt(NewReg, ValReg);
1351 return NewReg;
1352 }
1353 }
1354 llvm_unreachable("unable to extend register");
1355}
1356
1357void CallLowering::ValueAssigner::anchor() {}
1358
1360 const CCValAssign &VA, Register SrcReg, LLT NarrowTy) {
1361 switch (VA.getLocInfo()) {
1363 return MIRBuilder
1364 .buildAssertZExt(MRI.cloneVirtualRegister(SrcReg), SrcReg,
1365 NarrowTy.getScalarSizeInBits())
1366 .getReg(0);
1367 }
1369 return MIRBuilder
1370 .buildAssertSExt(MRI.cloneVirtualRegister(SrcReg), SrcReg,
1371 NarrowTy.getScalarSizeInBits())
1372 .getReg(0);
1373 break;
1374 }
1375 default:
1376 return SrcReg;
1377 }
1378}
1379
1380/// Check if we can use a basic COPY instruction between the two types.
1381///
1382/// We're currently building on top of the infrastructure using MVT, which loses
1383/// pointer information in the CCValAssign. We accept copies from physical
1384/// registers that have been reported as integers if it's to an equivalent sized
1385/// pointer LLT.
1386static bool isCopyCompatibleType(LLT SrcTy, LLT DstTy) {
1387 if (SrcTy == DstTy)
1388 return true;
1389
1390 if (SrcTy.getSizeInBits() != DstTy.getSizeInBits())
1391 return false;
1392
1393 SrcTy = SrcTy.getScalarType();
1394 DstTy = DstTy.getScalarType();
1395
1396 return (SrcTy.isPointer() && DstTy.isScalar()) ||
1397 (DstTy.isPointer() && SrcTy.isScalar());
1398}
1399
1401 Register ValVReg, Register PhysReg, const CCValAssign &VA) {
1402 const MVT LocVT = VA.getLocVT();
1403 const LLT LocTy(LocVT);
1404 const LLT RegTy = MRI.getType(ValVReg);
1405
1406 if (isCopyCompatibleType(RegTy, LocTy)) {
1407 MIRBuilder.buildCopy(ValVReg, PhysReg);
1408 return;
1409 }
1410
1411 auto Copy = MIRBuilder.buildCopy(LocTy, PhysReg);
1412 auto Hint = buildExtensionHint(VA, Copy.getReg(0), RegTy);
1413 MIRBuilder.buildTrunc(ValVReg, Hint);
1414}
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static void addFlagsUsingAttrFn(ISD::ArgFlagsTy &Flags, const std::function< bool(Attribute::AttrKind)> &AttrFn)
Helper function which updates Flags when AttrFn returns true.
static MachineInstrBuilder mergeVectorRegsToResultRegs(MachineIRBuilder &B, ArrayRef< Register > DstRegs, ArrayRef< Register > SrcRegs)
Pack values SrcRegs to cover the vector type result DstRegs.
static bool isCopyCompatibleType(LLT SrcTy, LLT DstTy)
Check if we can use a basic COPY instruction between the two types.
static unsigned extendOpFromFlags(llvm::ISD::ArgFlagsTy Flags)
This file describes how to lower LLVM calls to machine code calls.
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file declares the MachineIRBuilder class.
Promote Memory to Register
Definition Mem2Reg.cpp:110
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
MachineInstr unsigned OpIdx
R600 Clause Merge
#define LLVM_DEBUG(...)
Definition Debug.h:114
This file describes how to lower LLVM code to machine code.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
ArrayRef< T > take_front(size_t N=1) const
Return a copy of *this with only the first N elements.
Definition ArrayRef.h:219
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition ArrayRef.h:195
const T & front() const
front - Get the first element.
Definition ArrayRef.h:145
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:124
CCState - This class holds information needed while lowering arguments and return values.
MachineFunction & getMachineFunction() const
CallingConv::ID getCallingConv() const
LLVMContext & getContext() const
CCValAssign - Represent assignment of one arg/retval to a location.
Register getLocReg() const
LocInfo getLocInfo() const
bool needsCustom() const
int64_t getLocMemOffset() const
unsigned getValNo() const
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
MaybeAlign getRetAlign() const
Extract the alignment of the return value.
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
CallingConv::ID getCallingConv() const
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Value * getCalledOperand() const
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
void insertSRetOutgoingArgument(MachineIRBuilder &MIRBuilder, const CallBase &CB, CallLoweringInfo &Info) const
For the call-base described by CB, insert the hidden sret ArgInfo to the OrigArgs field of Info.
void insertSRetLoads(MachineIRBuilder &MIRBuilder, Type *RetTy, ArrayRef< Register > VRegs, Register DemoteReg, int FI) const
Load the returned value from the stack into virtual registers in VRegs.
bool checkReturnTypeForCallConv(MachineFunction &MF) const
Toplevel function to check the return type based on the target calling convention.
bool handleAssignments(ValueHandler &Handler, SmallVectorImpl< ArgInfo > &Args, CCState &CCState, SmallVectorImpl< CCValAssign > &ArgLocs, MachineIRBuilder &MIRBuilder, ArrayRef< Register > ThisReturnRegs={}) const
Use Handler to insert code to handle the argument/return values represented by Args.
bool resultsCompatible(CallLoweringInfo &Info, MachineFunction &MF, SmallVectorImpl< ArgInfo > &InArgs, ValueAssigner &CalleeAssigner, ValueAssigner &CallerAssigner) const
virtual bool canLowerReturn(MachineFunction &MF, CallingConv::ID CallConv, SmallVectorImpl< BaseArgInfo > &Outs, bool IsVarArg) const
This hook must be implemented to check whether the return values described by Outs can fit into the r...
virtual bool isTypeIsValidForThisReturn(EVT Ty) const
For targets which support the "returned" parameter attribute, returns true if the given type is a val...
void insertSRetIncomingArgument(const Function &F, SmallVectorImpl< ArgInfo > &SplitArgs, Register &DemoteReg, MachineRegisterInfo &MRI, const DataLayout &DL) const
Insert the hidden sret ArgInfo to the beginning of SplitArgs.
void splitToValueTypes(const ArgInfo &OrigArgInfo, SmallVectorImpl< ArgInfo > &SplitArgs, const DataLayout &DL, CallingConv::ID CallConv, SmallVectorImpl< TypeSize > *Offsets=nullptr) const
Break OrigArgInfo into one or more pieces the calling convention can process, returned in SplitArgs.
static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef< Register > DstRegs, Register SrcReg, LLT SrcTy, LLT PartTy, unsigned ExtendOp=TargetOpcode::G_ANYEXT)
Create a sequence of instructions to expand the value in SrcReg (of type SrcTy) to the types in DstRe...
ISD::ArgFlagsTy getAttributesForArgIdx(const CallBase &Call, unsigned ArgIdx) const
bool determineAndHandleAssignments(ValueHandler &Handler, ValueAssigner &Assigner, SmallVectorImpl< ArgInfo > &Args, MachineIRBuilder &MIRBuilder, CallingConv::ID CallConv, bool IsVarArg, ArrayRef< Register > ThisReturnRegs={}) const
Invoke ValueAssigner::assignArg on each of the given Args and then use Handler to move them to the as...
void insertSRetStores(MachineIRBuilder &MIRBuilder, Type *RetTy, ArrayRef< Register > VRegs, Register DemoteReg) const
Store the return value given by VRegs into stack starting at the offset specified in DemoteReg.
static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef< Register > OrigRegs, ArrayRef< Register > Regs, LLT LLTy, LLT PartLLT, const ISD::ArgFlagsTy Flags)
Create a sequence of instructions to combine pieces split into register typed values to the original ...
void addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags, const AttributeList &Attrs, unsigned OpIdx) const
Adds flags to Flags based off of the attributes in Attrs.
bool parametersInCSRMatch(const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask, const SmallVectorImpl< CCValAssign > &ArgLocs, const SmallVectorImpl< ArgInfo > &OutVals) const
Check whether parameters to a call that are passed in callee saved registers are the same as from the...
void getReturnInfo(CallingConv::ID CallConv, Type *RetTy, AttributeList Attrs, SmallVectorImpl< BaseArgInfo > &Outs, const DataLayout &DL) const
Get the type and the ArgFlags for the split components of RetTy as returned by ComputeValueVTs.
bool determineAssignments(ValueAssigner &Assigner, SmallVectorImpl< ArgInfo > &Args, CCState &CCInfo) const
Analyze the argument list in Args, using Assigner to populate CCInfo.
bool checkReturn(CCState &CCInfo, SmallVectorImpl< BaseArgInfo > &Outs, CCAssignFn *Fn) const
const TargetLowering * getTLI() const
Getter for generic TargetLowering class.
virtual bool lowerCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo &Info) const
This hook must be implemented to lower the given call instruction, including argument and return valu...
void setArgFlags(ArgInfo &Arg, unsigned OpIdx, const DataLayout &DL, const FuncInfoTy &FuncInfo) const
ISD::ArgFlagsTy getAttributesForReturn(const CallBase &Call) const
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
unsigned getAllocaAddrSpace() const
Definition DataLayout.h:246
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
bool isVarArg() const
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
constexpr unsigned getScalarSizeInBits() const
constexpr bool isScalar() const
constexpr LLT changeElementType(LLT NewEltTy) const
If this type is a vector, return a vector with the same number of elements but the new element type.
static constexpr LLT vector(ElementCount EC, unsigned ScalarSizeInBits)
Get a low-level vector of some number of elements and element width.
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
constexpr bool isVector() const
static constexpr LLT pointer(unsigned AddressSpace, unsigned SizeInBits)
Get a low-level pointer in the given address space.
constexpr TypeSize getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
constexpr bool isPointer() const
constexpr LLT getElementType() const
Returns the vector's element type. Only valid for vector types.
constexpr ElementCount getElementCount() const
constexpr unsigned getAddressSpace() const
static constexpr LLT fixed_vector(unsigned NumElements, unsigned ScalarSizeInBits)
Get a low-level fixed-width vector of some number of elements and element width.
constexpr LLT changeElementCount(ElementCount EC) const
Return a vector or scalar with the same element type and the new element count.
constexpr LLT getScalarType() const
constexpr TypeSize getSizeInBytes() const
Returns the total size of the type in bytes, i.e.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
Machine Value Type.
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
static LLVM_ABI MVT getVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Helper class to build MachineInstr.
MachineInstrBuilder buildGlobalValue(const DstOp &Res, const GlobalValue *GV)
Build and insert Res = G_GLOBAL_VALUE GV.
std::optional< MachineInstrBuilder > materializeObjectPtrOffset(Register &Res, Register Op0, const LLT ValueTy, uint64_t Value)
Materialize and insert an instruction with appropriate flags for addressing some offset of an object,...
MachineInstrBuilder buildLoad(const DstOp &Res, const SrcOp &Addr, MachineMemOperand &MMO)
Build and insert Res = G_LOAD Addr, MMO.
MachineInstrBuilder buildStore(const SrcOp &Val, const SrcOp &Addr, MachineMemOperand &MMO)
Build and insert G_STORE Val, Addr, MMO.
MachineInstrBuilder buildFrameIndex(const DstOp &Res, int Idx)
Build and insert Res = G_FRAME_INDEX Idx.
MachineFunction & getMF()
Getter for the function we currently build.
MachineInstrBuilder buildAssertAlign(const DstOp &Res, const SrcOp &Op, Align AlignVal)
Build and insert Res = G_ASSERT_ALIGN Op, AlignVal.
MachineInstrBuilder buildCopy(const DstOp &Res, const SrcOp &Op)
Build and insert Res = COPY Op.
const DataLayout & getDataLayout() const
Register getReg(unsigned Idx) const
Get the register for the operand index.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
Register getReg() const
getReg - Returns the register number.
static MachineOperand CreateGA(const GlobalValue *GV, int64_t Offset, unsigned TargetFlags=0)
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Class to represent pointers.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator insert(iterator I, T &&Elt)
void truncate(size_type N)
Like resize, but requires that N is less than size().
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:128
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:708
constexpr bool isKnownMultipleOf(ScalarTy RHS) const
This function tells the caller whether the element count is known at compile time to be a multiple of...
Definition TypeSize.h:180
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:216
constexpr LeafTy multiplyCoefficientBy(ScalarTy RHS) const
Definition TypeSize.h:256
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:223
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
@ Undef
Value of the register doesn't matter.
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< EVT > *MemVTs=nullptr, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
Definition Analysis.cpp:119
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool CCAssignFn(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
CCAssignFn - This function assigns a location for Val, updating State to reflect the change.
void * PointerTy
LLVM_ABI MachineInstr * getDefIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI)
Find the def instruction for Reg, folding away any trivial copies.
Definition Utils.cpp:494
void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:394
LLVM_ABI LLVM_READNONE LLT getCoverTy(LLT OrigTy, LLT TargetTy)
Return smallest type that covers both OrigTy and TargetTy and is multiple of TargetTy.
Definition Utils.cpp:1261
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI LLVM_READNONE LLT getGCDType(LLT OrigTy, LLT TargetTy)
Return a type where the total size is the greatest common divisor of OrigTy and TargetTy.
Definition Utils.cpp:1282
LLVM_ABI LLT getLLTForType(Type &Ty, const DataLayout &DL)
Construct a low-level type based on an LLVM type.
LLVM_ABI Align inferAlignFromPtrInfo(MachineFunction &MF, const MachinePointerInfo &MPO)
Definition Utils.cpp:904
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
const Value * OrigValue
Optionally track the original IR value for the argument.
SmallVector< Register, 4 > Regs
unsigned OrigArgIndex
Index original Function's argument.
static const unsigned NoArgIndex
Sentinel value for implicit machine-level input arguments.
SmallVector< ISD::ArgFlagsTy, 4 > Flags
void assignValueToReg(Register ValVReg, Register PhysReg, const CCValAssign &VA) override
Provides a default implementation for argument handling.
Register buildExtensionHint(const CCValAssign &VA, Register SrcReg, LLT NarrowTy)
Insert G_ASSERT_ZEXT/G_ASSERT_SEXT or other hint instruction based on VA, returning the new register ...
Argument handling is mostly uniform between the four places that make these decisions: function forma...
virtual bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, const ArgInfo &Info, ISD::ArgFlagsTy Flags, CCState &State)
Wrap call to (typically tablegenerated CCAssignFn).
void copyArgumentMemory(const ArgInfo &Arg, Register DstPtr, Register SrcPtr, const MachinePointerInfo &DstPtrInfo, Align DstAlign, const MachinePointerInfo &SrcPtrInfo, Align SrcAlign, uint64_t MemSize, CCValAssign &VA) const
Do a memory copy of MemSize bytes from SrcPtr to DstPtr.
virtual Register getStackAddress(uint64_t MemSize, int64_t Offset, MachinePointerInfo &MPO, ISD::ArgFlagsTy Flags)=0
Materialize a VReg containing the address of the specified stack-based object.
virtual LLT getStackValueStoreType(const DataLayout &DL, const CCValAssign &VA, ISD::ArgFlagsTy Flags) const
Return the in-memory size to write for the argument at VA.
bool isIncomingArgumentHandler() const
Returns true if the handler is dealing with incoming arguments, i.e.
virtual void assignValueToAddress(Register ValVReg, Register Addr, LLT MemTy, const MachinePointerInfo &MPO, const CCValAssign &VA)=0
The specified value has been assigned to a stack location.
Register extendRegister(Register ValReg, const CCValAssign &VA, unsigned MaxSizeBits=0)
Extend a register to the location type given in VA, capped at extending to at most MaxSize bits.
virtual unsigned assignCustomValue(ArgInfo &Arg, ArrayRef< CCValAssign > VAs, std::function< void()> *Thunk=nullptr)
Handle custom values, which may be passed into one or more of VAs.
virtual void assignValueToReg(Register ValVReg, Register PhysReg, const CCValAssign &VA)=0
The specified value has been assigned to a physical register, handle the appropriate COPY (either to ...
Extended Value Type.
Definition ValueTypes.h:35
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106