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 based on the contents of \p Attrs.
36 if (!Attrs.hasAttributes())
37 return;
38
39 // TODO: There are missing flags. Add them here.
40 if (Attrs.hasAttribute(Attribute::SExt))
41 Flags.setSExt();
42 if (Attrs.hasAttribute(Attribute::ZExt))
43 Flags.setZExt();
44 if (Attrs.hasAttribute(Attribute::InReg))
45 Flags.setInReg();
46 if (Attrs.hasAttribute(Attribute::StructRet))
47 Flags.setSRet();
48 if (Attrs.hasAttribute(Attribute::Nest))
49 Flags.setNest();
50 if (Attrs.hasAttribute(Attribute::ByVal))
51 Flags.setByVal();
52 if (Attrs.hasAttribute(Attribute::ByRef))
53 Flags.setByRef();
54 if (Attrs.hasAttribute(Attribute::InAlloca)) {
55 Flags.setInAlloca();
56 // Set the byval flag for CCAssignFn callbacks that don't know about
57 // inalloca. This way we can know how many bytes we should've allocated
58 // and how many bytes a callee cleanup function will pop. If we port
59 // inalloca to more targets, we'll have to add custom inalloca handling
60 // in the various CC lowering callbacks.
61 Flags.setByVal();
62 }
63 if (Attrs.hasAttribute(Attribute::Preallocated)) {
64 Flags.setPreallocated();
65 // Set the byval flag for CCAssignFn callbacks that don't know about
66 // preallocated. This way we can know how many bytes we should've
67 // allocated and how many bytes a callee cleanup function will pop. If
68 // we port preallocated to more targets, we'll have to add custom
69 // preallocated handling in the various CC lowering callbacks.
70 Flags.setByVal();
71 }
72 if (Attrs.hasAttribute(Attribute::Returned))
73 Flags.setReturned();
74 if (Attrs.hasAttribute(Attribute::SwiftSelf))
75 Flags.setSwiftSelf();
76 if (Attrs.hasAttribute(Attribute::SwiftAsync))
77 Flags.setSwiftAsync();
78 if (Attrs.hasAttribute(Attribute::SwiftError))
79 Flags.setSwiftError();
80}
81
83 unsigned ArgIdx) const {
84 ISD::ArgFlagsTy Flags;
85 const AttributeList &Attrs = Call.getAttributes();
86 addFlagsFromAttrSet(Flags, Attrs.getParamAttrs(ArgIdx));
87 if (const Function *F = Call.getCalledFunction())
88 addFlagsFromAttrSet(Flags, F->getAttributes().getParamAttrs(ArgIdx));
89 return Flags;
90}
91
94 ISD::ArgFlagsTy Flags;
95 addFlagsFromAttrSet(Flags, Call.getAttributes().getRetAttrs());
96 if (const Function *F = Call.getCalledFunction())
97 addFlagsFromAttrSet(Flags, F->getAttributes().getRetAttrs());
98 return Flags;
99}
100
102 const AttributeList &Attrs,
103 unsigned OpIdx) const {
104 addFlagsFromAttrSet(Flags, Attrs.getAttributes(OpIdx));
105}
106
108 ArrayRef<Register> ResRegs,
110 Register SwiftErrorVReg,
111 std::optional<PtrAuthInfo> PAI,
112 Register ConvergenceCtrlToken,
113 std::function<Register()> GetCalleeReg) const {
114 CallLoweringInfo Info;
115 const DataLayout &DL = MIRBuilder.getDataLayout();
116 MachineFunction &MF = MIRBuilder.getMF();
118 bool CanBeTailCalled = CB.isTailCall() &&
120 (MF.getFunction()
121 .getFnAttribute("disable-tail-calls")
122 .getValueAsString() != "true");
123
124 CallingConv::ID CallConv = CB.getCallingConv();
125 Type *RetTy = CB.getType();
126 bool IsVarArg = CB.getFunctionType()->isVarArg();
127
129 getReturnInfo(CallConv, RetTy, CB.getAttributes(), SplitArgs, DL);
130 Info.CanLowerReturn = canLowerReturn(MF, CallConv, SplitArgs, IsVarArg);
131
132 Info.IsConvergent = CB.isConvergent();
133
134 if (!Info.CanLowerReturn) {
135 // Callee requires sret demotion.
136 insertSRetOutgoingArgument(MIRBuilder, CB, Info);
137
138 // The sret demotion isn't compatible with tail-calls, since the sret
139 // argument points into the caller's stack frame.
140 CanBeTailCalled = false;
141 }
142
143 // First step is to marshall all the function's parameters into the correct
144 // physregs and memory locations. Gather the sequence of argument types that
145 // we'll pass to the assigner function.
146 unsigned i = 0;
147 unsigned NumFixedArgs = CB.getFunctionType()->getNumParams();
148 for (const auto &Arg : CB.args()) {
149 ArgInfo OrigArg{ArgRegs[i], *Arg.get(), i, getAttributesForArgIdx(CB, i)};
150 setArgFlags(OrigArg, i + AttributeList::FirstArgIndex, DL, CB);
151 if (i >= NumFixedArgs)
152 OrigArg.Flags[0].setVarArg();
153
154 // If we have an explicit sret argument that is an Instruction, (i.e., it
155 // might point to function-local memory), we can't meaningfully tail-call.
156 if (OrigArg.Flags[0].isSRet() && isa<Instruction>(&Arg))
157 CanBeTailCalled = false;
158
159 Info.OrigArgs.push_back(OrigArg);
160 ++i;
161 }
162
163 // Try looking through a bitcast from one function type to another.
164 // Commonly happens with calls to objc_msgSend().
165 const Value *CalleeV = CB.getCalledOperand()->stripPointerCasts();
166
167 // If IRTranslator chose to drop the ptrauth info, we can turn this into
168 // a direct call.
170 CalleeV = cast<ConstantPtrAuth>(CalleeV)->getPointer();
171 assert(isa<Function>(CalleeV));
172 }
173
174 if (const Function *F = dyn_cast<Function>(CalleeV)) {
175 if (F->hasFnAttribute(Attribute::NonLazyBind)) {
176 LLT Ty = getLLTForType(*F->getType(), DL);
177 Register Reg = MIRBuilder.buildGlobalValue(Ty, F).getReg(0);
178 Info.Callee = MachineOperand::CreateReg(Reg, false);
179 } else {
180 Info.Callee = MachineOperand::CreateGA(F, 0);
181 }
182 } else if (isa<GlobalIFunc>(CalleeV) || isa<GlobalAlias>(CalleeV)) {
183 // IR IFuncs and Aliases can't be forward declared (only defined), so the
184 // callee must be in the same TU and therefore we can direct-call it without
185 // worrying about it being out of range.
186 Info.Callee = MachineOperand::CreateGA(cast<GlobalValue>(CalleeV), 0);
187 } else
188 Info.Callee = MachineOperand::CreateReg(GetCalleeReg(), false);
189
190 Register ReturnHintAlignReg;
191 Align ReturnHintAlign;
192
193 Info.OrigRet = ArgInfo{ResRegs, RetTy, 0, getAttributesForReturn(CB)};
194
195 if (!Info.OrigRet.Ty->isVoidTy()) {
196 setArgFlags(Info.OrigRet, AttributeList::ReturnIndex, DL, CB);
197
198 if (MaybeAlign Alignment = CB.getRetAlign()) {
199 if (*Alignment > Align(1)) {
200 ReturnHintAlignReg = MRI.cloneVirtualRegister(ResRegs[0]);
201 Info.OrigRet.Regs[0] = ReturnHintAlignReg;
202 ReturnHintAlign = *Alignment;
203 }
204 }
205 }
206
207 auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi);
208 if (Bundle && CB.isIndirectCall()) {
209 Info.CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
210 assert(Info.CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
211 }
212
214 Info.DeactivationSymbol = cast<GlobalValue>(Bundle->Inputs[0]);
215 }
216
217 Info.CB = &CB;
218 Info.KnownCallees = CB.getMetadata(LLVMContext::MD_callees);
219 Info.CallConv = CallConv;
220 Info.SwiftErrorVReg = SwiftErrorVReg;
221 Info.PAI = PAI;
222 Info.ConvergenceCtrlToken = ConvergenceCtrlToken;
223 Info.IsMustTailCall = CB.isMustTailCall();
224 Info.IsTailCall = CanBeTailCalled;
225 Info.IsVarArg = IsVarArg;
226 if (!lowerCall(MIRBuilder, Info))
227 return false;
228
229 if (ReturnHintAlignReg && !Info.LoweredTailCall) {
230 MIRBuilder.buildAssertAlign(ResRegs[0], ReturnHintAlignReg,
231 ReturnHintAlign);
232 }
233
234 return true;
235}
236
237template <typename FuncInfoTy>
239 const DataLayout &DL,
240 const FuncInfoTy &FuncInfo) const {
241 auto &Flags = Arg.Flags[0];
242 const AttributeList &Attrs = FuncInfo.getAttributes();
243 addArgFlagsFromAttributes(Flags, Attrs, OpIdx);
244
246 if (PtrTy) {
247 Flags.setPointer();
248 Flags.setPointerAddrSpace(PtrTy->getPointerAddressSpace());
249 }
250
251 Align MemAlign = DL.getABITypeAlign(Arg.Ty);
252 if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated() ||
253 Flags.isByRef()) {
254 assert(OpIdx >= AttributeList::FirstArgIndex);
255 unsigned ParamIdx = OpIdx - AttributeList::FirstArgIndex;
256
257 Type *ElementTy = FuncInfo.getParamByValType(ParamIdx);
258 if (!ElementTy)
259 ElementTy = FuncInfo.getParamByRefType(ParamIdx);
260 if (!ElementTy)
261 ElementTy = FuncInfo.getParamInAllocaType(ParamIdx);
262 if (!ElementTy)
263 ElementTy = FuncInfo.getParamPreallocatedType(ParamIdx);
264
265 assert(ElementTy && "Must have byval, inalloca or preallocated type");
266
267 uint64_t MemSize = DL.getTypeAllocSize(ElementTy);
268 if (Flags.isByRef())
269 Flags.setByRefSize(MemSize);
270 else
271 Flags.setByValSize(MemSize);
272
273 // For ByVal, alignment should be passed from FE. BE will guess if
274 // this info is not there but there are cases it cannot get right.
275 if (auto ParamAlign = FuncInfo.getParamStackAlign(ParamIdx))
276 MemAlign = *ParamAlign;
277 else if ((ParamAlign = FuncInfo.getParamAlign(ParamIdx)))
278 MemAlign = *ParamAlign;
279 else
280 MemAlign = getTLI()->getByValTypeAlignment(ElementTy, DL);
281 } else if (OpIdx >= AttributeList::FirstArgIndex) {
282 if (auto ParamAlign =
283 FuncInfo.getParamStackAlign(OpIdx - AttributeList::FirstArgIndex))
284 MemAlign = *ParamAlign;
285 }
286 Flags.setMemAlign(MemAlign);
287 Flags.setOrigAlign(DL.getABITypeAlign(Arg.Ty));
288
289 // Don't try to use the returned attribute if the argument is marked as
290 // swiftself, since it won't be passed in x0.
291 if (Flags.isSwiftSelf())
292 Flags.setReturned(false);
293}
294
295template void
297 const DataLayout &DL,
298 const Function &FuncInfo) const;
299
300template void
302 const DataLayout &DL,
303 const CallBase &FuncInfo) const;
304
306 SmallVectorImpl<ArgInfo> &SplitArgs,
307 const DataLayout &DL,
308 CallingConv::ID CallConv,
309 SmallVectorImpl<TypeSize> *Offsets) const {
310 SmallVector<Type *, 4> SplitTys;
311 ComputeValueTypes(DL, OrigArg.Ty, SplitTys, Offsets);
312
313 if (SplitTys.size() == 0)
314 return;
315
316 if (SplitTys.size() == 1) {
317 // No splitting to do, but we want to replace the original type (e.g. [1 x
318 // double] -> double).
319 SplitArgs.emplace_back(OrigArg.Regs[0], SplitTys[0], OrigArg.OrigArgIndex,
320 OrigArg.Flags[0], OrigArg.OrigValue);
321 return;
322 }
323
324 // Create one ArgInfo for each virtual register in the original ArgInfo.
325 assert(OrigArg.Regs.size() == SplitTys.size() && "Regs / types mismatch");
326
327 bool NeedsRegBlock = TLI->functionArgumentNeedsConsecutiveRegisters(
328 OrigArg.Ty, CallConv, false, DL);
329 for (unsigned i = 0, e = SplitTys.size(); i < e; ++i) {
330 SplitArgs.emplace_back(OrigArg.Regs[i], SplitTys[i], OrigArg.OrigArgIndex,
331 OrigArg.Flags[0]);
332 if (NeedsRegBlock)
333 SplitArgs.back().Flags[0].setInConsecutiveRegs();
334 }
335
336 SplitArgs.back().Flags[0].setInConsecutiveRegsLast();
337}
338
339/// Pack values \p SrcRegs to cover the vector type result \p DstRegs.
342 ArrayRef<Register> SrcRegs) {
343 MachineRegisterInfo &MRI = *B.getMRI();
344 LLT LLTy = MRI.getType(DstRegs[0]);
345 LLT PartLLT = MRI.getType(SrcRegs[0]);
346
347 // Deal with v3s16 split into v2s16
348 LLT LCMTy = getCoverTy(LLTy, PartLLT);
349 if (LCMTy == LLTy) {
350 // Common case where no padding is needed.
351 assert(DstRegs.size() == 1);
352
353 SmallVector<Register, 8> ConcatRegs(SrcRegs.size());
354 llvm::copy(SrcRegs, ConcatRegs.begin());
355
356 if (LLTy.getScalarType() != PartLLT.getScalarType())
357 for (size_t I = 0, E = SrcRegs.size(); I != E; ++I) {
358 auto BitcastDst =
359 MRI.getType(SrcRegs[I]).changeElementType(LLTy.getScalarType());
360 ConcatRegs[I] = B.buildBitcast(BitcastDst, SrcRegs[I]).getReg(0);
361 }
362
363 return B.buildConcatVectors(DstRegs[0], ConcatRegs);
364 }
365
366 // We need to create an unmerge to the result registers, which may require
367 // widening the original value.
368 Register UnmergeSrcReg;
369 if (LCMTy.getSizeInBits() != PartLLT.getSizeInBits()) {
370 assert(DstRegs.size() == 1);
371 return B.buildDeleteTrailingVectorElements(
372 DstRegs[0], B.buildMergeLikeInstr(LCMTy, SrcRegs));
373 } else {
374 // We don't need to widen anything if we're extracting a scalar which was
375 // promoted to a vector e.g. s8 -> v4s8 -> s8
376 assert(SrcRegs.size() == 1);
377 UnmergeSrcReg = SrcRegs[0];
378 }
379
380 size_t NumDst = LCMTy.getSizeInBits() / LLTy.getSizeInBits();
381
382 SmallVector<Register, 8> PadDstRegs(NumDst);
383 llvm::copy(DstRegs, PadDstRegs.begin());
384
385 // Create the excess dead defs for the unmerge.
386 for (size_t I = DstRegs.size(); I != NumDst; ++I)
387 PadDstRegs[I] = MRI.createGenericVirtualRegister(LLTy);
388
389 if (PartLLT != LCMTy)
390 UnmergeSrcReg = B.buildBitcast(LCMTy, UnmergeSrcReg).getReg(0);
391
392 if (PadDstRegs.size() == 1)
393 return B.buildDeleteTrailingVectorElements(DstRegs[0], UnmergeSrcReg);
394 return B.buildUnmerge(PadDstRegs, UnmergeSrcReg);
395}
396
398 ArrayRef<Register> OrigRegs,
399 ArrayRef<Register> Regs, LLT LLTy,
400 LLT PartLLT, const ISD::ArgFlagsTy Flags) {
401 MachineRegisterInfo &MRI = *B.getMRI();
402
403 if (PartLLT == LLTy) {
404 // We should have avoided introducing a new virtual register, and just
405 // directly assigned here.
406 assert(OrigRegs[0] == Regs[0]);
407 return;
408 }
409
410 if (PartLLT.getSizeInBits() == LLTy.getSizeInBits() && OrigRegs.size() == 1 &&
411 Regs.size() == 1) {
412 B.buildBitcast(OrigRegs[0], Regs[0]);
413 return;
414 }
415
416 // A vector PartLLT needs extending to LLTy's element size.
417 // E.g. <2 x s64> = G_SEXT <2 x s32>.
418 if (PartLLT.isVector() == LLTy.isVector() &&
419 PartLLT.getScalarSizeInBits() > LLTy.getScalarSizeInBits() &&
420 (!PartLLT.isVector() ||
421 PartLLT.getElementCount() == LLTy.getElementCount()) &&
422 OrigRegs.size() == 1 && Regs.size() == 1) {
423 Register SrcReg = Regs[0];
424
425 LLT LocTy = MRI.getType(SrcReg);
426
427 if (Flags.isSExt()) {
428 SrcReg = B.buildAssertSExt(LocTy, SrcReg, LLTy.getScalarSizeInBits())
429 .getReg(0);
430 } else if (Flags.isZExt()) {
431 SrcReg = B.buildAssertZExt(LocTy, SrcReg, LLTy.getScalarSizeInBits())
432 .getReg(0);
433 }
434
435 // Sometimes pointers are passed zero extended.
436 LLT OrigTy = MRI.getType(OrigRegs[0]);
437 if (OrigTy.isPointer()) {
438 LLT IntPtrTy = LLT::scalar(OrigTy.getSizeInBits());
439 B.buildIntToPtr(OrigRegs[0], B.buildTrunc(IntPtrTy, SrcReg));
440 return;
441 }
442
443 B.buildTrunc(OrigRegs[0], SrcReg);
444 return;
445 }
446
447 if (!LLTy.isVector() && !PartLLT.isVector()) {
448 assert(OrigRegs.size() == 1);
449 LLT OrigTy = MRI.getType(OrigRegs[0]);
450
451 unsigned SrcSize = PartLLT.getSizeInBits().getFixedValue() * Regs.size();
452 if (SrcSize == OrigTy.getSizeInBits())
453 B.buildMergeValues(OrigRegs[0], Regs);
454 else {
455 auto Widened = B.buildMergeLikeInstr(LLT::scalar(SrcSize), Regs);
456 B.buildTrunc(OrigRegs[0], Widened);
457 }
458
459 return;
460 }
461
462 if (PartLLT.isVector()) {
463 assert(OrigRegs.size() == 1);
464 SmallVector<Register> CastRegs(Regs);
465
466 // If PartLLT is a mismatched vector in both number of elements and element
467 // size, e.g. PartLLT == v2s64 and LLTy is v3s32, then first coerce it to
468 // have the same elt type, i.e. v4s32.
469 // TODO: Extend this coersion to element multiples other than just 2.
470 if (TypeSize::isKnownGT(PartLLT.getSizeInBits(), LLTy.getSizeInBits()) &&
471 PartLLT.getScalarSizeInBits() == LLTy.getScalarSizeInBits() * 2 &&
472 Regs.size() == 1) {
473 LLT NewTy = PartLLT.changeElementType(LLTy.getElementType())
474 .changeElementCount(PartLLT.getElementCount() * 2);
475 CastRegs[0] = B.buildBitcast(NewTy, Regs[0]).getReg(0);
476 PartLLT = NewTy;
477 }
478
479 if (LLTy.getScalarSizeInBits() == PartLLT.getScalarSizeInBits()) {
480 mergeVectorRegsToResultRegs(B, OrigRegs, CastRegs);
481 } else {
482 unsigned I = 0;
483 LLT GCDTy = getGCDType(LLTy, PartLLT);
484
485 // We are both splitting a vector, and bitcasting its element types. Cast
486 // the source pieces into the appropriate number of pieces with the result
487 // element type.
488 for (Register SrcReg : CastRegs)
489 CastRegs[I++] = B.buildBitcast(GCDTy, SrcReg).getReg(0);
490 mergeVectorRegsToResultRegs(B, OrigRegs, CastRegs);
491 }
492
493 return;
494 }
495
496 assert(LLTy.isVector() && !PartLLT.isVector());
497
498 LLT DstEltTy = LLTy.getElementType();
499
500 // Pointer information was discarded. We'll need to coerce some register types
501 // to avoid violating type constraints.
502 LLT RealDstEltTy = MRI.getType(OrigRegs[0]).getElementType();
503
504 assert(DstEltTy.getSizeInBits() == RealDstEltTy.getSizeInBits());
505
506 if (DstEltTy == PartLLT) {
507 // Vector was trivially scalarized.
508
509 if (RealDstEltTy.isPointer()) {
510 for (Register Reg : Regs)
511 MRI.setType(Reg, RealDstEltTy);
512 }
513
514 B.buildBuildVector(OrigRegs[0], Regs);
515 } else if (DstEltTy.getSizeInBits() > PartLLT.getSizeInBits()) {
516 // Deal with vector with 64-bit elements decomposed to 32-bit
517 // registers. Need to create intermediate 64-bit elements.
518 SmallVector<Register, 8> EltMerges;
519 int PartsPerElt =
520 divideCeil(DstEltTy.getSizeInBits(), PartLLT.getSizeInBits());
521 LLT ExtendedPartTy = LLT::scalar(PartLLT.getSizeInBits() * PartsPerElt);
522
523 for (int I = 0, NumElts = LLTy.getNumElements(); I != NumElts; ++I) {
524 auto Merge =
525 B.buildMergeLikeInstr(ExtendedPartTy, Regs.take_front(PartsPerElt));
526 if (ExtendedPartTy.getSizeInBits() > RealDstEltTy.getSizeInBits())
527 Merge = B.buildTrunc(RealDstEltTy, Merge);
528 // Fix the type in case this is really a vector of pointers.
529 MRI.setType(Merge.getReg(0), RealDstEltTy);
530 EltMerges.push_back(Merge.getReg(0));
531 Regs = Regs.drop_front(PartsPerElt);
532 }
533
534 B.buildBuildVector(OrigRegs[0], EltMerges);
535 } else {
536 // Vector was split, and elements promoted to a wider type.
537 // FIXME: Should handle floating point promotions.
538 unsigned NumElts = LLTy.getNumElements();
539 LLT BVType = LLT::fixed_vector(NumElts, PartLLT);
540
541 Register BuildVec;
542 if (NumElts == Regs.size())
543 BuildVec = B.buildBuildVector(BVType, Regs).getReg(0);
544 else {
545 // Vector elements are packed in the inputs.
546 // e.g. we have a <4 x s16> but 2 x s32 in regs.
547 assert(NumElts > Regs.size());
548 LLT SrcEltTy = MRI.getType(Regs[0]);
549
550 LLT OriginalEltTy = MRI.getType(OrigRegs[0]).getElementType();
551
552 // Input registers contain packed elements.
553 // Determine how many elements per reg.
554 assert((SrcEltTy.getSizeInBits() % OriginalEltTy.getSizeInBits()) == 0);
555 unsigned EltPerReg =
556 (SrcEltTy.getSizeInBits() / OriginalEltTy.getSizeInBits());
557
559 BVRegs.reserve(Regs.size() * EltPerReg);
560 for (Register R : Regs) {
561 auto Unmerge = B.buildUnmerge(OriginalEltTy, R);
562 for (unsigned K = 0; K < EltPerReg; ++K)
563 BVRegs.push_back(B.buildAnyExt(PartLLT, Unmerge.getReg(K)).getReg(0));
564 }
565
566 // We may have some more elements in BVRegs, e.g. if we have 2 s32 pieces
567 // for a <3 x s16> vector. We should have less than EltPerReg extra items.
568 if (BVRegs.size() > NumElts) {
569 assert((BVRegs.size() - NumElts) < EltPerReg);
570 BVRegs.truncate(NumElts);
571 }
572 BuildVec = B.buildBuildVector(BVType, BVRegs).getReg(0);
573 }
574 B.buildTrunc(OrigRegs[0], BuildVec);
575 }
576}
577
579 ArrayRef<Register> DstRegs, Register SrcReg,
580 LLT SrcTy, LLT PartTy, unsigned ExtendOp) {
581 // We could just insert a regular copy, but this is unreachable at the moment.
582 assert(SrcTy != PartTy && "identical part types shouldn't reach here");
583
584 const TypeSize PartSize = PartTy.getSizeInBits();
585
586 if (PartSize == SrcTy.getSizeInBits() && DstRegs.size() == 1) {
587 // TODO: Handle int<->ptr casts. It just happens the ABI lowering
588 // assignments are not pointer aware.
589 B.buildBitcast(DstRegs[0], SrcReg);
590 return;
591 }
592
593 if (PartTy.isVector() == SrcTy.isVector() &&
594 PartTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits()) {
595 assert(DstRegs.size() == 1);
596 B.buildInstr(ExtendOp, {DstRegs[0]}, {SrcReg});
597 return;
598 }
599
600 if (SrcTy.isVector() && !PartTy.isVector() &&
601 TypeSize::isKnownGT(PartSize, SrcTy.getElementType().getSizeInBits()) &&
602 SrcTy.getElementCount() == ElementCount::getFixed(DstRegs.size())) {
603 // Vector was scalarized, and the elements extended.
604 auto UnmergeToEltTy = B.buildUnmerge(SrcTy.getElementType(), SrcReg);
605 for (int i = 0, e = DstRegs.size(); i != e; ++i)
606 B.buildAnyExt(DstRegs[i], UnmergeToEltTy.getReg(i));
607 return;
608 }
609
610 if (SrcTy.isVector() && PartTy.isVector() &&
611 PartTy.getSizeInBits() == SrcTy.getSizeInBits() &&
612 ElementCount::isKnownLT(SrcTy.getElementCount(),
613 PartTy.getElementCount())) {
614 // A coercion like: v2f32 -> v4f32 or nxv2f32 -> nxv4f32
615 Register DstReg = DstRegs.front();
616 B.buildPadVectorWithUndefElements(DstReg, SrcReg);
617 return;
618 }
619
620 LLT GCDTy = getGCDType(SrcTy, PartTy);
621 if (GCDTy == PartTy) {
622 // If this already evenly divisible, we can create a simple unmerge.
623 B.buildUnmerge(DstRegs, SrcReg);
624 return;
625 }
626
627 if (SrcTy.isVector() && !PartTy.isVector() &&
628 SrcTy.getScalarSizeInBits() > PartTy.getSizeInBits()) {
629 LLT ExtTy =
630 LLT::vector(SrcTy.getElementCount(),
631 LLT::scalar(PartTy.getScalarSizeInBits() * DstRegs.size() /
632 SrcTy.getNumElements()));
633 auto Ext = B.buildAnyExt(ExtTy, SrcReg);
634 B.buildUnmerge(DstRegs, Ext);
635 return;
636 }
637
638 MachineRegisterInfo &MRI = *B.getMRI();
639 LLT DstTy = MRI.getType(DstRegs[0]);
640 LLT CoverTy = getCoverTy(SrcTy, PartTy);
641 if (SrcTy.isVector() && DstRegs.size() > 1) {
642 TypeSize FullCoverSize =
643 DstTy.getSizeInBits().multiplyCoefficientBy(DstRegs.size());
644
645 LLT EltTy = SrcTy.getElementType();
646 TypeSize EltSize = EltTy.getSizeInBits();
647 if (FullCoverSize.isKnownMultipleOf(EltSize)) {
648 TypeSize VecSize = FullCoverSize.divideCoefficientBy(EltSize);
649 CoverTy =
650 LLT::vector(ElementCount::get(VecSize, VecSize.isScalable()), EltTy);
651 }
652 }
653
654 if (PartTy.isVector() && CoverTy == PartTy) {
655 assert(DstRegs.size() == 1);
656 B.buildPadVectorWithUndefElements(DstRegs[0], SrcReg);
657 return;
658 }
659
660 const unsigned DstSize = DstTy.getSizeInBits();
661 const unsigned SrcSize = SrcTy.getSizeInBits();
662 unsigned CoveringSize = CoverTy.getSizeInBits();
663
664 Register UnmergeSrc = SrcReg;
665
666 if (!CoverTy.isVector() && CoveringSize != SrcSize) {
667 // For scalars, it's common to be able to use a simple extension.
668 if (SrcTy.isScalar() && DstTy.isScalar()) {
669 CoveringSize = alignTo(SrcSize, DstSize);
670 LLT CoverTy = LLT::scalar(CoveringSize);
671 UnmergeSrc = B.buildInstr(ExtendOp, {CoverTy}, {SrcReg}).getReg(0);
672 } else {
673 // Widen to the common type.
674 // FIXME: This should respect the extend type
675 Register Undef = B.buildUndef(SrcTy).getReg(0);
676 SmallVector<Register, 8> MergeParts(1, SrcReg);
677 for (unsigned Size = SrcSize; Size != CoveringSize; Size += SrcSize)
678 MergeParts.push_back(Undef);
679 UnmergeSrc = B.buildMergeLikeInstr(CoverTy, MergeParts).getReg(0);
680 }
681 }
682
683 if (CoverTy.isVector() && CoveringSize != SrcSize)
684 UnmergeSrc = B.buildPadVectorWithUndefElements(CoverTy, SrcReg).getReg(0);
685
686 B.buildUnmerge(DstRegs, UnmergeSrc);
687}
688
690 ValueHandler &Handler, ValueAssigner &Assigner,
692 CallingConv::ID CallConv, bool IsVarArg,
693 ArrayRef<Register> ThisReturnRegs) const {
694 MachineFunction &MF = MIRBuilder.getMF();
695 const Function &F = MF.getFunction();
697
698 CCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, F.getContext());
699 if (!determineAssignments(Assigner, Args, CCInfo))
700 return false;
701
702 return handleAssignments(Handler, Args, CCInfo, ArgLocs, MIRBuilder,
703 ThisReturnRegs);
704}
705
707 if (Flags.isSExt())
708 return TargetOpcode::G_SEXT;
709 if (Flags.isZExt())
710 return TargetOpcode::G_ZEXT;
711 return TargetOpcode::G_ANYEXT;
712}
713
716 CCState &CCInfo) const {
717 LLVMContext &Ctx = CCInfo.getContext();
718 const DataLayout &DL = CCInfo.getMachineFunction().getDataLayout();
719 const CallingConv::ID CallConv = CCInfo.getCallingConv();
720
721 unsigned NumArgs = Args.size();
722 for (unsigned i = 0; i != NumArgs; ++i) {
723 EVT CurVT = TLI->getValueType(DL, Args[i].Ty);
724
725 MVT NewVT = TLI->getRegisterTypeForCallingConv(Ctx, CallConv, CurVT);
726
727 // If we need to split the type over multiple regs, check it's a scenario
728 // we currently support.
729 unsigned NumParts =
730 TLI->getNumRegistersForCallingConv(Ctx, CallConv, CurVT);
731
732 if (NumParts == 1) {
733 // Try to use the register type if we couldn't assign the VT.
734 if (Assigner.assignArg(i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
735 Args[i].Flags[0], CCInfo))
736 return false;
737 continue;
738 }
739
740 // For incoming arguments (physregs to vregs), we could have values in
741 // physregs (or memlocs) which we want to extract and copy to vregs.
742 // During this, we might have to deal with the LLT being split across
743 // multiple regs, so we have to record this information for later.
744 //
745 // If we have outgoing args, then we have the opposite case. We have a
746 // vreg with an LLT which we want to assign to a physical location, and
747 // we might have to record that the value has to be split later.
748
749 // We're handling an incoming arg which is split over multiple regs.
750 // E.g. passing an s128 on AArch64.
751 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0];
752 Args[i].Flags.clear();
753
754 for (unsigned Part = 0; Part < NumParts; ++Part) {
755 ISD::ArgFlagsTy Flags = OrigFlags;
756 if (Part == 0) {
757 Flags.setSplit();
758 } else {
759 Flags.setOrigAlign(Align(1));
760 if (Part == NumParts - 1)
761 Flags.setSplitEnd();
762 }
763
764 Args[i].Flags.push_back(Flags);
765 if (Assigner.assignArg(i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
766 Args[i].Flags[Part], CCInfo)) {
767 // Still couldn't assign this smaller part type for some reason.
768 return false;
769 }
770 }
771 }
772
773 return true;
774}
775
778 CCState &CCInfo,
780 MachineIRBuilder &MIRBuilder,
781 ArrayRef<Register> ThisReturnRegs) const {
782 MachineFunction &MF = MIRBuilder.getMF();
784 const Function &F = MF.getFunction();
785 const DataLayout &DL = F.getDataLayout();
786
787 const unsigned NumArgs = Args.size();
788
789 // Stores thunks for outgoing register assignments. This is used so we delay
790 // generating register copies until mem loc assignments are done. We do this
791 // so that if the target is using the delayed stack protector feature, we can
792 // find the split point of the block accurately. E.g. if we have:
793 // G_STORE %val, %memloc
794 // $x0 = COPY %foo
795 // $x1 = COPY %bar
796 // CALL func
797 // ... then the split point for the block will correctly be at, and including,
798 // the copy to $x0. If instead the G_STORE instruction immediately precedes
799 // the CALL, then we'd prematurely choose the CALL as the split point, thus
800 // generating a split block with a CALL that uses undefined physregs.
801 SmallVector<std::function<void()>> DelayedOutgoingRegAssignments;
802
803 for (unsigned i = 0, j = 0; i != NumArgs; ++i, ++j) {
804 assert(j < ArgLocs.size() && "Skipped too many arg locs");
805 CCValAssign &VA = ArgLocs[j];
806 assert(VA.getValNo() == i && "Location doesn't correspond to current arg");
807
808 if (VA.needsCustom()) {
809 std::function<void()> Thunk;
810 unsigned NumArgRegs = Handler.assignCustomValue(
811 Args[i], ArrayRef(ArgLocs).slice(j), &Thunk);
812 if (Thunk)
813 DelayedOutgoingRegAssignments.emplace_back(Thunk);
814 if (!NumArgRegs)
815 return false;
816 j += (NumArgRegs - 1);
817 continue;
818 }
819
820 auto AllocaAddressSpace = MF.getDataLayout().getAllocaAddrSpace();
821
822 const MVT ValVT = VA.getValVT();
823 const MVT LocVT = VA.getLocVT();
824
825 const LLT LocTy = getLLTForMVT(LocVT);
826 const LLT ValTy = getLLTForMVT(ValVT);
827 const LLT NewLLT = Handler.isIncomingArgumentHandler() ? LocTy : ValTy;
828 const EVT OrigVT = TLI->getValueType(DL, Args[i].Ty);
829 // Use the EVT here to strip pointerness.
830 const LLT OrigTy = getLLTForType(*OrigVT.getTypeForEVT(F.getContext()), DL);
831 const LLT PointerTy = LLT::pointer(
832 AllocaAddressSpace, DL.getPointerSizeInBits(AllocaAddressSpace));
833
834 // Expected to be multiple regs for a single incoming arg.
835 // There should be Regs.size() ArgLocs per argument.
836 // This should be the same as getNumRegistersForCallingConv
837 const unsigned NumParts = Args[i].Flags.size();
838
839 // Now split the registers into the assigned types.
840 Args[i].OrigRegs.assign(Args[i].Regs.begin(), Args[i].Regs.end());
841
842 if (NumParts != 1 || NewLLT != OrigTy) {
843 // If we can't directly assign the register, we need one or more
844 // intermediate values.
845 Args[i].Regs.resize(NumParts);
846
847 // When we have indirect parameter passing we are receiving a pointer,
848 // that points to the actual value, so we need one "temporary" pointer.
849 if (VA.getLocInfo() == CCValAssign::Indirect) {
850 if (Handler.isIncomingArgumentHandler())
851 Args[i].Regs[0] = MRI.createGenericVirtualRegister(PointerTy);
852 } else {
853 // For each split register, create and assign a vreg that will store
854 // the incoming component of the larger value. These will later be
855 // merged to form the final vreg.
856 for (unsigned Part = 0; Part < NumParts; ++Part)
857 Args[i].Regs[Part] = MRI.createGenericVirtualRegister(NewLLT);
858 }
859 }
860
861 assert((j + (NumParts - 1)) < ArgLocs.size() &&
862 "Too many regs for number of args");
863
864 // Coerce into outgoing value types before register assignment.
865 if (!Handler.isIncomingArgumentHandler() && OrigTy != ValTy &&
867 assert(Args[i].OrigRegs.size() == 1);
868 buildCopyToRegs(MIRBuilder, Args[i].Regs, Args[i].OrigRegs[0], OrigTy,
869 ValTy, extendOpFromFlags(Args[i].Flags[0]));
870 }
871
872 bool IndirectParameterPassingHandled = false;
873 bool BigEndianPartOrdering = TLI->hasBigEndianPartOrdering(OrigVT, DL);
874 for (unsigned Part = 0; Part < NumParts; ++Part) {
875 assert((VA.getLocInfo() != CCValAssign::Indirect || Part == 0) &&
876 "Only the first parameter should be processed when "
877 "handling indirect passing!");
878 Register ArgReg = Args[i].Regs[Part];
879 // There should be Regs.size() ArgLocs per argument.
880 unsigned Idx = BigEndianPartOrdering ? NumParts - 1 - Part : Part;
881 CCValAssign &VA = ArgLocs[j + Idx];
882 const ISD::ArgFlagsTy Flags = Args[i].Flags[Part];
883
884 // We found an indirect parameter passing, and we have an
885 // OutgoingValueHandler as our handler (so we are at the call site or the
886 // return value). In this case, start the construction of the following
887 // GMIR, that is responsible for the preparation of indirect parameter
888 // passing:
889 //
890 // %1(indirectly passed type) = The value to pass
891 // %3(pointer) = G_FRAME_INDEX %stack.0
892 // G_STORE %1, %3 :: (store (s128), align 8)
893 //
894 // After this GMIR, the remaining part of the loop body will decide how
895 // to get the value to the caller and we break out of the loop.
896 if (VA.getLocInfo() == CCValAssign::Indirect &&
897 !Handler.isIncomingArgumentHandler()) {
898 Align AlignmentForStored = DL.getPrefTypeAlign(Args[i].Ty);
899 MachineFrameInfo &MFI = MF.getFrameInfo();
900 // Get some space on the stack for the value, so later we can pass it
901 // as a reference.
902 int FrameIdx = MFI.CreateStackObject(OrigTy.getScalarSizeInBits(),
903 AlignmentForStored, false);
904 Register PointerToStackReg =
905 MIRBuilder.buildFrameIndex(PointerTy, FrameIdx).getReg(0);
906 MachinePointerInfo StackPointerMPO =
908 // Store the value in the previously created stack space.
909 MIRBuilder.buildStore(Args[i].OrigRegs[Part], PointerToStackReg,
910 StackPointerMPO,
911 inferAlignFromPtrInfo(MF, StackPointerMPO));
912
913 ArgReg = PointerToStackReg;
914 IndirectParameterPassingHandled = true;
915 }
916
917 if (VA.isMemLoc() && !Flags.isByVal()) {
918 // Individual pieces may have been spilled to the stack and others
919 // passed in registers.
920
921 // TODO: The memory size may be larger than the value we need to
922 // store. We may need to adjust the offset for big endian targets.
923 LLT MemTy = Handler.getStackValueStoreType(DL, VA, Flags);
924
926 Register StackAddr =
928 ? PointerTy.getSizeInBytes()
929 : MemTy.getSizeInBytes(),
930 VA.getLocMemOffset(), MPO, Flags);
931
932 // Finish the handling of indirect passing from the passers
933 // (OutgoingParameterHandler) side.
934 // This branch is needed, so the pointer to the value is loaded onto the
935 // stack.
937 Handler.assignValueToAddress(ArgReg, StackAddr, PointerTy, MPO, VA);
938 else
939 Handler.assignValueToAddress(Args[i], Part, StackAddr, MemTy, MPO,
940 VA);
941 } else if (VA.isMemLoc() && Flags.isByVal()) {
942 assert(Args[i].Regs.size() == 1 && "didn't expect split byval pointer");
943
944 if (Handler.isIncomingArgumentHandler()) {
945 // We just need to copy the frame index value to the pointer.
947 Register StackAddr = Handler.getStackAddress(
948 Flags.getByValSize(), VA.getLocMemOffset(), MPO, Flags);
949 MIRBuilder.buildCopy(Args[i].Regs[0], StackAddr);
950 } else {
951 // For outgoing byval arguments, insert the implicit copy byval
952 // implies, such that writes in the callee do not modify the caller's
953 // value.
954 uint64_t MemSize = Flags.getByValSize();
955 int64_t Offset = VA.getLocMemOffset();
956
957 MachinePointerInfo DstMPO;
958 Register StackAddr =
959 Handler.getStackAddress(MemSize, Offset, DstMPO, Flags);
960
961 MachinePointerInfo SrcMPO(Args[i].OrigValue);
962 if (!Args[i].OrigValue) {
963 // We still need to accurately track the stack address space if we
964 // don't know the underlying value.
965 const LLT PtrTy = MRI.getType(StackAddr);
966 SrcMPO = MachinePointerInfo(PtrTy.getAddressSpace());
967 }
968
969 Align DstAlign = std::max(Flags.getNonZeroByValAlign(),
970 inferAlignFromPtrInfo(MF, DstMPO));
971
972 Align SrcAlign = std::max(Flags.getNonZeroByValAlign(),
973 inferAlignFromPtrInfo(MF, SrcMPO));
974
975 Handler.copyArgumentMemory(Args[i], StackAddr, Args[i].Regs[0],
976 DstMPO, DstAlign, SrcMPO, SrcAlign,
977 MemSize, VA);
978 }
979 } else if (i == 0 && !ThisReturnRegs.empty() &&
980 Handler.isIncomingArgumentHandler() &&
982 Handler.assignValueToReg(ArgReg, ThisReturnRegs[Part], VA, Flags);
983 } else if (Handler.isIncomingArgumentHandler()) {
984 Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA, Flags);
985 } else {
986 DelayedOutgoingRegAssignments.emplace_back([=, &Handler]() {
987 Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA, Flags);
988 });
989 }
990
991 // Finish the handling of indirect parameter passing when receiving
992 // the value (we are in the called function or the caller when receiving
993 // the return value).
994 if (VA.getLocInfo() == CCValAssign::Indirect &&
995 Handler.isIncomingArgumentHandler()) {
996 Align Alignment = DL.getABITypeAlign(Args[i].Ty);
998
999 // Since we are doing indirect parameter passing, we know that the value
1000 // in the temporary register is not the value passed to the function,
1001 // but rather a pointer to that value. Let's load that value into the
1002 // virtual register where the parameter should go.
1003 MIRBuilder.buildLoad(Args[i].OrigRegs[0], Args[i].Regs[0], MPO,
1004 Alignment);
1005
1006 IndirectParameterPassingHandled = true;
1007 }
1008
1009 if (IndirectParameterPassingHandled)
1010 break;
1011 }
1012
1013 // Now that all pieces have been assigned, re-pack the register typed values
1014 // into the original value typed registers. This is only necessary, when
1015 // the value was passed in multiple registers, not indirectly.
1016 if (Handler.isIncomingArgumentHandler() && OrigVT != LocVT &&
1017 !IndirectParameterPassingHandled) {
1018 // Merge the split registers into the expected larger result vregs of
1019 // the original call.
1020 buildCopyFromRegs(MIRBuilder, Args[i].OrigRegs, Args[i].Regs, OrigTy,
1021 LocTy, Args[i].Flags[0]);
1022 }
1023
1024 j += NumParts - 1;
1025 }
1026 for (auto &Fn : DelayedOutgoingRegAssignments)
1027 Fn();
1028
1029 return true;
1030}
1031
1033 ArrayRef<Register> VRegs, Register DemoteReg,
1034 int FI) const {
1035 MachineFunction &MF = MIRBuilder.getMF();
1036 MachineRegisterInfo &MRI = MF.getRegInfo();
1037 const DataLayout &DL = MF.getDataLayout();
1038
1039 SmallVector<EVT, 4> SplitVTs;
1041 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, /*MemVTs=*/nullptr, &Offsets, 0);
1042
1043 assert(VRegs.size() == SplitVTs.size());
1044
1045 unsigned NumValues = SplitVTs.size();
1046 Align BaseAlign = DL.getPrefTypeAlign(RetTy);
1047 Type *RetPtrTy =
1048 PointerType::get(RetTy->getContext(), DL.getAllocaAddrSpace());
1049 LLT OffsetLLTy = getLLTForType(*DL.getIndexType(RetPtrTy), DL);
1050
1052
1053 for (unsigned I = 0; I < NumValues; ++I) {
1054 Register Addr;
1055 MIRBuilder.materializeObjectPtrOffset(Addr, DemoteReg, OffsetLLTy,
1056 Offsets[I]);
1057 auto *MMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOLoad,
1058 MRI.getType(VRegs[I]),
1059 commonAlignment(BaseAlign, Offsets[I]));
1060 MIRBuilder.buildLoad(VRegs[I], Addr, *MMO);
1061 }
1062}
1063
1065 ArrayRef<Register> VRegs,
1066 Register DemoteReg) const {
1067 MachineFunction &MF = MIRBuilder.getMF();
1068 MachineRegisterInfo &MRI = MF.getRegInfo();
1069 const DataLayout &DL = MF.getDataLayout();
1070
1071 SmallVector<EVT, 4> SplitVTs;
1073 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs, /*MemVTs=*/nullptr, &Offsets, 0);
1074
1075 assert(VRegs.size() == SplitVTs.size());
1076
1077 unsigned NumValues = SplitVTs.size();
1078 Align BaseAlign = DL.getPrefTypeAlign(RetTy);
1079 unsigned AS = DL.getAllocaAddrSpace();
1080 LLT OffsetLLTy = getLLTForType(*DL.getIndexType(RetTy->getContext(), AS), DL);
1081
1082 MachinePointerInfo PtrInfo(AS);
1083
1084 for (unsigned I = 0; I < NumValues; ++I) {
1085 Register Addr;
1086 MIRBuilder.materializeObjectPtrOffset(Addr, DemoteReg, OffsetLLTy,
1087 Offsets[I]);
1088 auto *MMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
1089 MRI.getType(VRegs[I]),
1090 commonAlignment(BaseAlign, Offsets[I]));
1091 MIRBuilder.buildStore(VRegs[I], Addr, *MMO);
1092 }
1093}
1094
1096 const Function &F, SmallVectorImpl<ArgInfo> &SplitArgs, Register &DemoteReg,
1097 MachineRegisterInfo &MRI, const DataLayout &DL) const {
1098 unsigned AS = DL.getAllocaAddrSpace();
1099 DemoteReg = MRI.createGenericVirtualRegister(
1100 LLT::pointer(AS, DL.getPointerSizeInBits(AS)));
1101
1102 Type *PtrTy = PointerType::get(F.getContext(), AS);
1103
1104 SmallVector<EVT, 1> ValueVTs;
1105 ComputeValueVTs(*TLI, DL, PtrTy, ValueVTs);
1106
1107 // NOTE: Assume that a pointer won't get split into more than one VT.
1108 assert(ValueVTs.size() == 1);
1109
1110 ArgInfo DemoteArg(DemoteReg, ValueVTs[0].getTypeForEVT(PtrTy->getContext()),
1112 setArgFlags(DemoteArg, AttributeList::ReturnIndex, DL, F);
1113 DemoteArg.Flags[0].setSRet();
1114 SplitArgs.insert(SplitArgs.begin(), DemoteArg);
1115}
1116
1118 const CallBase &CB,
1119 CallLoweringInfo &Info) const {
1120 const DataLayout &DL = MIRBuilder.getDataLayout();
1121 Type *RetTy = CB.getType();
1122 unsigned AS = DL.getAllocaAddrSpace();
1123 LLT FramePtrTy = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
1124
1125 int FI = MIRBuilder.getMF().getFrameInfo().CreateStackObject(
1126 DL.getTypeAllocSize(RetTy), DL.getPrefTypeAlign(RetTy), false);
1127
1128 Register DemoteReg = MIRBuilder.buildFrameIndex(FramePtrTy, FI).getReg(0);
1129 ArgInfo DemoteArg(DemoteReg, PointerType::get(RetTy->getContext(), AS),
1131 setArgFlags(DemoteArg, AttributeList::ReturnIndex, DL, CB);
1132 DemoteArg.Flags[0].setSRet();
1133
1134 Info.OrigArgs.insert(Info.OrigArgs.begin(), DemoteArg);
1135 Info.DemoteStackIndex = FI;
1136 Info.DemoteRegister = DemoteReg;
1137}
1138
1141 CCAssignFn *Fn) const {
1142 for (unsigned I = 0, E = Outs.size(); I < E; ++I) {
1143 MVT VT = MVT::getVT(Outs[I].Ty);
1144 if (Fn(I, VT, VT, CCValAssign::Full, Outs[I].Flags[0], Outs[I].Ty, CCInfo))
1145 return false;
1146 }
1147 return true;
1148}
1149
1151 AttributeList Attrs,
1153 const DataLayout &DL) const {
1154 LLVMContext &Context = RetTy->getContext();
1156
1157 SmallVector<EVT, 4> SplitVTs;
1158 ComputeValueVTs(*TLI, DL, RetTy, SplitVTs);
1159 addArgFlagsFromAttributes(Flags, Attrs, AttributeList::ReturnIndex);
1160
1161 for (EVT VT : SplitVTs) {
1162 unsigned NumParts =
1163 TLI->getNumRegistersForCallingConv(Context, CallConv, VT);
1164 MVT RegVT = TLI->getRegisterTypeForCallingConv(Context, CallConv, VT);
1165 Type *PartTy = EVT(RegVT).getTypeForEVT(Context);
1166
1167 for (unsigned I = 0; I < NumParts; ++I) {
1168 Outs.emplace_back(PartTy, Flags);
1169 }
1170 }
1171}
1172
1174 const auto &F = MF.getFunction();
1175 Type *ReturnType = F.getReturnType();
1176 CallingConv::ID CallConv = F.getCallingConv();
1177
1179 getReturnInfo(CallConv, ReturnType, F.getAttributes(), SplitArgs,
1180 MF.getDataLayout());
1181 return canLowerReturn(MF, CallConv, SplitArgs, F.isVarArg());
1182}
1183
1185 const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask,
1186 const SmallVectorImpl<CCValAssign> &OutLocs,
1187 const SmallVectorImpl<ArgInfo> &OutArgs) const {
1188 for (unsigned i = 0; i < OutLocs.size(); ++i) {
1189 const auto &ArgLoc = OutLocs[i];
1190 // If it's not a register, it's fine.
1191 if (!ArgLoc.isRegLoc())
1192 continue;
1193
1194 MCRegister PhysReg = ArgLoc.getLocReg();
1195
1196 // Only look at callee-saved registers.
1197 if (MachineOperand::clobbersPhysReg(CallerPreservedMask, PhysReg))
1198 continue;
1199
1200 LLVM_DEBUG(
1201 dbgs()
1202 << "... Call has an argument passed in a callee-saved register.\n");
1203
1204 // Check if it was copied from.
1205 const ArgInfo &OutInfo = OutArgs[i];
1206
1207 if (OutInfo.Regs.size() > 1) {
1208 LLVM_DEBUG(
1209 dbgs() << "... Cannot handle arguments in multiple registers.\n");
1210 return false;
1211 }
1212
1213 // Check if we copy the register, walking through copies from virtual
1214 // registers. Note that getDefIgnoringCopies does not ignore copies from
1215 // physical registers.
1216 MachineInstr *RegDef = getDefIgnoringCopies(OutInfo.Regs[0], MRI);
1217 if (!RegDef || RegDef->getOpcode() != TargetOpcode::COPY) {
1218 LLVM_DEBUG(
1219 dbgs()
1220 << "... Parameter was not copied into a VReg, cannot tail call.\n");
1221 return false;
1222 }
1223
1224 // Got a copy. Verify that it's the same as the register we want.
1225 Register CopyRHS = RegDef->getOperand(1).getReg();
1226 if (CopyRHS != PhysReg) {
1227 LLVM_DEBUG(dbgs() << "... Callee-saved register was not copied into "
1228 "VReg, cannot tail call.\n");
1229 return false;
1230 }
1231 }
1232
1233 return true;
1234}
1235
1237 MachineFunction &MF,
1239 ValueAssigner &CalleeAssigner,
1240 ValueAssigner &CallerAssigner) const {
1241 const Function &F = MF.getFunction();
1242 CallingConv::ID CalleeCC = Info.CallConv;
1243 CallingConv::ID CallerCC = F.getCallingConv();
1244
1245 if (CallerCC == CalleeCC)
1246 return true;
1247
1249 CCState CCInfo1(CalleeCC, Info.IsVarArg, MF, ArgLocs1, F.getContext());
1250 if (!determineAssignments(CalleeAssigner, InArgs, CCInfo1))
1251 return false;
1252
1254 CCState CCInfo2(CallerCC, F.isVarArg(), MF, ArgLocs2, F.getContext());
1255 if (!determineAssignments(CallerAssigner, InArgs, CCInfo2))
1256 return false;
1257
1258 // We need the argument locations to match up exactly. If there's more in
1259 // one than the other, then we are done.
1260 if (ArgLocs1.size() != ArgLocs2.size())
1261 return false;
1262
1263 // Make sure that each location is passed in exactly the same way.
1264 for (unsigned i = 0, e = ArgLocs1.size(); i < e; ++i) {
1265 const CCValAssign &Loc1 = ArgLocs1[i];
1266 const CCValAssign &Loc2 = ArgLocs2[i];
1267
1268 // We need both of them to be the same. So if one is a register and one
1269 // isn't, we're done.
1270 if (Loc1.isRegLoc() != Loc2.isRegLoc())
1271 return false;
1272
1273 if (Loc1.isRegLoc()) {
1274 // If they don't have the same register location, we're done.
1275 if (Loc1.getLocReg() != Loc2.getLocReg())
1276 return false;
1277
1278 // They matched, so we can move to the next ArgLoc.
1279 continue;
1280 }
1281
1282 // Loc1 wasn't a RegLoc, so they both must be MemLocs. Check if they match.
1283 if (Loc1.getLocMemOffset() != Loc2.getLocMemOffset())
1284 return false;
1285 }
1286
1287 return true;
1288}
1289
1291 const DataLayout &DL, const CCValAssign &VA, ISD::ArgFlagsTy Flags) const {
1292 const MVT ValVT = VA.getValVT();
1293 if (ValVT != MVT::iPTR) {
1294 LLT ValTy(ValVT);
1295
1296 // We lost the pointeriness going through CCValAssign, so try to restore it
1297 // based on the flags.
1298 if (Flags.isPointer()) {
1299 LLT PtrTy = LLT::pointer(Flags.getPointerAddrSpace(),
1300 ValTy.getScalarSizeInBits());
1301 if (ValVT.isVector() && ValVT.getVectorNumElements() != 1)
1302 return LLT::vector(ValTy.getElementCount(), PtrTy);
1303 return PtrTy;
1304 }
1305
1306 return ValTy;
1307 }
1308
1309 unsigned AddrSpace = Flags.getPointerAddrSpace();
1310 return LLT::pointer(AddrSpace, DL.getPointerSize(AddrSpace));
1311}
1312
1314 const ArgInfo &Arg, Register DstPtr, Register SrcPtr,
1315 const MachinePointerInfo &DstPtrInfo, Align DstAlign,
1316 const MachinePointerInfo &SrcPtrInfo, Align SrcAlign, uint64_t MemSize,
1317 CCValAssign &VA) const {
1318 MachineFunction &MF = MIRBuilder.getMF();
1320 SrcPtrInfo,
1322 SrcAlign);
1323
1325 DstPtrInfo,
1327 MemSize, DstAlign);
1328
1329 const LLT PtrTy = MRI.getType(DstPtr);
1330 const LLT SizeTy = LLT::integer(PtrTy.getSizeInBits());
1331
1332 auto SizeConst = MIRBuilder.buildConstant(SizeTy, MemSize);
1333 MIRBuilder.buildMemCpy(DstPtr, SrcPtr, SizeConst, *DstMMO, *SrcMMO);
1334}
1335
1337 const CCValAssign &VA,
1338 unsigned MaxSizeBits) {
1339 LLT LocTy{VA.getLocVT()};
1340 LLT ValTy{VA.getValVT()};
1341
1342 if (LocTy.getSizeInBits() == ValTy.getSizeInBits())
1343 return ValReg;
1344
1345 if (LocTy.isScalar() && MaxSizeBits && MaxSizeBits < LocTy.getSizeInBits()) {
1346 if (MaxSizeBits <= ValTy.getSizeInBits())
1347 return ValReg;
1348 LocTy = LLT::scalar(MaxSizeBits);
1349 }
1350
1351 const LLT ValRegTy = MRI.getType(ValReg);
1352 if (ValRegTy.isPointer()) {
1353 // The x32 ABI wants to zero extend 32-bit pointers to 64-bit registers, so
1354 // we have to cast to do the extension.
1355 LLT IntPtrTy = LLT::scalar(ValRegTy.getSizeInBits());
1356 ValReg = MIRBuilder.buildPtrToInt(IntPtrTy, ValReg).getReg(0);
1357 }
1358
1359 switch (VA.getLocInfo()) {
1360 default:
1361 break;
1362 case CCValAssign::Full:
1363 case CCValAssign::BCvt:
1365 // FIXME: bitconverting between vector types may or may not be a
1366 // nop in big-endian situations.
1367 return ValReg;
1368 case CCValAssign::AExt: {
1369 auto MIB = MIRBuilder.buildAnyExt(LocTy, ValReg);
1370 return MIB.getReg(0);
1371 }
1372 case CCValAssign::SExt: {
1373 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
1374 MIRBuilder.buildSExt(NewReg, ValReg);
1375 return NewReg;
1376 }
1377 case CCValAssign::ZExt: {
1378 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
1379 MIRBuilder.buildZExt(NewReg, ValReg);
1380 return NewReg;
1381 }
1382 }
1383 llvm_unreachable("unable to extend register");
1384}
1385
1386void CallLowering::ValueAssigner::anchor() {}
1387
1389 const CCValAssign &VA, Register SrcReg, LLT NarrowTy) {
1390 switch (VA.getLocInfo()) {
1392 return MIRBuilder
1393 .buildAssertZExt(MRI.cloneVirtualRegister(SrcReg), SrcReg,
1394 NarrowTy.getScalarSizeInBits())
1395 .getReg(0);
1396 }
1398 return MIRBuilder
1399 .buildAssertSExt(MRI.cloneVirtualRegister(SrcReg), SrcReg,
1400 NarrowTy.getScalarSizeInBits())
1401 .getReg(0);
1402 break;
1403 }
1404 default:
1405 return SrcReg;
1406 }
1407}
1408
1409/// Check if we can use a basic COPY instruction between the two types.
1410///
1411/// We're currently building on top of the infrastructure using MVT, which loses
1412/// pointer information in the CCValAssign. We accept copies from physical
1413/// registers that have been reported as integers if it's to an equivalent sized
1414/// pointer LLT.
1415static bool isCopyCompatibleType(LLT SrcTy, LLT DstTy) {
1416 if (SrcTy == DstTy)
1417 return true;
1418
1419 if (SrcTy.getSizeInBits() != DstTy.getSizeInBits())
1420 return false;
1421
1422 SrcTy = SrcTy.getScalarType();
1423 DstTy = DstTy.getScalarType();
1424
1425 return (SrcTy.isPointer() && DstTy.isScalar()) ||
1426 (DstTy.isPointer() && SrcTy.isScalar());
1427}
1428
1430 Register ValVReg, Register PhysReg, const CCValAssign &VA,
1431 ISD::ArgFlagsTy Flags) {
1432 const MVT LocVT = VA.getLocVT();
1433 const LLT LocTy = getLLTForMVT(LocVT);
1434 const LLT RegTy = MRI.getType(ValVReg);
1435
1436 if (isCopyCompatibleType(RegTy, LocTy)) {
1437 MIRBuilder.buildCopy(ValVReg, PhysReg);
1438 return;
1439 }
1440
1441 auto Copy = MIRBuilder.buildCopy(LocTy, PhysReg);
1442 auto Hint = buildExtensionHint(VA, Copy.getReg(0), RegTy);
1443 MIRBuilder.buildTrunc(ValVReg, Hint);
1444}
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 addFlagsFromAttrSet(ISD::ArgFlagsTy &Flags, AttributeSet Attrs)
Helper function which updates Flags based on the contents of Attrs.
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:119
This file describes how to lower LLVM code to machine code.
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:218
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition ArrayRef.h:194
const T & front() const
Get the first element.
Definition ArrayRef.h:144
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
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:252
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:368
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:712
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:558
@ Undef
Value of the register doesn't matter.
LLVM_ABI 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:494
LLVM_ABI 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:209
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:1218
LLVM_ABI 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:1884
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:1239
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:841
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