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
339 SmallVector<Register, 8> ConcatRegs(SrcRegs.size());
340 llvm::copy(SrcRegs, ConcatRegs.begin());
341
342 if (LLTy.getScalarType() != PartLLT.getScalarType())
343 for (size_t I = 0, E = SrcRegs.size(); I != E; ++I) {
344 auto BitcastDst =
345 MRI.getType(SrcRegs[I]).changeElementType(LLTy.getScalarType());
346 ConcatRegs[I] = B.buildBitcast(BitcastDst, SrcRegs[I]).getReg(0);
347 }
348
349 return B.buildConcatVectors(DstRegs[0], ConcatRegs);
350 }
351
352 // We need to create an unmerge to the result registers, which may require
353 // widening the original value.
354 Register UnmergeSrcReg;
355 if (LCMTy.getSizeInBits() != PartLLT.getSizeInBits()) {
356 assert(DstRegs.size() == 1);
357 return B.buildDeleteTrailingVectorElements(
358 DstRegs[0], B.buildMergeLikeInstr(LCMTy, SrcRegs));
359 } else {
360 // We don't need to widen anything if we're extracting a scalar which was
361 // promoted to a vector e.g. s8 -> v4s8 -> s8
362 assert(SrcRegs.size() == 1);
363 UnmergeSrcReg = SrcRegs[0];
364 }
365
366 size_t NumDst = LCMTy.getSizeInBits() / LLTy.getSizeInBits();
367
368 SmallVector<Register, 8> PadDstRegs(NumDst);
369 llvm::copy(DstRegs, PadDstRegs.begin());
370
371 // Create the excess dead defs for the unmerge.
372 for (size_t I = DstRegs.size(); I != NumDst; ++I)
373 PadDstRegs[I] = MRI.createGenericVirtualRegister(LLTy);
374
375 if (PartLLT != LCMTy)
376 UnmergeSrcReg = B.buildBitcast(LCMTy, UnmergeSrcReg).getReg(0);
377
378 if (PadDstRegs.size() == 1)
379 return B.buildDeleteTrailingVectorElements(DstRegs[0], UnmergeSrcReg);
380 return B.buildUnmerge(PadDstRegs, UnmergeSrcReg);
381}
382
384 ArrayRef<Register> OrigRegs,
385 ArrayRef<Register> Regs, LLT LLTy,
386 LLT PartLLT, const ISD::ArgFlagsTy Flags) {
387 MachineRegisterInfo &MRI = *B.getMRI();
388
389 if (PartLLT == LLTy) {
390 // We should have avoided introducing a new virtual register, and just
391 // directly assigned here.
392 assert(OrigRegs[0] == Regs[0]);
393 return;
394 }
395
396 if (PartLLT.getSizeInBits() == LLTy.getSizeInBits() && OrigRegs.size() == 1 &&
397 Regs.size() == 1) {
398 B.buildBitcast(OrigRegs[0], Regs[0]);
399 return;
400 }
401
402 // A vector PartLLT needs extending to LLTy's element size.
403 // E.g. <2 x s64> = G_SEXT <2 x s32>.
404 if (PartLLT.isVector() == LLTy.isVector() &&
405 PartLLT.getScalarSizeInBits() > LLTy.getScalarSizeInBits() &&
406 (!PartLLT.isVector() ||
407 PartLLT.getElementCount() == LLTy.getElementCount()) &&
408 OrigRegs.size() == 1 && Regs.size() == 1) {
409 Register SrcReg = Regs[0];
410
411 LLT LocTy = MRI.getType(SrcReg);
412
413 if (Flags.isSExt()) {
414 SrcReg = B.buildAssertSExt(LocTy, SrcReg, LLTy.getScalarSizeInBits())
415 .getReg(0);
416 } else if (Flags.isZExt()) {
417 SrcReg = B.buildAssertZExt(LocTy, SrcReg, LLTy.getScalarSizeInBits())
418 .getReg(0);
419 }
420
421 // Sometimes pointers are passed zero extended.
422 LLT OrigTy = MRI.getType(OrigRegs[0]);
423 if (OrigTy.isPointer()) {
424 LLT IntPtrTy = LLT::scalar(OrigTy.getSizeInBits());
425 B.buildIntToPtr(OrigRegs[0], B.buildTrunc(IntPtrTy, SrcReg));
426 return;
427 }
428
429 B.buildTrunc(OrigRegs[0], SrcReg);
430 return;
431 }
432
433 if (!LLTy.isVector() && !PartLLT.isVector()) {
434 assert(OrigRegs.size() == 1);
435 LLT OrigTy = MRI.getType(OrigRegs[0]);
436
437 unsigned SrcSize = PartLLT.getSizeInBits().getFixedValue() * Regs.size();
438 if (SrcSize == OrigTy.getSizeInBits())
439 B.buildMergeValues(OrigRegs[0], Regs);
440 else {
441 auto Widened = B.buildMergeLikeInstr(LLT::scalar(SrcSize), Regs);
442 B.buildTrunc(OrigRegs[0], Widened);
443 }
444
445 return;
446 }
447
448 if (PartLLT.isVector()) {
449 assert(OrigRegs.size() == 1);
450 SmallVector<Register> CastRegs(Regs);
451
452 // If PartLLT is a mismatched vector in both number of elements and element
453 // size, e.g. PartLLT == v2s64 and LLTy is v3s32, then first coerce it to
454 // have the same elt type, i.e. v4s32.
455 // TODO: Extend this coersion to element multiples other than just 2.
456 if (TypeSize::isKnownGT(PartLLT.getSizeInBits(), LLTy.getSizeInBits()) &&
457 PartLLT.getScalarSizeInBits() == LLTy.getScalarSizeInBits() * 2 &&
458 Regs.size() == 1) {
459 LLT NewTy = PartLLT.changeElementType(LLTy.getElementType())
460 .changeElementCount(PartLLT.getElementCount() * 2);
461 CastRegs[0] = B.buildBitcast(NewTy, Regs[0]).getReg(0);
462 PartLLT = NewTy;
463 }
464
465 if (LLTy.getScalarSizeInBits() == PartLLT.getScalarSizeInBits()) {
466 mergeVectorRegsToResultRegs(B, OrigRegs, CastRegs);
467 } else {
468 unsigned I = 0;
469 LLT GCDTy = getGCDType(LLTy, PartLLT);
470
471 // We are both splitting a vector, and bitcasting its element types. Cast
472 // the source pieces into the appropriate number of pieces with the result
473 // element type.
474 for (Register SrcReg : CastRegs)
475 CastRegs[I++] = B.buildBitcast(GCDTy, SrcReg).getReg(0);
476 mergeVectorRegsToResultRegs(B, OrigRegs, CastRegs);
477 }
478
479 return;
480 }
481
482 assert(LLTy.isVector() && !PartLLT.isVector());
483
484 LLT DstEltTy = LLTy.getElementType();
485
486 // Pointer information was discarded. We'll need to coerce some register types
487 // to avoid violating type constraints.
488 LLT RealDstEltTy = MRI.getType(OrigRegs[0]).getElementType();
489
490 assert(DstEltTy.getSizeInBits() == RealDstEltTy.getSizeInBits());
491
492 if (DstEltTy == PartLLT) {
493 // Vector was trivially scalarized.
494
495 if (RealDstEltTy.isPointer()) {
496 for (Register Reg : Regs)
497 MRI.setType(Reg, RealDstEltTy);
498 }
499
500 B.buildBuildVector(OrigRegs[0], Regs);
501 } else if (DstEltTy.getSizeInBits() > PartLLT.getSizeInBits()) {
502 // Deal with vector with 64-bit elements decomposed to 32-bit
503 // registers. Need to create intermediate 64-bit elements.
504 SmallVector<Register, 8> EltMerges;
505 int PartsPerElt =
506 divideCeil(DstEltTy.getSizeInBits(), PartLLT.getSizeInBits());
507 LLT ExtendedPartTy = LLT::scalar(PartLLT.getSizeInBits() * PartsPerElt);
508
509 for (int I = 0, NumElts = LLTy.getNumElements(); I != NumElts; ++I) {
510 auto Merge =
511 B.buildMergeLikeInstr(ExtendedPartTy, Regs.take_front(PartsPerElt));
512 if (ExtendedPartTy.getSizeInBits() > RealDstEltTy.getSizeInBits())
513 Merge = B.buildTrunc(RealDstEltTy, Merge);
514 // Fix the type in case this is really a vector of pointers.
515 MRI.setType(Merge.getReg(0), RealDstEltTy);
516 EltMerges.push_back(Merge.getReg(0));
517 Regs = Regs.drop_front(PartsPerElt);
518 }
519
520 B.buildBuildVector(OrigRegs[0], EltMerges);
521 } else {
522 // Vector was split, and elements promoted to a wider type.
523 // FIXME: Should handle floating point promotions.
524 unsigned NumElts = LLTy.getNumElements();
525 LLT BVType = LLT::fixed_vector(NumElts, PartLLT);
526
527 Register BuildVec;
528 if (NumElts == Regs.size())
529 BuildVec = B.buildBuildVector(BVType, Regs).getReg(0);
530 else {
531 // Vector elements are packed in the inputs.
532 // e.g. we have a <4 x s16> but 2 x s32 in regs.
533 assert(NumElts > Regs.size());
534 LLT SrcEltTy = MRI.getType(Regs[0]);
535
536 LLT OriginalEltTy = MRI.getType(OrigRegs[0]).getElementType();
537
538 // Input registers contain packed elements.
539 // Determine how many elements per reg.
540 assert((SrcEltTy.getSizeInBits() % OriginalEltTy.getSizeInBits()) == 0);
541 unsigned EltPerReg =
542 (SrcEltTy.getSizeInBits() / OriginalEltTy.getSizeInBits());
543
545 BVRegs.reserve(Regs.size() * EltPerReg);
546 for (Register R : Regs) {
547 auto Unmerge = B.buildUnmerge(OriginalEltTy, R);
548 for (unsigned K = 0; K < EltPerReg; ++K)
549 BVRegs.push_back(B.buildAnyExt(PartLLT, Unmerge.getReg(K)).getReg(0));
550 }
551
552 // We may have some more elements in BVRegs, e.g. if we have 2 s32 pieces
553 // for a <3 x s16> vector. We should have less than EltPerReg extra items.
554 if (BVRegs.size() > NumElts) {
555 assert((BVRegs.size() - NumElts) < EltPerReg);
556 BVRegs.truncate(NumElts);
557 }
558 BuildVec = B.buildBuildVector(BVType, BVRegs).getReg(0);
559 }
560 B.buildTrunc(OrigRegs[0], BuildVec);
561 }
562}
563
565 ArrayRef<Register> DstRegs, Register SrcReg,
566 LLT SrcTy, LLT PartTy, unsigned ExtendOp) {
567 // We could just insert a regular copy, but this is unreachable at the moment.
568 assert(SrcTy != PartTy && "identical part types shouldn't reach here");
569
570 const TypeSize PartSize = PartTy.getSizeInBits();
571
572 if (PartSize == SrcTy.getSizeInBits() && DstRegs.size() == 1) {
573 // TODO: Handle int<->ptr casts. It just happens the ABI lowering
574 // assignments are not pointer aware.
575 B.buildBitcast(DstRegs[0], SrcReg);
576 return;
577 }
578
579 if (PartTy.isVector() == SrcTy.isVector() &&
580 PartTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits()) {
581 assert(DstRegs.size() == 1);
582 B.buildInstr(ExtendOp, {DstRegs[0]}, {SrcReg});
583 return;
584 }
585
586 if (SrcTy.isVector() && !PartTy.isVector() &&
587 TypeSize::isKnownGT(PartSize, SrcTy.getElementType().getSizeInBits()) &&
588 SrcTy.getElementCount() == ElementCount::getFixed(DstRegs.size())) {
589 // Vector was scalarized, and the elements extended.
590 auto UnmergeToEltTy = B.buildUnmerge(SrcTy.getElementType(), SrcReg);
591 for (int i = 0, e = DstRegs.size(); i != e; ++i)
592 B.buildAnyExt(DstRegs[i], UnmergeToEltTy.getReg(i));
593 return;
594 }
595
596 if (SrcTy.isVector() && PartTy.isVector() &&
597 PartTy.getSizeInBits() == SrcTy.getSizeInBits() &&
598 ElementCount::isKnownLT(SrcTy.getElementCount(),
599 PartTy.getElementCount())) {
600 // A coercion like: v2f32 -> v4f32 or nxv2f32 -> nxv4f32
601 Register DstReg = DstRegs.front();
602 B.buildPadVectorWithUndefElements(DstReg, SrcReg);
603 return;
604 }
605
606 LLT GCDTy = getGCDType(SrcTy, PartTy);
607 if (GCDTy == PartTy) {
608 // If this already evenly divisible, we can create a simple unmerge.
609 B.buildUnmerge(DstRegs, SrcReg);
610 return;
611 }
612
613 if (SrcTy.isVector() && !PartTy.isVector() &&
614 SrcTy.getScalarSizeInBits() > PartTy.getSizeInBits()) {
615 LLT ExtTy =
616 LLT::vector(SrcTy.getElementCount(),
617 LLT::scalar(PartTy.getScalarSizeInBits() * DstRegs.size() /
618 SrcTy.getNumElements()));
619 auto Ext = B.buildAnyExt(ExtTy, SrcReg);
620 B.buildUnmerge(DstRegs, Ext);
621 return;
622 }
623
624 MachineRegisterInfo &MRI = *B.getMRI();
625 LLT DstTy = MRI.getType(DstRegs[0]);
626 LLT CoverTy = getCoverTy(SrcTy, PartTy);
627 if (SrcTy.isVector() && DstRegs.size() > 1) {
628 TypeSize FullCoverSize =
629 DstTy.getSizeInBits().multiplyCoefficientBy(DstRegs.size());
630
631 LLT EltTy = SrcTy.getElementType();
632 TypeSize EltSize = EltTy.getSizeInBits();
633 if (FullCoverSize.isKnownMultipleOf(EltSize)) {
634 TypeSize VecSize = FullCoverSize.divideCoefficientBy(EltSize);
635 CoverTy =
636 LLT::vector(ElementCount::get(VecSize, VecSize.isScalable()), EltTy);
637 }
638 }
639
640 if (PartTy.isVector() && CoverTy == PartTy) {
641 assert(DstRegs.size() == 1);
642 B.buildPadVectorWithUndefElements(DstRegs[0], SrcReg);
643 return;
644 }
645
646 const unsigned DstSize = DstTy.getSizeInBits();
647 const unsigned SrcSize = SrcTy.getSizeInBits();
648 unsigned CoveringSize = CoverTy.getSizeInBits();
649
650 Register UnmergeSrc = SrcReg;
651
652 if (!CoverTy.isVector() && CoveringSize != SrcSize) {
653 // For scalars, it's common to be able to use a simple extension.
654 if (SrcTy.isScalar() && DstTy.isScalar()) {
655 CoveringSize = alignTo(SrcSize, DstSize);
656 LLT CoverTy = LLT::scalar(CoveringSize);
657 UnmergeSrc = B.buildInstr(ExtendOp, {CoverTy}, {SrcReg}).getReg(0);
658 } else {
659 // Widen to the common type.
660 // FIXME: This should respect the extend type
661 Register Undef = B.buildUndef(SrcTy).getReg(0);
662 SmallVector<Register, 8> MergeParts(1, SrcReg);
663 for (unsigned Size = SrcSize; Size != CoveringSize; Size += SrcSize)
664 MergeParts.push_back(Undef);
665 UnmergeSrc = B.buildMergeLikeInstr(CoverTy, MergeParts).getReg(0);
666 }
667 }
668
669 if (CoverTy.isVector() && CoveringSize != SrcSize)
670 UnmergeSrc = B.buildPadVectorWithUndefElements(CoverTy, SrcReg).getReg(0);
671
672 B.buildUnmerge(DstRegs, UnmergeSrc);
673}
674
676 ValueHandler &Handler, ValueAssigner &Assigner,
678 CallingConv::ID CallConv, bool IsVarArg,
679 ArrayRef<Register> ThisReturnRegs) const {
680 MachineFunction &MF = MIRBuilder.getMF();
681 const Function &F = MF.getFunction();
683
684 CCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, F.getContext());
685 if (!determineAssignments(Assigner, Args, CCInfo))
686 return false;
687
688 return handleAssignments(Handler, Args, CCInfo, ArgLocs, MIRBuilder,
689 ThisReturnRegs);
690}
691
693 if (Flags.isSExt())
694 return TargetOpcode::G_SEXT;
695 if (Flags.isZExt())
696 return TargetOpcode::G_ZEXT;
697 return TargetOpcode::G_ANYEXT;
698}
699
702 CCState &CCInfo) const {
703 LLVMContext &Ctx = CCInfo.getContext();
704 const DataLayout &DL = CCInfo.getMachineFunction().getDataLayout();
705 const CallingConv::ID CallConv = CCInfo.getCallingConv();
706
707 unsigned NumArgs = Args.size();
708 for (unsigned i = 0; i != NumArgs; ++i) {
709 EVT CurVT = TLI->getValueType(DL, Args[i].Ty);
710
711 MVT NewVT = TLI->getRegisterTypeForCallingConv(Ctx, CallConv, CurVT);
712
713 // If we need to split the type over multiple regs, check it's a scenario
714 // we currently support.
715 unsigned NumParts =
716 TLI->getNumRegistersForCallingConv(Ctx, CallConv, CurVT);
717
718 if (NumParts == 1) {
719 // Try to use the register type if we couldn't assign the VT.
720 if (Assigner.assignArg(i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
721 Args[i].Flags[0], CCInfo))
722 return false;
723 continue;
724 }
725
726 // For incoming arguments (physregs to vregs), we could have values in
727 // physregs (or memlocs) which we want to extract and copy to vregs.
728 // During this, we might have to deal with the LLT being split across
729 // multiple regs, so we have to record this information for later.
730 //
731 // If we have outgoing args, then we have the opposite case. We have a
732 // vreg with an LLT which we want to assign to a physical location, and
733 // we might have to record that the value has to be split later.
734
735 // We're handling an incoming arg which is split over multiple regs.
736 // E.g. passing an s128 on AArch64.
737 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0];
738 Args[i].Flags.clear();
739
740 for (unsigned Part = 0; Part < NumParts; ++Part) {
741 ISD::ArgFlagsTy Flags = OrigFlags;
742 if (Part == 0) {
743 Flags.setSplit();
744 } else {
745 Flags.setOrigAlign(Align(1));
746 if (Part == NumParts - 1)
747 Flags.setSplitEnd();
748 }
749
750 Args[i].Flags.push_back(Flags);
751 if (Assigner.assignArg(i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
752 Args[i].Flags[Part], CCInfo)) {
753 // Still couldn't assign this smaller part type for some reason.
754 return false;
755 }
756 }
757 }
758
759 return true;
760}
761
764 CCState &CCInfo,
766 MachineIRBuilder &MIRBuilder,
767 ArrayRef<Register> ThisReturnRegs) const {
768 MachineFunction &MF = MIRBuilder.getMF();
770 const Function &F = MF.getFunction();
771 const DataLayout &DL = F.getDataLayout();
772
773 const unsigned NumArgs = Args.size();
774
775 // Stores thunks for outgoing register assignments. This is used so we delay
776 // generating register copies until mem loc assignments are done. We do this
777 // so that if the target is using the delayed stack protector feature, we can
778 // find the split point of the block accurately. E.g. if we have:
779 // G_STORE %val, %memloc
780 // $x0 = COPY %foo
781 // $x1 = COPY %bar
782 // CALL func
783 // ... then the split point for the block will correctly be at, and including,
784 // the copy to $x0. If instead the G_STORE instruction immediately precedes
785 // the CALL, then we'd prematurely choose the CALL as the split point, thus
786 // generating a split block with a CALL that uses undefined physregs.
787 SmallVector<std::function<void()>> DelayedOutgoingRegAssignments;
788
789 for (unsigned i = 0, j = 0; i != NumArgs; ++i, ++j) {
790 assert(j < ArgLocs.size() && "Skipped too many arg locs");
791 CCValAssign &VA = ArgLocs[j];
792 assert(VA.getValNo() == i && "Location doesn't correspond to current arg");
793
794 if (VA.needsCustom()) {
795 std::function<void()> Thunk;
796 unsigned NumArgRegs = Handler.assignCustomValue(
797 Args[i], ArrayRef(ArgLocs).slice(j), &Thunk);
798 if (Thunk)
799 DelayedOutgoingRegAssignments.emplace_back(Thunk);
800 if (!NumArgRegs)
801 return false;
802 j += (NumArgRegs - 1);
803 continue;
804 }
805
806 auto AllocaAddressSpace = MF.getDataLayout().getAllocaAddrSpace();
807
808 const MVT ValVT = VA.getValVT();
809 const MVT LocVT = VA.getLocVT();
810
811 const LLT LocTy = getLLTForMVT(LocVT);
812 const LLT ValTy = getLLTForMVT(ValVT);
813 const LLT NewLLT = Handler.isIncomingArgumentHandler() ? LocTy : ValTy;
814 const EVT OrigVT = TLI->getValueType(DL, Args[i].Ty);
815 // Use the EVT here to strip pointerness.
816 const LLT OrigTy = getLLTForType(*OrigVT.getTypeForEVT(F.getContext()), DL);
817 const LLT PointerTy = LLT::pointer(
818 AllocaAddressSpace, DL.getPointerSizeInBits(AllocaAddressSpace));
819
820 // Expected to be multiple regs for a single incoming arg.
821 // There should be Regs.size() ArgLocs per argument.
822 // This should be the same as getNumRegistersForCallingConv
823 const unsigned NumParts = Args[i].Flags.size();
824
825 // Now split the registers into the assigned types.
826 Args[i].OrigRegs.assign(Args[i].Regs.begin(), Args[i].Regs.end());
827
828 if (NumParts != 1 || NewLLT != OrigTy) {
829 // If we can't directly assign the register, we need one or more
830 // intermediate values.
831 Args[i].Regs.resize(NumParts);
832
833 // When we have indirect parameter passing we are receiving a pointer,
834 // that points to the actual value, so we need one "temporary" pointer.
835 if (VA.getLocInfo() == CCValAssign::Indirect) {
836 if (Handler.isIncomingArgumentHandler())
837 Args[i].Regs[0] = MRI.createGenericVirtualRegister(PointerTy);
838 } else {
839 // For each split register, create and assign a vreg that will store
840 // the incoming component of the larger value. These will later be
841 // merged to form the final vreg.
842 for (unsigned Part = 0; Part < NumParts; ++Part)
843 Args[i].Regs[Part] = MRI.createGenericVirtualRegister(NewLLT);
844 }
845 }
846
847 assert((j + (NumParts - 1)) < ArgLocs.size() &&
848 "Too many regs for number of args");
849
850 // Coerce into outgoing value types before register assignment.
851 if (!Handler.isIncomingArgumentHandler() && OrigTy != ValTy &&
853 assert(Args[i].OrigRegs.size() == 1);
854 buildCopyToRegs(MIRBuilder, Args[i].Regs, Args[i].OrigRegs[0], OrigTy,
855 ValTy, extendOpFromFlags(Args[i].Flags[0]));
856 }
857
858 bool IndirectParameterPassingHandled = false;
859 bool BigEndianPartOrdering = TLI->hasBigEndianPartOrdering(OrigVT, DL);
860 for (unsigned Part = 0; Part < NumParts; ++Part) {
861 assert((VA.getLocInfo() != CCValAssign::Indirect || Part == 0) &&
862 "Only the first parameter should be processed when "
863 "handling indirect passing!");
864 Register ArgReg = Args[i].Regs[Part];
865 // There should be Regs.size() ArgLocs per argument.
866 unsigned Idx = BigEndianPartOrdering ? NumParts - 1 - Part : Part;
867 CCValAssign &VA = ArgLocs[j + Idx];
868 const ISD::ArgFlagsTy Flags = Args[i].Flags[Part];
869
870 // We found an indirect parameter passing, and we have an
871 // OutgoingValueHandler as our handler (so we are at the call site or the
872 // return value). In this case, start the construction of the following
873 // GMIR, that is responsible for the preparation of indirect parameter
874 // passing:
875 //
876 // %1(indirectly passed type) = The value to pass
877 // %3(pointer) = G_FRAME_INDEX %stack.0
878 // G_STORE %1, %3 :: (store (s128), align 8)
879 //
880 // After this GMIR, the remaining part of the loop body will decide how
881 // to get the value to the caller and we break out of the loop.
882 if (VA.getLocInfo() == CCValAssign::Indirect &&
883 !Handler.isIncomingArgumentHandler()) {
884 Align AlignmentForStored = DL.getPrefTypeAlign(Args[i].Ty);
885 MachineFrameInfo &MFI = MF.getFrameInfo();
886 // Get some space on the stack for the value, so later we can pass it
887 // as a reference.
888 int FrameIdx = MFI.CreateStackObject(OrigTy.getScalarSizeInBits(),
889 AlignmentForStored, false);
890 Register PointerToStackReg =
891 MIRBuilder.buildFrameIndex(PointerTy, FrameIdx).getReg(0);
892 MachinePointerInfo StackPointerMPO =
894 // Store the value in the previously created stack space.
895 MIRBuilder.buildStore(Args[i].OrigRegs[Part], PointerToStackReg,
896 StackPointerMPO,
897 inferAlignFromPtrInfo(MF, StackPointerMPO));
898
899 ArgReg = PointerToStackReg;
900 IndirectParameterPassingHandled = true;
901 }
902
903 if (VA.isMemLoc() && !Flags.isByVal()) {
904 // Individual pieces may have been spilled to the stack and others
905 // passed in registers.
906
907 // TODO: The memory size may be larger than the value we need to
908 // store. We may need to adjust the offset for big endian targets.
909 LLT MemTy = Handler.getStackValueStoreType(DL, VA, Flags);
910
912 Register StackAddr =
914 ? PointerTy.getSizeInBytes()
915 : MemTy.getSizeInBytes(),
916 VA.getLocMemOffset(), MPO, Flags);
917
918 // Finish the handling of indirect passing from the passers
919 // (OutgoingParameterHandler) side.
920 // This branch is needed, so the pointer to the value is loaded onto the
921 // stack.
923 Handler.assignValueToAddress(ArgReg, StackAddr, PointerTy, MPO, VA);
924 else
925 Handler.assignValueToAddress(Args[i], Part, StackAddr, MemTy, MPO,
926 VA);
927 } else if (VA.isMemLoc() && Flags.isByVal()) {
928 assert(Args[i].Regs.size() == 1 && "didn't expect split byval pointer");
929
930 if (Handler.isIncomingArgumentHandler()) {
931 // We just need to copy the frame index value to the pointer.
933 Register StackAddr = Handler.getStackAddress(
934 Flags.getByValSize(), VA.getLocMemOffset(), MPO, Flags);
935 MIRBuilder.buildCopy(Args[i].Regs[0], StackAddr);
936 } else {
937 // For outgoing byval arguments, insert the implicit copy byval
938 // implies, such that writes in the callee do not modify the caller's
939 // value.
940 uint64_t MemSize = Flags.getByValSize();
941 int64_t Offset = VA.getLocMemOffset();
942
943 MachinePointerInfo DstMPO;
944 Register StackAddr =
945 Handler.getStackAddress(MemSize, Offset, DstMPO, Flags);
946
947 MachinePointerInfo SrcMPO(Args[i].OrigValue);
948 if (!Args[i].OrigValue) {
949 // We still need to accurately track the stack address space if we
950 // don't know the underlying value.
951 const LLT PtrTy = MRI.getType(StackAddr);
952 SrcMPO = MachinePointerInfo(PtrTy.getAddressSpace());
953 }
954
955 Align DstAlign = std::max(Flags.getNonZeroByValAlign(),
956 inferAlignFromPtrInfo(MF, DstMPO));
957
958 Align SrcAlign = std::max(Flags.getNonZeroByValAlign(),
959 inferAlignFromPtrInfo(MF, SrcMPO));
960
961 Handler.copyArgumentMemory(Args[i], StackAddr, Args[i].Regs[0],
962 DstMPO, DstAlign, SrcMPO, SrcAlign,
963 MemSize, VA);
964 }
965 } else if (i == 0 && !ThisReturnRegs.empty() &&
966 Handler.isIncomingArgumentHandler() &&
968 Handler.assignValueToReg(ArgReg, ThisReturnRegs[Part], VA, Flags);
969 } else if (Handler.isIncomingArgumentHandler()) {
970 Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA, Flags);
971 } else {
972 DelayedOutgoingRegAssignments.emplace_back([=, &Handler]() {
973 Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA, Flags);
974 });
975 }
976
977 // Finish the handling of indirect parameter passing when receiving
978 // the value (we are in the called function or the caller when receiving
979 // the return value).
980 if (VA.getLocInfo() == CCValAssign::Indirect &&
981 Handler.isIncomingArgumentHandler()) {
982 Align Alignment = DL.getABITypeAlign(Args[i].Ty);
984
985 // Since we are doing indirect parameter passing, we know that the value
986 // in the temporary register is not the value passed to the function,
987 // but rather a pointer to that value. Let's load that value into the
988 // virtual register where the parameter should go.
989 MIRBuilder.buildLoad(Args[i].OrigRegs[0], Args[i].Regs[0], MPO,
990 Alignment);
991
992 IndirectParameterPassingHandled = true;
993 }
994
995 if (IndirectParameterPassingHandled)
996 break;
997 }
998
999 // Now that all pieces have been assigned, re-pack the register typed values
1000 // into the original value typed registers. This is only necessary, when
1001 // the value was passed in multiple registers, not indirectly.
1002 if (Handler.isIncomingArgumentHandler() && OrigVT != LocVT &&
1003 !IndirectParameterPassingHandled) {
1004 // Merge the split registers into the expected larger result vregs of
1005 // the original call.
1006 buildCopyFromRegs(MIRBuilder, Args[i].OrigRegs, Args[i].Regs, OrigTy,
1007 LocTy, Args[i].Flags[0]);
1008 }
1009
1010 j += NumParts - 1;
1011 }
1012 for (auto &Fn : DelayedOutgoingRegAssignments)
1013 Fn();
1014
1015 return true;
1016}
1017
1019 ArrayRef<Register> VRegs, Register DemoteReg,
1020 int FI) const {
1021 MachineFunction &MF = MIRBuilder.getMF();
1022 MachineRegisterInfo &MRI = MF.getRegInfo();
1023 const DataLayout &DL = MF.getDataLayout();
1024
1025 SmallVector<EVT, 4> SplitVTs;
1027 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, /*MemVTs=*/nullptr, &Offsets, 0);
1028
1029 assert(VRegs.size() == SplitVTs.size());
1030
1031 unsigned NumValues = SplitVTs.size();
1032 Align BaseAlign = DL.getPrefTypeAlign(RetTy);
1033 Type *RetPtrTy =
1034 PointerType::get(RetTy->getContext(), DL.getAllocaAddrSpace());
1035 LLT OffsetLLTy = getLLTForType(*DL.getIndexType(RetPtrTy), DL);
1036
1038
1039 for (unsigned I = 0; I < NumValues; ++I) {
1040 Register Addr;
1041 MIRBuilder.materializeObjectPtrOffset(Addr, DemoteReg, OffsetLLTy,
1042 Offsets[I]);
1043 auto *MMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOLoad,
1044 MRI.getType(VRegs[I]),
1045 commonAlignment(BaseAlign, Offsets[I]));
1046 MIRBuilder.buildLoad(VRegs[I], Addr, *MMO);
1047 }
1048}
1049
1051 ArrayRef<Register> VRegs,
1052 Register DemoteReg) const {
1053 MachineFunction &MF = MIRBuilder.getMF();
1054 MachineRegisterInfo &MRI = MF.getRegInfo();
1055 const DataLayout &DL = MF.getDataLayout();
1056
1057 SmallVector<EVT, 4> SplitVTs;
1059 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, /*MemVTs=*/nullptr, &Offsets, 0);
1060
1061 assert(VRegs.size() == SplitVTs.size());
1062
1063 unsigned NumValues = SplitVTs.size();
1064 Align BaseAlign = DL.getPrefTypeAlign(RetTy);
1065 unsigned AS = DL.getAllocaAddrSpace();
1066 LLT OffsetLLTy = getLLTForType(*DL.getIndexType(RetTy->getContext(), AS), DL);
1067
1068 MachinePointerInfo PtrInfo(AS);
1069
1070 for (unsigned I = 0; I < NumValues; ++I) {
1071 Register Addr;
1072 MIRBuilder.materializeObjectPtrOffset(Addr, DemoteReg, OffsetLLTy,
1073 Offsets[I]);
1074 auto *MMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
1075 MRI.getType(VRegs[I]),
1076 commonAlignment(BaseAlign, Offsets[I]));
1077 MIRBuilder.buildStore(VRegs[I], Addr, *MMO);
1078 }
1079}
1080
1082 const Function &F, SmallVectorImpl<ArgInfo> &SplitArgs, Register &DemoteReg,
1083 MachineRegisterInfo &MRI, const DataLayout &DL) const {
1084 unsigned AS = DL.getAllocaAddrSpace();
1085 DemoteReg = MRI.createGenericVirtualRegister(
1086 LLT::pointer(AS, DL.getPointerSizeInBits(AS)));
1087
1088 Type *PtrTy = PointerType::get(F.getContext(), AS);
1089
1090 SmallVector<EVT, 1> ValueVTs;
1091 ComputeValueVTs(*TLI, DL, PtrTy, ValueVTs);
1092
1093 // NOTE: Assume that a pointer won't get split into more than one VT.
1094 assert(ValueVTs.size() == 1);
1095
1096 ArgInfo DemoteArg(DemoteReg, ValueVTs[0].getTypeForEVT(PtrTy->getContext()),
1098 setArgFlags(DemoteArg, AttributeList::ReturnIndex, DL, F);
1099 DemoteArg.Flags[0].setSRet();
1100 SplitArgs.insert(SplitArgs.begin(), DemoteArg);
1101}
1102
1104 const CallBase &CB,
1105 CallLoweringInfo &Info) const {
1106 const DataLayout &DL = MIRBuilder.getDataLayout();
1107 Type *RetTy = CB.getType();
1108 unsigned AS = DL.getAllocaAddrSpace();
1109 LLT FramePtrTy = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
1110
1111 int FI = MIRBuilder.getMF().getFrameInfo().CreateStackObject(
1112 DL.getTypeAllocSize(RetTy), DL.getPrefTypeAlign(RetTy), false);
1113
1114 Register DemoteReg = MIRBuilder.buildFrameIndex(FramePtrTy, FI).getReg(0);
1115 ArgInfo DemoteArg(DemoteReg, PointerType::get(RetTy->getContext(), AS),
1117 setArgFlags(DemoteArg, AttributeList::ReturnIndex, DL, CB);
1118 DemoteArg.Flags[0].setSRet();
1119
1120 Info.OrigArgs.insert(Info.OrigArgs.begin(), DemoteArg);
1121 Info.DemoteStackIndex = FI;
1122 Info.DemoteRegister = DemoteReg;
1123}
1124
1127 CCAssignFn *Fn) const {
1128 for (unsigned I = 0, E = Outs.size(); I < E; ++I) {
1129 MVT VT = MVT::getVT(Outs[I].Ty);
1130 if (Fn(I, VT, VT, CCValAssign::Full, Outs[I].Flags[0], Outs[I].Ty, CCInfo))
1131 return false;
1132 }
1133 return true;
1134}
1135
1137 AttributeList Attrs,
1139 const DataLayout &DL) const {
1140 LLVMContext &Context = RetTy->getContext();
1142
1143 SmallVector<EVT, 4> SplitVTs;
1144 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs);
1145 addArgFlagsFromAttributes(Flags, Attrs, AttributeList::ReturnIndex);
1146
1147 for (EVT VT : SplitVTs) {
1148 unsigned NumParts =
1149 TLI->getNumRegistersForCallingConv(Context, CallConv, VT);
1150 MVT RegVT = TLI->getRegisterTypeForCallingConv(Context, CallConv, VT);
1151 Type *PartTy = EVT(RegVT).getTypeForEVT(Context);
1152
1153 for (unsigned I = 0; I < NumParts; ++I) {
1154 Outs.emplace_back(PartTy, Flags);
1155 }
1156 }
1157}
1158
1160 const auto &F = MF.getFunction();
1161 Type *ReturnType = F.getReturnType();
1162 CallingConv::ID CallConv = F.getCallingConv();
1163
1165 getReturnInfo(CallConv, ReturnType, F.getAttributes(), SplitArgs,
1166 MF.getDataLayout());
1167 return canLowerReturn(MF, CallConv, SplitArgs, F.isVarArg());
1168}
1169
1171 const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask,
1172 const SmallVectorImpl<CCValAssign> &OutLocs,
1173 const SmallVectorImpl<ArgInfo> &OutArgs) const {
1174 for (unsigned i = 0; i < OutLocs.size(); ++i) {
1175 const auto &ArgLoc = OutLocs[i];
1176 // If it's not a register, it's fine.
1177 if (!ArgLoc.isRegLoc())
1178 continue;
1179
1180 MCRegister PhysReg = ArgLoc.getLocReg();
1181
1182 // Only look at callee-saved registers.
1183 if (MachineOperand::clobbersPhysReg(CallerPreservedMask, PhysReg))
1184 continue;
1185
1186 LLVM_DEBUG(
1187 dbgs()
1188 << "... Call has an argument passed in a callee-saved register.\n");
1189
1190 // Check if it was copied from.
1191 const ArgInfo &OutInfo = OutArgs[i];
1192
1193 if (OutInfo.Regs.size() > 1) {
1194 LLVM_DEBUG(
1195 dbgs() << "... Cannot handle arguments in multiple registers.\n");
1196 return false;
1197 }
1198
1199 // Check if we copy the register, walking through copies from virtual
1200 // registers. Note that getDefIgnoringCopies does not ignore copies from
1201 // physical registers.
1202 MachineInstr *RegDef = getDefIgnoringCopies(OutInfo.Regs[0], MRI);
1203 if (!RegDef || RegDef->getOpcode() != TargetOpcode::COPY) {
1204 LLVM_DEBUG(
1205 dbgs()
1206 << "... Parameter was not copied into a VReg, cannot tail call.\n");
1207 return false;
1208 }
1209
1210 // Got a copy. Verify that it's the same as the register we want.
1211 Register CopyRHS = RegDef->getOperand(1).getReg();
1212 if (CopyRHS != PhysReg) {
1213 LLVM_DEBUG(dbgs() << "... Callee-saved register was not copied into "
1214 "VReg, cannot tail call.\n");
1215 return false;
1216 }
1217 }
1218
1219 return true;
1220}
1221
1223 MachineFunction &MF,
1225 ValueAssigner &CalleeAssigner,
1226 ValueAssigner &CallerAssigner) const {
1227 const Function &F = MF.getFunction();
1228 CallingConv::ID CalleeCC = Info.CallConv;
1229 CallingConv::ID CallerCC = F.getCallingConv();
1230
1231 if (CallerCC == CalleeCC)
1232 return true;
1233
1235 CCState CCInfo1(CalleeCC, Info.IsVarArg, MF, ArgLocs1, F.getContext());
1236 if (!determineAssignments(CalleeAssigner, InArgs, CCInfo1))
1237 return false;
1238
1240 CCState CCInfo2(CallerCC, F.isVarArg(), MF, ArgLocs2, F.getContext());
1241 if (!determineAssignments(CallerAssigner, InArgs, CCInfo2))
1242 return false;
1243
1244 // We need the argument locations to match up exactly. If there's more in
1245 // one than the other, then we are done.
1246 if (ArgLocs1.size() != ArgLocs2.size())
1247 return false;
1248
1249 // Make sure that each location is passed in exactly the same way.
1250 for (unsigned i = 0, e = ArgLocs1.size(); i < e; ++i) {
1251 const CCValAssign &Loc1 = ArgLocs1[i];
1252 const CCValAssign &Loc2 = ArgLocs2[i];
1253
1254 // We need both of them to be the same. So if one is a register and one
1255 // isn't, we're done.
1256 if (Loc1.isRegLoc() != Loc2.isRegLoc())
1257 return false;
1258
1259 if (Loc1.isRegLoc()) {
1260 // If they don't have the same register location, we're done.
1261 if (Loc1.getLocReg() != Loc2.getLocReg())
1262 return false;
1263
1264 // They matched, so we can move to the next ArgLoc.
1265 continue;
1266 }
1267
1268 // Loc1 wasn't a RegLoc, so they both must be MemLocs. Check if they match.
1269 if (Loc1.getLocMemOffset() != Loc2.getLocMemOffset())
1270 return false;
1271 }
1272
1273 return true;
1274}
1275
1277 const DataLayout &DL, const CCValAssign &VA, ISD::ArgFlagsTy Flags) const {
1278 const MVT ValVT = VA.getValVT();
1279 if (ValVT != MVT::iPTR) {
1280 LLT ValTy(ValVT);
1281
1282 // We lost the pointeriness going through CCValAssign, so try to restore it
1283 // based on the flags.
1284 if (Flags.isPointer()) {
1285 LLT PtrTy = LLT::pointer(Flags.getPointerAddrSpace(),
1286 ValTy.getScalarSizeInBits());
1287 if (ValVT.isVector() && ValVT.getVectorNumElements() != 1)
1288 return LLT::vector(ValTy.getElementCount(), PtrTy);
1289 return PtrTy;
1290 }
1291
1292 return ValTy;
1293 }
1294
1295 unsigned AddrSpace = Flags.getPointerAddrSpace();
1296 return LLT::pointer(AddrSpace, DL.getPointerSize(AddrSpace));
1297}
1298
1300 const ArgInfo &Arg, Register DstPtr, Register SrcPtr,
1301 const MachinePointerInfo &DstPtrInfo, Align DstAlign,
1302 const MachinePointerInfo &SrcPtrInfo, Align SrcAlign, uint64_t MemSize,
1303 CCValAssign &VA) const {
1304 MachineFunction &MF = MIRBuilder.getMF();
1306 SrcPtrInfo,
1308 SrcAlign);
1309
1311 DstPtrInfo,
1313 MemSize, DstAlign);
1314
1315 const LLT PtrTy = MRI.getType(DstPtr);
1316 const LLT SizeTy = LLT::integer(PtrTy.getSizeInBits());
1317
1318 auto SizeConst = MIRBuilder.buildConstant(SizeTy, MemSize);
1319 MIRBuilder.buildMemCpy(DstPtr, SrcPtr, SizeConst, *DstMMO, *SrcMMO);
1320}
1321
1323 const CCValAssign &VA,
1324 unsigned MaxSizeBits) {
1325 LLT LocTy{VA.getLocVT()};
1326 LLT ValTy{VA.getValVT()};
1327
1328 if (LocTy.getSizeInBits() == ValTy.getSizeInBits())
1329 return ValReg;
1330
1331 if (LocTy.isScalar() && MaxSizeBits && MaxSizeBits < LocTy.getSizeInBits()) {
1332 if (MaxSizeBits <= ValTy.getSizeInBits())
1333 return ValReg;
1334 LocTy = LLT::scalar(MaxSizeBits);
1335 }
1336
1337 const LLT ValRegTy = MRI.getType(ValReg);
1338 if (ValRegTy.isPointer()) {
1339 // The x32 ABI wants to zero extend 32-bit pointers to 64-bit registers, so
1340 // we have to cast to do the extension.
1341 LLT IntPtrTy = LLT::scalar(ValRegTy.getSizeInBits());
1342 ValReg = MIRBuilder.buildPtrToInt(IntPtrTy, ValReg).getReg(0);
1343 }
1344
1345 switch (VA.getLocInfo()) {
1346 default:
1347 break;
1348 case CCValAssign::Full:
1349 case CCValAssign::BCvt:
1350 // FIXME: bitconverting between vector types may or may not be a
1351 // nop in big-endian situations.
1352 return ValReg;
1353 case CCValAssign::AExt: {
1354 auto MIB = MIRBuilder.buildAnyExt(LocTy, ValReg);
1355 return MIB.getReg(0);
1356 }
1357 case CCValAssign::SExt: {
1358 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
1359 MIRBuilder.buildSExt(NewReg, ValReg);
1360 return NewReg;
1361 }
1362 case CCValAssign::ZExt: {
1363 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
1364 MIRBuilder.buildZExt(NewReg, ValReg);
1365 return NewReg;
1366 }
1367 }
1368 llvm_unreachable("unable to extend register");
1369}
1370
1371void CallLowering::ValueAssigner::anchor() {}
1372
1374 const CCValAssign &VA, Register SrcReg, LLT NarrowTy) {
1375 switch (VA.getLocInfo()) {
1377 return MIRBuilder
1378 .buildAssertZExt(MRI.cloneVirtualRegister(SrcReg), SrcReg,
1379 NarrowTy.getScalarSizeInBits())
1380 .getReg(0);
1381 }
1383 return MIRBuilder
1384 .buildAssertSExt(MRI.cloneVirtualRegister(SrcReg), SrcReg,
1385 NarrowTy.getScalarSizeInBits())
1386 .getReg(0);
1387 break;
1388 }
1389 default:
1390 return SrcReg;
1391 }
1392}
1393
1394/// Check if we can use a basic COPY instruction between the two types.
1395///
1396/// We're currently building on top of the infrastructure using MVT, which loses
1397/// pointer information in the CCValAssign. We accept copies from physical
1398/// registers that have been reported as integers if it's to an equivalent sized
1399/// pointer LLT.
1400static bool isCopyCompatibleType(LLT SrcTy, LLT DstTy) {
1401 if (SrcTy == DstTy)
1402 return true;
1403
1404 if (SrcTy.getSizeInBits() != DstTy.getSizeInBits())
1405 return false;
1406
1407 SrcTy = SrcTy.getScalarType();
1408 DstTy = DstTy.getScalarType();
1409
1410 return (SrcTy.isPointer() && DstTy.isScalar()) ||
1411 (DstTy.isPointer() && SrcTy.isScalar());
1412}
1413
1415 Register ValVReg, Register PhysReg, const CCValAssign &VA,
1416 ISD::ArgFlagsTy Flags) {
1417 const MVT LocVT = VA.getLocVT();
1418 const LLT LocTy = getLLTForMVT(LocVT);
1419 const LLT RegTy = MRI.getType(ValVReg);
1420
1421 if (isCopyCompatibleType(RegTy, LocTy)) {
1422 MIRBuilder.buildCopy(ValVReg, PhysReg);
1423 return;
1424 }
1425
1426 auto Copy = MIRBuilder.buildCopy(LocTy, PhysReg);
1427 auto Hint = buildExtensionHint(VA, Copy.getReg(0), RegTy);
1428 MIRBuilder.buildTrunc(ValVReg, Hint);
1429}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
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:250
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.
LLT changeElementCount(ElementCount EC) const
Return a vector or scalar with the same element type and the new element count.
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.
LLT getScalarType() const
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 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.
static LLT integer(unsigned SizeInBits)
constexpr TypeSize getSizeInBytes() const
Returns the total size of the type in bytes, i.e.
LLT getElementType() const
Returns the vector's element type. Only valid for vector types.
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,...
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
LLVM_ABI void setType(Register VReg, LLT Ty)
Set the low-level type of VReg to Ty.
LLVM_ABI Register createGenericVirtualRegister(LLT Ty, StringRef Name="")
Create and return a new generic virtual register with low-level type Ty.
LLVM_ABI Register cloneVirtualRegister(Register VReg, StringRef Name="")
Create and return a new virtual register in the function with the same attributes as the given regist...
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:46
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:370
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:709
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.
@ 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 LLT getLLTForMVT(MVT Ty)
Get a rough equivalent of an LLT for a given MVT.
LLVM_ABI MachineInstr * getDefIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI)
Find the def instruction for Reg, folding away any trivial copies.
Definition Utils.cpp:493
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
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
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:1280
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:1301
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:923
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, ISD::ArgFlagsTy Flags={}) 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.
virtual void assignValueToReg(Register ValVReg, Register PhysReg, const CCValAssign &VA, ISD::ArgFlagsTy Flags)=0
The specified value has been assigned to a physical register, handle the appropriate COPY (either to ...
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.
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