LLVM 24.0.0git
X86ISelLoweringCall.cpp
Go to the documentation of this file.
1//===- llvm/lib/Target/X86/X86ISelCallLowering.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 the lowering of LLVM calls to DAG nodes.
11//
12//===----------------------------------------------------------------------===//
13
15#include "X86.h"
16#include "X86CallingConv.h"
17#include "X86FrameLowering.h"
18#include "X86ISelLowering.h"
19#include "X86InstrBuilder.h"
21#include "X86TargetMachine.h"
22#include "llvm/ADT/Statistic.h"
28#include "llvm/IR/IRBuilder.h"
29#include "llvm/IR/Module.h"
31
32#define DEBUG_TYPE "x86-isel"
33
34using namespace llvm;
35
36STATISTIC(NumTailCalls, "Number of tail calls");
37
38/// Call this when the user attempts to do something unsupported, like
39/// returning a double without SSE2 enabled on x86_64. This is not fatal, unlike
40/// report_fatal_error, so calling code should attempt to recover without
41/// crashing.
42static void errorUnsupported(SelectionDAG &DAG, const SDLoc &dl,
43 const char *Msg) {
45 DAG.getContext()->diagnose(
47}
48
49/// Returns true if a CC can dynamically exclude a register from the list of
50/// callee-saved-registers (TargetRegistryInfo::getCalleeSavedRegs()) based on
51/// the return registers.
53 switch (CC) {
54 default:
55 return false;
59 return true;
60 }
61}
62
63/// Returns true if a CC can dynamically exclude a register from the list of
64/// callee-saved-registers (TargetRegistryInfo::getCalleeSavedRegs()) based on
65/// the parameters.
69
70static std::pair<MVT, unsigned>
72 const X86Subtarget &Subtarget) {
73 // v2i1/v4i1/v8i1/v16i1 all pass in xmm registers unless the calling
74 // convention is one that uses k registers.
75 if (NumElts == 2)
76 return {MVT::v2i64, 1};
77 if (NumElts == 4)
78 return {MVT::v4i32, 1};
79 if (NumElts == 8 && CC != CallingConv::X86_RegCall &&
81 return {MVT::v8i16, 1};
82 if (NumElts == 16 && CC != CallingConv::X86_RegCall &&
84 return {MVT::v16i8, 1};
85 // v32i1 passes in ymm unless we have BWI and the calling convention is
86 // regcall.
87 if (NumElts == 32 && (!Subtarget.hasBWI() || CC != CallingConv::X86_RegCall))
88 return {MVT::v32i8, 1};
89 // Split v64i1 vectors if we don't have v64i8 available.
90 if (NumElts == 64 && Subtarget.hasBWI() && CC != CallingConv::X86_RegCall) {
91 if (Subtarget.useAVX512Regs())
92 return {MVT::v64i8, 1};
93 return {MVT::v32i8, 2};
94 }
95
96 // Break wide or odd vXi1 vectors into scalars to match avx2 behavior.
97 if (!isPowerOf2_32(NumElts) || (NumElts == 64 && !Subtarget.hasBWI()) ||
98 NumElts > 64)
99 return {MVT::i8, NumElts};
100
102}
103
106 EVT VT) const {
107 if (VT.isVector()) {
108 if (VT.getVectorElementType() == MVT::i1 && Subtarget.hasAVX512()) {
109 unsigned NumElts = VT.getVectorNumElements();
110
111 MVT RegisterVT;
112 unsigned NumRegisters;
113 std::tie(RegisterVT, NumRegisters) =
114 handleMaskRegisterForCallingConv(NumElts, CC, Subtarget);
115 if (RegisterVT != MVT::INVALID_SIMPLE_VALUE_TYPE)
116 return RegisterVT;
117 }
118
119 if (VT.getVectorElementType() == MVT::f16 && VT.getVectorNumElements() < 8)
120 return MVT::v8f16;
121 }
122
123 // We will use more GPRs for f64 and f80 on 32 bits when x87 is disabled.
124 if ((VT == MVT::f64 || VT == MVT::f80) && !Subtarget.is64Bit() &&
125 !Subtarget.hasX87())
126 return MVT::i32;
127
128 if (isTypeLegal(MVT::f16)) {
129 if (VT.isVectorOf(MVT::bf16))
131 Context, CC, VT.changeVectorElementType(Context, MVT::f16));
132
133 if (VT == MVT::bf16)
134 return MVT::f16;
135 }
136
138}
139
142 EVT VT) const {
143 if (VT.isVector()) {
144 if (VT.getVectorElementType() == MVT::i1 && Subtarget.hasAVX512()) {
145 unsigned NumElts = VT.getVectorNumElements();
146
147 MVT RegisterVT;
148 unsigned NumRegisters;
149 std::tie(RegisterVT, NumRegisters) =
150 handleMaskRegisterForCallingConv(NumElts, CC, Subtarget);
151 if (RegisterVT != MVT::INVALID_SIMPLE_VALUE_TYPE)
152 return NumRegisters;
153 }
154
155 if (VT.getVectorElementType() == MVT::f16 && VT.getVectorNumElements() < 8)
156 return 1;
157 }
158
159 // We have to split f64 to 2 registers and f80 to 3 registers on 32 bits if
160 // x87 is disabled.
161 if (!Subtarget.is64Bit() && !Subtarget.hasX87()) {
162 if (VT == MVT::f64)
163 return 2;
164 if (VT == MVT::f80)
165 return 3;
166 }
167
168 if (VT.isVectorOf(MVT::bf16) && isTypeLegal(MVT::f16))
170 Context, CC, VT.changeVectorElementType(Context, MVT::f16));
171
173}
174
176 LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
177 unsigned &NumIntermediates, MVT &RegisterVT) const {
178 // Break wide or odd vXi1 vectors into scalars to match avx2 behavior.
179 if (VT.isVectorOf(MVT::i1) && Subtarget.hasAVX512() &&
181 (VT.getVectorNumElements() == 64 && !Subtarget.hasBWI()) ||
182 VT.getVectorNumElements() > 64)) {
183 RegisterVT = MVT::i8;
184 IntermediateVT = MVT::i1;
185 NumIntermediates = VT.getVectorNumElements();
186 return NumIntermediates;
187 }
188
189 // Split v64i1 vectors if we don't have v64i8 available.
190 if (VT == MVT::v64i1 && Subtarget.hasBWI() && !Subtarget.useAVX512Regs() &&
192 RegisterVT = MVT::v32i8;
193 IntermediateVT = MVT::v32i1;
194 NumIntermediates = 2;
195 return 2;
196 }
197
198 // Split vNbf16 vectors according to vNf16.
199 if (VT.isVectorOf(MVT::bf16) && isTypeLegal(MVT::f16))
200 VT = VT.changeVectorElementType(Context, MVT::f16);
201
202 return TargetLowering::getVectorTypeBreakdownForCallingConv(Context, CC, VT, IntermediateVT,
203 NumIntermediates, RegisterVT);
204}
205
207 LLVMContext& Context,
208 EVT VT) const {
209 if (!VT.isVector())
210 return MVT::i8;
211
212 if (Subtarget.hasAVX512()) {
213 // Figure out what this type will be legalized to.
214 EVT LegalVT = VT;
215 while (getTypeAction(Context, LegalVT) != TypeLegal)
216 LegalVT = getTypeToTransformTo(Context, LegalVT);
217
218 // If we got a 512-bit vector then we'll definitely have a vXi1 compare.
219 if (LegalVT.getSimpleVT().is512BitVector())
220 return EVT::getVectorVT(Context, MVT::i1, VT.getVectorElementCount());
221
222 if (LegalVT.getSimpleVT().isVector() && Subtarget.hasVLX()) {
223 // If we legalized to less than a 512-bit vector, then we will use a vXi1
224 // compare for vXi32/vXi64 for sure. If we have BWI we will also support
225 // vXi16/vXi8.
226 MVT EltVT = LegalVT.getSimpleVT().getVectorElementType();
227 if (Subtarget.hasBWI() || EltVT.getSizeInBits() >= 32)
228 return EVT::getVectorVT(Context, MVT::i1, VT.getVectorElementCount());
229 }
230 }
231
233}
234
236 Type *Ty, CallingConv::ID CallConv, bool isVarArg,
237 const DataLayout &DL) const {
238 // On x86-64 i128 is split into two i64s and needs to be allocated to two
239 // consecutive registers, or spilled to the stack as a whole. On x86-32 i128
240 // is split to four i32s and never actually passed in registers, but we use
241 // the consecutive register mark to match it in TableGen.
242 if (Ty->isIntegerTy(128))
243 return true;
244
245 // On x86-32, fp128 acts the same as i128.
246 if (Subtarget.is32Bit() && Ty->isFP128Ty())
247 return true;
248
249 return false;
250}
251
252/// Helper for getByValTypeAlignment to determine
253/// the desired ByVal argument alignment.
254static void getMaxByValAlign(Type *Ty, Align &MaxAlign) {
255 if (MaxAlign == 16)
256 return;
257 if (VectorType *VTy = dyn_cast<VectorType>(Ty)) {
258 if (VTy->getPrimitiveSizeInBits().getFixedValue() == 128)
259 MaxAlign = Align(16);
260 } else if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
261 Align EltAlign;
262 getMaxByValAlign(ATy->getElementType(), EltAlign);
263 if (EltAlign > MaxAlign)
264 MaxAlign = EltAlign;
265 } else if (StructType *STy = dyn_cast<StructType>(Ty)) {
266 for (auto *EltTy : STy->elements()) {
267 Align EltAlign;
268 getMaxByValAlign(EltTy, EltAlign);
269 if (EltAlign > MaxAlign)
270 MaxAlign = EltAlign;
271 if (MaxAlign == 16)
272 break;
273 }
274 }
275}
276
277/// Return the desired alignment for ByVal aggregate
278/// function arguments in the caller parameter area. For X86, aggregates
279/// that contain SSE vectors are placed at 16-byte boundaries while the rest
280/// are at 4-byte boundaries.
282 const DataLayout &DL) const {
283 if (Subtarget.is64Bit())
284 return std::max(DL.getABITypeAlign(Ty), Align::Constant<8>());
285
286 Align Alignment(4);
287 if (Subtarget.hasSSE1())
288 getMaxByValAlign(Ty, Alignment);
289 return Alignment;
290}
291
292/// It returns EVT::Other if the type should be determined using generic
293/// target-independent logic.
294/// For vector ops we check that the overall size isn't larger than our
295/// preferred vector width.
297 LLVMContext &Context, const MemOp &Op,
298 const AttributeList &FuncAttributes) const {
299 if (!FuncAttributes.hasFnAttr(Attribute::NoImplicitFloat)) {
300 if (Op.size() >= 16 &&
301 (!Subtarget.isUnalignedMem16Slow() || Op.isAligned(Align(16)))) {
302 // FIXME: Check if unaligned 64-byte accesses are slow.
303 if (Op.size() >= 64 && Subtarget.hasAVX512() &&
304 (Subtarget.getPreferVectorWidth() >= 512)) {
305 return Subtarget.hasBWI() ? MVT::v64i8 : MVT::v16i32;
306 }
307 // FIXME: Check if unaligned 32-byte accesses are slow.
308 if (Op.size() >= 32 && Subtarget.hasAVX() &&
309 Subtarget.useLight256BitInstructions()) {
310 // Although this isn't a well-supported type for AVX1, we'll let
311 // legalization and shuffle lowering produce the optimal codegen. If we
312 // choose an optimal type with a vector element larger than a byte,
313 // getMemsetStores() may create an intermediate splat (using an integer
314 // multiply) before we splat as a vector.
315 return MVT::v32i8;
316 }
317 if (Subtarget.hasSSE2() && (Subtarget.getPreferVectorWidth() >= 128))
318 return MVT::v16i8;
319 // TODO: Can SSE1 handle a byte vector?
320 // If we have SSE1 registers we should be able to use them.
321 if (Subtarget.hasSSE1() && (Subtarget.is64Bit() || Subtarget.hasX87()) &&
322 (Subtarget.getPreferVectorWidth() >= 128))
323 return MVT::v4f32;
324 } else if (((Op.isMemcpyOrMemmove() && !Op.isMemcpyStrSrc()) ||
325 Op.isZeroMemset()) &&
326 Op.size() >= 8 && !Subtarget.is64Bit() && Subtarget.hasSSE2()) {
327 // Do not use f64 to lower memcpy if source is string constant. It's
328 // better to use i32 to avoid the loads.
329 // Also, do not use f64 to lower memset unless this is a memset of zeros.
330 // The gymnastics of splatting a byte value into an XMM register and then
331 // only using 8-byte stores (because this is a CPU with slow unaligned
332 // 16-byte accesses) makes that a loser.
333 return MVT::f64;
334 }
335 }
336 // This is a compromise. If we reach here, unaligned accesses may be slow on
337 // this target. However, creating smaller, aligned accesses could be even
338 // slower and would certainly be a lot more code.
339 if (Subtarget.is64Bit() && Op.size() >= 8)
340 return MVT::i64;
341 return MVT::i32;
342}
343
345 if (VT == MVT::f32)
346 return Subtarget.hasSSE1();
347 if (VT == MVT::f64)
348 return Subtarget.hasSSE2();
349 return true;
350}
351
352static bool isBitAligned(Align Alignment, uint64_t SizeInBits) {
353 return (8 * Alignment.value()) % SizeInBits == 0;
354}
355
357 if (isBitAligned(Alignment, VT.getSizeInBits()))
358 return true;
359 switch (VT.getSizeInBits()) {
360 default:
361 // 8-byte and under are always assumed to be fast.
362 return true;
363 case 128:
364 return !Subtarget.isUnalignedMem16Slow();
365 case 256:
366 return !Subtarget.isUnalignedMem32Slow();
367 // TODO: What about AVX-512 (512-bit) accesses?
368 }
369}
370
372 EVT VT, unsigned, Align Alignment, MachineMemOperand::Flags Flags,
373 unsigned *Fast) const {
374 if (Fast)
375 *Fast = isMemoryAccessFast(VT, Alignment);
376 // NonTemporal vector memory ops must be aligned.
377 if (!!(Flags & MachineMemOperand::MONonTemporal) && VT.isVector()) {
378 // NT loads can only be vector aligned, so if its less aligned than the
379 // minimum vector size (which we can split the vector down to), we might as
380 // well use a regular unaligned vector load.
381 // We don't have any NT loads pre-SSE41.
382 if (!!(Flags & MachineMemOperand::MOLoad))
383 return (Alignment < 16 || !Subtarget.hasSSE41());
384 return false;
385 }
386 // Misaligned accesses of any size are always allowed.
387 return true;
388}
389
391 const DataLayout &DL, EVT VT,
392 unsigned AddrSpace, Align Alignment,
394 unsigned *Fast) const {
395 if (Fast)
396 *Fast = isMemoryAccessFast(VT, Alignment);
397 if (!!(Flags & MachineMemOperand::MONonTemporal) && VT.isVector()) {
398 if (allowsMisalignedMemoryAccesses(VT, AddrSpace, Alignment, Flags,
399 /*Fast=*/nullptr))
400 return true;
401 // NonTemporal vector memory ops are special, and must be aligned.
402 if (!isBitAligned(Alignment, VT.getSizeInBits()))
403 return false;
404 switch (VT.getSizeInBits()) {
405 case 128:
406 if (!!(Flags & MachineMemOperand::MOLoad) && Subtarget.hasSSE41())
407 return true;
408 if (!!(Flags & MachineMemOperand::MOStore) && Subtarget.hasSSE2())
409 return true;
410 return false;
411 case 256:
412 if (!!(Flags & MachineMemOperand::MOLoad) && Subtarget.hasAVX2())
413 return true;
414 if (!!(Flags & MachineMemOperand::MOStore) && Subtarget.hasAVX())
415 return true;
416 return false;
417 case 512:
418 if (Subtarget.hasAVX512())
419 return true;
420 return false;
421 default:
422 return false; // Don't have NonTemporal vector memory ops of this size.
423 }
424 }
425 return true;
426}
427
428/// Return the entry encoding for a jump table in the
429/// current function. The returned value is a member of the
430/// MachineJumpTableInfo::JTEntryKind enum.
432 // In GOT pic mode, each entry in the jump table is emitted as a @GOTOFF
433 // symbol.
434 if (isPositionIndependent() && Subtarget.isPICStyleGOT())
436 if (isPositionIndependent() &&
438 !Subtarget.isTargetCOFF())
440
441 // Otherwise, use the normal jump table encoding heuristics.
443}
444
446 return Subtarget.useSoftFloat();
447}
448
450 ArgListTy &Args) const {
451
452 // Only relabel X86-32 for C / Stdcall CCs.
453 if (Subtarget.is64Bit())
454 return;
456 return;
457 unsigned ParamRegs = 0;
458 if (auto *M = MF->getFunction().getParent())
459 ParamRegs = M->getNumberRegisterParameters();
460
461 // Mark the first N int arguments as having reg
462 for (auto &Arg : Args) {
463 Type *T = Arg.Ty;
464 if (T->isIntOrPtrTy())
465 if (MF->getDataLayout().getTypeAllocSize(T) <= 8) {
466 unsigned numRegs = 1;
467 if (MF->getDataLayout().getTypeAllocSize(T) > 4)
468 numRegs = 2;
469 if (ParamRegs < numRegs)
470 return;
471 ParamRegs -= numRegs;
472 Arg.IsInReg = true;
473 }
474 }
475}
476
477const MCExpr *
479 const MachineBasicBlock *MBB,
480 unsigned uid,MCContext &Ctx) const{
481 assert(isPositionIndependent() && Subtarget.isPICStyleGOT());
482 // In 32-bit ELF systems, our jump table entries are formed with @GOTOFF
483 // entries.
484 return MCSymbolRefExpr::create(MBB->getSymbol(), X86::S_GOTOFF, Ctx);
485}
486
487/// Returns relocation base for the given PIC jumptable.
489 SelectionDAG &DAG) const {
490 if (!Subtarget.is64Bit())
491 // This doesn't have SDLoc associated with it, but is not really the
492 // same as a Register.
493 return DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(),
495 return Table;
496}
497
498/// This returns the relocation base for the given PIC jumptable,
499/// the same as getPICJumpTableRelocBase, but as an MCExpr.
501getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI,
502 MCContext &Ctx) const {
503 // X86-64 uses RIP relative addressing based on the jump table label.
504 if (Subtarget.isPICStyleRIPRel() ||
505 (Subtarget.is64Bit() &&
508
509 // Otherwise, the reference is relative to the PIC base.
510 return MCSymbolRefExpr::create(MF->getPICBaseSymbol(), Ctx);
511}
512
513std::pair<const TargetRegisterClass *, uint8_t>
515 MVT VT) const {
516 const TargetRegisterClass *RRC = nullptr;
517 uint8_t Cost = 1;
518 switch (VT.SimpleTy) {
519 default:
521 case MVT::i8: case MVT::i16: case MVT::i32: case MVT::i64:
522 RRC = Subtarget.is64Bit() ? &X86::GR64RegClass : &X86::GR32RegClass;
523 break;
524 case MVT::x86mmx:
525 RRC = &X86::VR64RegClass;
526 break;
527 case MVT::f32: case MVT::f64:
528 case MVT::v16i8: case MVT::v8i16: case MVT::v4i32: case MVT::v2i64:
529 case MVT::v4f32: case MVT::v2f64:
530 case MVT::v32i8: case MVT::v16i16: case MVT::v8i32: case MVT::v4i64:
531 case MVT::v8f32: case MVT::v4f64:
532 case MVT::v64i8: case MVT::v32i16: case MVT::v16i32: case MVT::v8i64:
533 case MVT::v16f32: case MVT::v8f64:
534 RRC = &X86::VR128XRegClass;
535 break;
536 }
537 return std::make_pair(RRC, Cost);
538}
539
540unsigned X86TargetLowering::getAddressSpace() const {
541 if (Subtarget.is64Bit())
543 : X86AS::FS;
544 return X86AS::GS;
545}
546
547static bool hasStackGuardSlotTLS(const Triple &TargetTriple) {
548 return TargetTriple.isOSGlibc() || TargetTriple.isMusl() ||
549 TargetTriple.isOSFuchsia() || TargetTriple.isAndroid();
550}
551
558
559Value *
561 const LibcallLoweringInfo &Libcalls) const {
562 // glibc, bionic, and Fuchsia have a special slot for the stack guard in
563 // tcbhead_t; use it instead of the usual global variable (see
564 // sysdeps/{i386,x86_64}/nptl/tls.h)
565 if (hasStackGuardSlotTLS(Subtarget.getTargetTriple())) {
566 unsigned AddressSpace = getAddressSpace();
567
568 // <zircon/tls.h> defines ZX_TLS_STACK_GUARD_OFFSET with this value.
569 if (Subtarget.isTargetFuchsia())
570 return SegmentOffset(IRB, 0x10, AddressSpace);
571
572 Module *M = IRB.getModule();
573 // Specially, some users may customize the base reg and offset.
574 int Offset = M->getStackProtectorGuardOffset();
575 // If we don't set -stack-protector-guard-offset value:
576 // %fs:0x28, unless we're using a Kernel code model, in which case
577 // it's %gs:0x28. gs:0x14 on i386.
578 if (Offset == INT_MAX)
579 Offset = (Subtarget.is64Bit()) ? 0x28 : 0x14;
580
581 StringRef GuardReg = M->getStackProtectorGuardReg();
582 if (GuardReg == "fs")
584 else if (GuardReg == "gs")
586
587 // Use symbol guard if user specify.
588 StringRef GuardSymb = M->getStackProtectorGuardSymbol();
589 if (!GuardSymb.empty()) {
590 GlobalVariable *GV = M->getGlobalVariable(GuardSymb);
591 if (!GV) {
592 Type *Ty = Subtarget.is64Bit() ? Type::getInt64Ty(M->getContext())
593 : Type::getInt32Ty(M->getContext());
594 GV = new GlobalVariable(*M, Ty, false, GlobalValue::ExternalLinkage,
595 nullptr, GuardSymb, nullptr,
597 if (!Subtarget.isTargetDarwin())
598 GV->setDSOLocal(M->getDirectAccessExternalData());
599 }
600 return GV;
601 }
602
603 return SegmentOffset(IRB, Offset, AddressSpace);
604 }
605 return TargetLowering::getIRStackGuard(IRB, Libcalls);
606}
607
609 Module &M, const LibcallLoweringInfo &Libcalls) const {
610 // MSVC CRT provides functionalities for stack protection.
611 RTLIB::LibcallImpl SecurityCheckCookieLibcall =
612 Libcalls.getLibcallImpl(RTLIB::SECURITY_CHECK_COOKIE);
613
614 RTLIB::LibcallImpl SecurityCookieVar =
615 Libcalls.getLibcallImpl(RTLIB::STACK_CHECK_GUARD);
616 if (SecurityCheckCookieLibcall != RTLIB::Unsupported &&
617 SecurityCookieVar != RTLIB::Unsupported) {
618 // MSVC CRT provides functionalities for stack protection.
619 // MSVC CRT has a global variable holding security cookie.
620 const RTLIB::RuntimeLibcallsInfo &RTLCI = Libcalls.getRuntimeLibcallsInfo();
621 RTLCI.getOrInsertImplGlobal(M, SecurityCookieVar);
622
623 // MSVC CRT has a function to validate security cookie.
624 FunctionCallee SecurityCheckCookie =
625 RTLCI.getOrInsertLibcallDecl(M, SecurityCheckCookieLibcall);
626
627 if (Function *F = dyn_cast<Function>(SecurityCheckCookie.getCallee())) {
628 F->setCallingConv(CallingConv::X86_FastCall);
629 F->addParamAttr(0, Attribute::AttrKind::InReg);
630 }
631 return;
632 }
633
634 StringRef GuardMode = M.getStackProtectorGuard();
635
636 // glibc, bionic, and Fuchsia have a special slot for the stack guard.
637 if ((GuardMode == "tls" || GuardMode.empty()) &&
638 hasStackGuardSlotTLS(Subtarget.getTargetTriple()))
639 return;
641}
642
644 IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const {
645 // Android provides a fixed TLS slot for the SafeStack pointer. See the
646 // definition of TLS_SLOT_SAFESTACK in
647 // https://android.googlesource.com/platform/bionic/+/master/libc/private/bionic_tls.h
648 if (Subtarget.isTargetAndroid()) {
649 // %fs:0x48, unless we're using a Kernel code model, in which case it's %gs:
650 // %gs:0x24 on i386
651 int Offset = (Subtarget.is64Bit()) ? 0x48 : 0x24;
652 return SegmentOffset(IRB, Offset, getAddressSpace());
653 }
654
655 // Fuchsia is similar.
656 if (Subtarget.isTargetFuchsia()) {
657 // <zircon/tls.h> defines ZX_TLS_UNSAFE_SP_OFFSET with this value.
658 return SegmentOffset(IRB, 0x18, getAddressSpace());
659 }
660
662}
663
664//===----------------------------------------------------------------------===//
665// Return Value Calling Convention Implementation
666//===----------------------------------------------------------------------===//
667
668bool X86TargetLowering::CanLowerReturn(
669 CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg,
670 const SmallVectorImpl<ISD::OutputArg> &Outs, LLVMContext &Context,
671 const Type *RetTy) const {
672 // Mingw64 GCC returns f128 via sret, and LLVM matches it for compatibility.
673 // This logic exists for libcalls, a frontend should explicitly use sret
674 // rather than rely on the sret demotion here.
675 //
676 // Using sret is a reasonable implementation of the Windows x64 calling
677 // convention:
678 //
679 // https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170#return-values
680 //
681 // > Otherwise, the caller must allocate memory for the return value and pass
682 // > a pointer to it as the first argument.
683 //
684 // Although it is not the only reasonable interpretation:
685 //
686 // > Nonscalar types including floats, doubles, and vector types such as
687 // > __m128, __m128i, __m128d are returned in XMM0.
688 //
689 // For now, we prefer compatibility with GCC. If official guidelines are ever
690 // published, this can be revisited.
691 //
692 // Return false, which will perform sret demotion.
693 auto IsWin64F128StackCC = [this](CallingConv::ID CC) -> bool {
694 switch (CC) {
696 return true;
697 case CallingConv::C:
698 return Subtarget.isOSWindowsOrUEFI();
699 default:
700 return false;
701 }
702 };
703
704 if (IsWin64F128StackCC(CallConv) &&
706 Outs, [](const ISD::OutputArg &Out) { return Out.VT == MVT::f128; }))
707 return false;
708
710 CCState CCInfo(CallConv, isVarArg, MF, RVLocs, Context);
711 return CCInfo.CheckReturn(Outs, RetCC_X86);
712}
713
714const MCPhysReg *X86TargetLowering::getScratchRegisters(CallingConv::ID) const {
715 static const MCPhysReg ScratchRegs[] = { X86::R11, 0 };
716 return ScratchRegs;
717}
718
720 static const MCPhysReg RCRegs[] = {X86::FPCW, X86::MXCSR};
721 return RCRegs;
722}
723
724/// Lowers masks values (v*i1) to the local register values
725/// \returns DAG node after lowering to register type
726static SDValue lowerMasksToReg(const SDValue &ValArg, const EVT &ValLoc,
727 const SDLoc &DL, SelectionDAG &DAG) {
728 EVT ValVT = ValArg.getValueType();
729
730 if (ValVT == MVT::v1i1)
731 return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, ValLoc, ValArg,
732 DAG.getIntPtrConstant(0, DL));
733
734 if ((ValVT == MVT::v8i1 && (ValLoc == MVT::i8 || ValLoc == MVT::i32)) ||
735 (ValVT == MVT::v16i1 && (ValLoc == MVT::i16 || ValLoc == MVT::i32))) {
736 // Two stage lowering might be required
737 // bitcast: v8i1 -> i8 / v16i1 -> i16
738 // anyextend: i8 -> i32 / i16 -> i32
739 EVT TempValLoc = ValVT == MVT::v8i1 ? MVT::i8 : MVT::i16;
740 SDValue ValToCopy = DAG.getBitcast(TempValLoc, ValArg);
741 if (ValLoc == MVT::i32)
742 ValToCopy = DAG.getNode(ISD::ANY_EXTEND, DL, ValLoc, ValToCopy);
743 return ValToCopy;
744 }
745
746 if ((ValVT == MVT::v32i1 && ValLoc == MVT::i32) ||
747 (ValVT == MVT::v64i1 && ValLoc == MVT::i64)) {
748 // One stage lowering is required
749 // bitcast: v32i1 -> i32 / v64i1 -> i64
750 return DAG.getBitcast(ValLoc, ValArg);
751 }
752
753 return DAG.getNode(ISD::ANY_EXTEND, DL, ValLoc, ValArg);
754}
755
756/// Breaks v64i1 value into two registers and adds the new node to the DAG
758 const SDLoc &DL, SelectionDAG &DAG, SDValue &Arg,
759 SmallVectorImpl<std::pair<Register, SDValue>> &RegsToPass, CCValAssign &VA,
760 CCValAssign &NextVA, const X86Subtarget &Subtarget) {
761 assert(Subtarget.hasBWI() && "Expected AVX512BW target!");
762 assert(Subtarget.is32Bit() && "Expecting 32 bit target");
763 assert(Arg.getValueType() == MVT::i64 && "Expecting 64 bit value");
764 assert(VA.isRegLoc() && NextVA.isRegLoc() &&
765 "The value should reside in two registers");
766
767 // Before splitting the value we cast it to i64
768 Arg = DAG.getBitcast(MVT::i64, Arg);
769
770 // Splitting the value into two i32 types
771 SDValue Lo, Hi;
772 std::tie(Lo, Hi) = DAG.SplitScalar(Arg, DL, MVT::i32, MVT::i32);
773
774 // Attach the two i32 types into corresponding registers
775 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Lo));
776 RegsToPass.push_back(std::make_pair(NextVA.getLocReg(), Hi));
777}
778
780X86TargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
781 bool isVarArg,
783 const SmallVectorImpl<SDValue> &OutVals,
784 const SDLoc &dl, SelectionDAG &DAG) const {
786 X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
787
788 // In some cases we need to disable registers from the default CSR list.
789 // For example, when they are used as return registers (preserve_* and X86's
790 // regcall) or for argument passing (X86's regcall).
791 bool ShouldDisableCalleeSavedRegister =
792 shouldDisableRetRegFromCSR(CallConv) ||
793 MF.getFunction().hasFnAttribute("no_caller_saved_registers");
794
795 if (CallConv == CallingConv::X86_INTR && !Outs.empty())
796 report_fatal_error("X86 interrupts may not return any value");
797
799 CCState CCInfo(CallConv, isVarArg, MF, RVLocs, *DAG.getContext());
800 CCInfo.AnalyzeReturn(Outs, RetCC_X86);
801
803 for (unsigned I = 0, OutsIndex = 0, E = RVLocs.size(); I != E;
804 ++I, ++OutsIndex) {
805 CCValAssign &VA = RVLocs[I];
806 assert(VA.isRegLoc() && "Can only return in registers!");
807
808 // Add the register to the CalleeSaveDisableRegs list.
809 if (ShouldDisableCalleeSavedRegister)
811
812 SDValue ValToCopy = OutVals[OutsIndex];
813 EVT ValVT = ValToCopy.getValueType();
814
815 // Promote values to the appropriate types.
816 if (VA.getLocInfo() == CCValAssign::SExt)
817 ValToCopy = DAG.getNode(ISD::SIGN_EXTEND, dl, VA.getLocVT(), ValToCopy);
818 else if (VA.getLocInfo() == CCValAssign::ZExt)
819 ValToCopy = DAG.getNode(ISD::ZERO_EXTEND, dl, VA.getLocVT(), ValToCopy);
820 else if (VA.getLocInfo() == CCValAssign::AExt) {
821 if (ValVT.isVectorOf(MVT::i1))
822 ValToCopy = lowerMasksToReg(ValToCopy, VA.getLocVT(), dl, DAG);
823 else
824 ValToCopy = DAG.getNode(ISD::ANY_EXTEND, dl, VA.getLocVT(), ValToCopy);
825 }
826 else if (VA.getLocInfo() == CCValAssign::BCvt)
827 ValToCopy = DAG.getBitcast(VA.getLocVT(), ValToCopy);
828
830 "Unexpected FP-extend for return value.");
831
832 // Report an error if we have attempted to return a value via an XMM
833 // register and SSE was disabled.
834 if (!Subtarget.hasSSE1() && X86::FR32XRegClass.contains(VA.getLocReg())) {
835 errorUnsupported(DAG, dl, "SSE register return with SSE disabled");
836 VA.convertToReg(X86::FP0); // Set reg to FP0, avoid hitting asserts.
837 } else if (!Subtarget.hasSSE2() &&
838 X86::FR64XRegClass.contains(VA.getLocReg()) &&
839 ValVT == MVT::f64) {
840 // When returning a double via an XMM register, report an error if SSE2 is
841 // not enabled.
842 errorUnsupported(DAG, dl, "SSE2 register return with SSE2 disabled");
843 VA.convertToReg(X86::FP0); // Set reg to FP0, avoid hitting asserts.
844 }
845
846 // Returns in ST0/ST1 are handled specially: these are pushed as operands to
847 // the RET instruction and handled by the FP Stackifier.
848 if (VA.getLocReg() == X86::FP0 ||
849 VA.getLocReg() == X86::FP1) {
850 // If this is a copy from an xmm register to ST(0), use an FPExtend to
851 // change the value to the FP stack register class.
853 ValToCopy = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f80, ValToCopy);
854 RetVals.push_back(std::make_pair(VA.getLocReg(), ValToCopy));
855 // Don't emit a copytoreg.
856 continue;
857 }
858
859 // 64-bit vector (MMX) values are returned in XMM0 / XMM1 except for v1i64
860 // which is returned in RAX / RDX.
861 if (Subtarget.is64Bit()) {
862 if (ValVT == MVT::x86mmx) {
863 if (VA.getLocReg() == X86::XMM0 || VA.getLocReg() == X86::XMM1) {
864 ValToCopy = DAG.getBitcast(MVT::i64, ValToCopy);
865 ValToCopy = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i64,
866 ValToCopy);
867 // If we don't have SSE2 available, convert to v4f32 so the generated
868 // register is legal.
869 if (!Subtarget.hasSSE2())
870 ValToCopy = DAG.getBitcast(MVT::v4f32, ValToCopy);
871 }
872 }
873 }
874
875 if (VA.needsCustom()) {
876 assert(VA.getValVT() == MVT::v64i1 &&
877 "Currently the only custom case is when we split v64i1 to 2 regs");
878
879 Passv64i1ArgInRegs(dl, DAG, ValToCopy, RetVals, VA, RVLocs[++I],
880 Subtarget);
881
882 // Add the second register to the CalleeSaveDisableRegs list.
883 if (ShouldDisableCalleeSavedRegister)
884 MF.getRegInfo().disableCalleeSavedRegister(RVLocs[I].getLocReg());
885 } else {
886 RetVals.push_back(std::make_pair(VA.getLocReg(), ValToCopy));
887 }
888 }
889
890 SDValue Glue;
892 RetOps.push_back(Chain); // Operand #0 = Chain (updated below)
893 // Operand #1 = Bytes To Pop
894 RetOps.push_back(DAG.getTargetConstant(FuncInfo->getBytesToPopOnReturn(), dl,
895 MVT::i32));
896
897 // Copy the result values into the output registers.
898 for (auto &RetVal : RetVals) {
899 if (RetVal.first == X86::FP0 || RetVal.first == X86::FP1) {
900 RetOps.push_back(RetVal.second);
901 continue; // Don't emit a copytoreg.
902 }
903
904 Chain = DAG.getCopyToReg(Chain, dl, RetVal.first, RetVal.second, Glue);
905 Glue = Chain.getValue(1);
906 RetOps.push_back(
907 DAG.getRegister(RetVal.first, RetVal.second.getValueType()));
908 }
909
910 // Swift calling convention does not require we copy the sret argument
911 // into %rax/%eax for the return, and SRetReturnReg is not set for Swift.
912
913 // All x86 ABIs require that for returning structs by value we copy
914 // the sret argument into %rax/%eax (depending on ABI) for the return.
915 // We saved the argument into a virtual register in the entry block,
916 // so now we copy the value out and into %rax/%eax.
917 //
918 // Checking Function.hasStructRetAttr() here is insufficient because the IR
919 // may not have an explicit sret argument. If FuncInfo.CanLowerReturn is
920 // false, then an sret argument may be implicitly inserted in the SelDAG. In
921 // either case FuncInfo->setSRetReturnReg() will have been called.
922 if (Register SRetReg = FuncInfo->getSRetReturnReg()) {
923 // When we have both sret and another return value, we should use the
924 // original Chain stored in RetOps[0], instead of the current Chain updated
925 // in the above loop. If we only have sret, RetOps[0] equals to Chain.
926
927 // For the case of sret and another return value, we have
928 // Chain_0 at the function entry
929 // Chain_1 = getCopyToReg(Chain_0) in the above loop
930 // If we use Chain_1 in getCopyFromReg, we will have
931 // Val = getCopyFromReg(Chain_1)
932 // Chain_2 = getCopyToReg(Chain_1, Val) from below
933
934 // getCopyToReg(Chain_0) will be glued together with
935 // getCopyToReg(Chain_1, Val) into Unit A, getCopyFromReg(Chain_1) will be
936 // in Unit B, and we will have cyclic dependency between Unit A and Unit B:
937 // Data dependency from Unit B to Unit A due to usage of Val in
938 // getCopyToReg(Chain_1, Val)
939 // Chain dependency from Unit A to Unit B
940
941 // So here, we use RetOps[0] (i.e Chain_0) for getCopyFromReg.
942 SDValue Val = DAG.getCopyFromReg(RetOps[0], dl, SRetReg,
944
945 Register RetValReg
946 = (Subtarget.is64Bit() && !Subtarget.isTarget64BitILP32()) ?
947 X86::RAX : X86::EAX;
948 Chain = DAG.getCopyToReg(Chain, dl, RetValReg, Val, Glue);
949 Glue = Chain.getValue(1);
950
951 // RAX/EAX now acts like a return value.
952 RetOps.push_back(
953 DAG.getRegister(RetValReg, getPointerTy(DAG.getDataLayout())));
954
955 // Add the returned register to the CalleeSaveDisableRegs list. Don't do
956 // this however for preserve_most/preserve_all to minimize the number of
957 // callee-saved registers for these CCs.
958 if (ShouldDisableCalleeSavedRegister &&
959 CallConv != CallingConv::PreserveAll &&
960 CallConv != CallingConv::PreserveMost)
962 }
963
964 const X86RegisterInfo *TRI = Subtarget.getRegisterInfo();
965 const MCPhysReg *I =
966 TRI->getCalleeSavedRegsViaCopy(&DAG.getMachineFunction());
967 if (I) {
968 for (; *I; ++I) {
969 if (X86::GR64RegClass.contains(*I))
970 RetOps.push_back(DAG.getRegister(*I, MVT::i64));
971 else
972 llvm_unreachable("Unexpected register class in CSRsViaCopy!");
973 }
974 }
975
976 RetOps[0] = Chain; // Update chain.
977
978 // Add the glue if we have it.
979 if (Glue.getNode())
980 RetOps.push_back(Glue);
981
982 unsigned RetOpcode = X86ISD::RET_GLUE;
983 if (CallConv == CallingConv::X86_INTR)
984 RetOpcode = X86ISD::IRET;
985 return DAG.getNode(RetOpcode, dl, MVT::Other, RetOps);
986}
987
988bool X86TargetLowering::isUsedByReturnOnly(SDNode *N, SDValue &Chain) const {
989 if (N->getNumValues() != 1 || !N->hasNUsesOfValue(1, 0))
990 return false;
991
992 SDValue TCChain = Chain;
993 SDNode *Copy = *N->user_begin();
994 if (Copy->getOpcode() == ISD::CopyToReg) {
995 // If the copy has a glue operand, we conservatively assume it isn't safe to
996 // perform a tail call.
997 if (Copy->getOperand(Copy->getNumOperands()-1).getValueType() == MVT::Glue)
998 return false;
999 TCChain = Copy->getOperand(0);
1000 } else if (Copy->getOpcode() != ISD::FP_EXTEND)
1001 return false;
1002
1003 bool HasRet = false;
1004 for (const SDNode *U : Copy->users()) {
1005 if (U->getOpcode() != X86ISD::RET_GLUE)
1006 return false;
1007 // If we are returning more than one value, we can definitely
1008 // not make a tail call see PR19530
1009 if (U->getNumOperands() > 4)
1010 return false;
1011 if (U->getNumOperands() == 4 &&
1012 U->getOperand(U->getNumOperands() - 1).getValueType() != MVT::Glue)
1013 return false;
1014 HasRet = true;
1015 }
1016
1017 if (!HasRet)
1018 return false;
1019
1020 Chain = TCChain;
1021 return true;
1022}
1023
1024EVT X86TargetLowering::getTypeForExtReturn(LLVMContext &Context, EVT VT,
1025 ISD::NodeType ExtendKind) const {
1026 MVT ReturnMVT = MVT::i32;
1027
1028 bool Darwin = Subtarget.getTargetTriple().isOSDarwin();
1029 if (VT == MVT::i1 || (!Darwin && (VT == MVT::i8 || VT == MVT::i16))) {
1030 // The ABI does not require i1, i8 or i16 to be extended.
1031 //
1032 // On Darwin, there is code in the wild relying on Clang's old behaviour of
1033 // always extending i8/i16 return values, so keep doing that for now.
1034 // (PR26665).
1035 ReturnMVT = MVT::i8;
1036 }
1037
1038 EVT MinVT = getRegisterType(Context, ReturnMVT);
1039 return VT.bitsLT(MinVT) ? MinVT : VT;
1040}
1041
1042/// Reads two 32 bit registers and creates a 64 bit mask value.
1043/// \param VA The current 32 bit value that need to be assigned.
1044/// \param NextVA The next 32 bit value that need to be assigned.
1045/// \param Root The parent DAG node.
1046/// \param [in,out] InGlue Represents SDvalue in the parent DAG node for
1047/// glue purposes. In the case the DAG is already using
1048/// physical register instead of virtual, we should glue
1049/// our new SDValue to InGlue SDvalue.
1050/// \return a new SDvalue of size 64bit.
1052 SDValue &Root, SelectionDAG &DAG,
1053 const SDLoc &DL, const X86Subtarget &Subtarget,
1054 SDValue *InGlue = nullptr) {
1055 assert((Subtarget.hasBWI()) && "Expected AVX512BW target!");
1056 assert(Subtarget.is32Bit() && "Expecting 32 bit target");
1057 assert(VA.getValVT() == MVT::v64i1 &&
1058 "Expecting first location of 64 bit width type");
1059 assert(NextVA.getValVT() == VA.getValVT() &&
1060 "The locations should have the same type");
1061 assert(VA.isRegLoc() && NextVA.isRegLoc() &&
1062 "The values should reside in two registers");
1063
1064 SDValue Lo, Hi;
1065 SDValue ArgValueLo, ArgValueHi;
1066
1068 const TargetRegisterClass *RC = &X86::GR32RegClass;
1069
1070 // Read a 32 bit value from the registers.
1071 if (nullptr == InGlue) {
1072 // When no physical register is present,
1073 // create an intermediate virtual register.
1074 Register Reg = MF.addLiveIn(VA.getLocReg(), RC);
1075 ArgValueLo = DAG.getCopyFromReg(Root, DL, Reg, MVT::i32);
1076 Reg = MF.addLiveIn(NextVA.getLocReg(), RC);
1077 ArgValueHi = DAG.getCopyFromReg(Root, DL, Reg, MVT::i32);
1078 } else {
1079 // When a physical register is available read the value from it and glue
1080 // the reads together.
1081 ArgValueLo =
1082 DAG.getCopyFromReg(Root, DL, VA.getLocReg(), MVT::i32, *InGlue);
1083 *InGlue = ArgValueLo.getValue(2);
1084 ArgValueHi =
1085 DAG.getCopyFromReg(Root, DL, NextVA.getLocReg(), MVT::i32, *InGlue);
1086 *InGlue = ArgValueHi.getValue(2);
1087 }
1088
1089 // Convert the i32 type into v32i1 type.
1090 Lo = DAG.getBitcast(MVT::v32i1, ArgValueLo);
1091
1092 // Convert the i32 type into v32i1 type.
1093 Hi = DAG.getBitcast(MVT::v32i1, ArgValueHi);
1094
1095 // Concatenate the two values together.
1096 return DAG.getNode(ISD::CONCAT_VECTORS, DL, MVT::v64i1, Lo, Hi);
1097}
1098
1099/// The function will lower a register of various sizes (8/16/32/64)
1100/// to a mask value of the expected size (v8i1/v16i1/v32i1/v64i1)
1101/// \returns a DAG node contains the operand after lowering to mask type.
1102static SDValue lowerRegToMasks(const SDValue &ValArg, const EVT &ValVT,
1103 const EVT &ValLoc, const SDLoc &DL,
1104 SelectionDAG &DAG) {
1105 SDValue ValReturned = ValArg;
1106
1107 if (ValVT == MVT::v1i1)
1108 return DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v1i1, ValReturned);
1109
1110 if (ValVT == MVT::v64i1) {
1111 // In 32 bit machine, this case is handled by getv64i1Argument
1112 assert(ValLoc == MVT::i64 && "Expecting only i64 locations");
1113 // In 64 bit machine, There is no need to truncate the value only bitcast
1114 } else {
1115 MVT MaskLenVT;
1116 switch (ValVT.getSimpleVT().SimpleTy) {
1117 case MVT::v8i1:
1118 MaskLenVT = MVT::i8;
1119 break;
1120 case MVT::v16i1:
1121 MaskLenVT = MVT::i16;
1122 break;
1123 case MVT::v32i1:
1124 MaskLenVT = MVT::i32;
1125 break;
1126 default:
1127 llvm_unreachable("Expecting a vector of i1 types");
1128 }
1129
1130 ValReturned = DAG.getNode(ISD::TRUNCATE, DL, MaskLenVT, ValReturned);
1131 }
1132 return DAG.getBitcast(ValVT, ValReturned);
1133}
1134
1136 const SDLoc &dl, Register Reg, EVT VT,
1137 SDValue Glue) {
1138 SDVTList VTs = DAG.getVTList(VT, MVT::Other, MVT::Glue);
1139 SDValue Ops[] = {Chain, DAG.getRegister(Reg, VT), Glue};
1140 return DAG.getNode(X86ISD::POP_FROM_X87_REG, dl, VTs,
1141 ArrayRef(Ops, Glue.getNode() ? 3 : 2));
1142}
1143
1144/// Lower the result values of a call into the
1145/// appropriate copies out of appropriate physical registers.
1146///
1147SDValue X86TargetLowering::LowerCallResult(
1148 SDValue Chain, SDValue InGlue, CallingConv::ID CallConv, bool isVarArg,
1149 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
1151 uint32_t *RegMask) const {
1152
1153 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
1154 // Assign locations to each value returned by this call.
1156 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs,
1157 *DAG.getContext());
1158 CCInfo.AnalyzeCallResult(Ins, RetCC_X86);
1159
1160 // Copy all of the result registers out of their specified physreg.
1161 for (unsigned I = 0, E = RVLocs.size(); I != E; ++I) {
1162 CCValAssign &VA = RVLocs[I];
1163 EVT CopyVT = VA.getLocVT();
1164
1165 // In some calling conventions we need to remove the used registers
1166 // from the register mask.
1167 if (RegMask) {
1168 for (MCPhysReg SubReg : TRI->subregs_inclusive(VA.getLocReg()))
1169 RegMask[SubReg / 32] &= ~(1u << (SubReg % 32));
1170 }
1171
1172 // Report an error if there was an attempt to return FP values via XMM
1173 // registers.
1174 if (!Subtarget.hasSSE1() && X86::FR32XRegClass.contains(VA.getLocReg())) {
1175 errorUnsupported(DAG, dl, "SSE register return with SSE disabled");
1176 if (VA.getLocReg() == X86::XMM1)
1177 VA.convertToReg(X86::FP1); // Set reg to FP1, avoid hitting asserts.
1178 else
1179 VA.convertToReg(X86::FP0); // Set reg to FP0, avoid hitting asserts.
1180 } else if (!Subtarget.hasSSE2() &&
1181 X86::FR64XRegClass.contains(VA.getLocReg()) &&
1182 CopyVT == MVT::f64) {
1183 errorUnsupported(DAG, dl, "SSE2 register return with SSE2 disabled");
1184 if (VA.getLocReg() == X86::XMM1)
1185 VA.convertToReg(X86::FP1); // Set reg to FP1, avoid hitting asserts.
1186 else
1187 VA.convertToReg(X86::FP0); // Set reg to FP0, avoid hitting asserts.
1188 }
1189
1190 // If we prefer to use the value in xmm registers, copy it out as f80 and
1191 // use a truncate to move it from fp stack reg to xmm reg.
1192 bool RoundAfterCopy = false;
1193 bool X87Result = VA.getLocReg() == X86::FP0 || VA.getLocReg() == X86::FP1;
1194 if (X87Result && isScalarFPTypeInSSEReg(VA.getValVT())) {
1195 if (!Subtarget.hasX87())
1196 report_fatal_error("X87 register return with X87 disabled");
1197 CopyVT = MVT::f80;
1198 RoundAfterCopy = (CopyVT != VA.getLocVT());
1199 }
1200
1201 SDValue Val;
1202 if (VA.needsCustom()) {
1203 assert(VA.getValVT() == MVT::v64i1 &&
1204 "Currently the only custom case is when we split v64i1 to 2 regs");
1205 Val =
1206 getv64i1Argument(VA, RVLocs[++I], Chain, DAG, dl, Subtarget, &InGlue);
1207 } else {
1208 Chain =
1209 X87Result
1210 ? getPopFromX87Reg(DAG, Chain, dl, VA.getLocReg(), CopyVT, InGlue)
1211 .getValue(1)
1212 : DAG.getCopyFromReg(Chain, dl, VA.getLocReg(), CopyVT, InGlue)
1213 .getValue(1);
1214 Val = Chain.getValue(0);
1215 InGlue = Chain.getValue(2);
1216 }
1217
1218 if (RoundAfterCopy)
1219 Val = DAG.getNode(ISD::FP_ROUND, dl, VA.getValVT(), Val,
1220 // This truncation won't change the value.
1221 DAG.getIntPtrConstant(1, dl, /*isTarget=*/true));
1222
1223 if (VA.isExtInLoc()) {
1224 if (VA.getValVT().isVector() &&
1225 VA.getValVT().getScalarType() == MVT::i1 &&
1226 ((VA.getLocVT() == MVT::i64) || (VA.getLocVT() == MVT::i32) ||
1227 (VA.getLocVT() == MVT::i16) || (VA.getLocVT() == MVT::i8))) {
1228 // promoting a mask type (v*i1) into a register of type i64/i32/i16/i8
1229 Val = lowerRegToMasks(Val, VA.getValVT(), VA.getLocVT(), dl, DAG);
1230 } else
1231 Val = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), Val);
1232 }
1233
1234 if (VA.getLocInfo() == CCValAssign::BCvt)
1235 Val = DAG.getBitcast(VA.getValVT(), Val);
1236
1237 InVals.push_back(Val);
1238 }
1239
1240 return Chain;
1241}
1242
1243/// Determines whether Args, either a set of outgoing arguments to a call, or a
1244/// set of incoming args of a call, contains an sret pointer that the callee
1245/// pops. This happens on most x86-32, System V platforms, unless register
1246/// parameters are in use (-mregparm=1+, regcallcc, etc).
1247template <typename T>
1248static bool hasCalleePopSRet(const SmallVectorImpl<T> &Args,
1249 const SmallVectorImpl<CCValAssign> &ArgLocs,
1250 const X86Subtarget &Subtarget) {
1251 // Not C++20 (yet), so no concepts available.
1252 static_assert(std::is_same_v<T, ISD::OutputArg> ||
1253 std::is_same_v<T, ISD::InputArg>,
1254 "requires ISD::OutputArg or ISD::InputArg");
1255
1256 // Popping the sret pointer only happens on x86-32 System V ABI platforms
1257 // (Linux, Cygwin, BSDs, Mac, etc). That excludes Windows-minus-Cygwin and
1258 // MCU.
1259 const Triple &TT = Subtarget.getTargetTriple();
1260 if (!TT.isX86_32() || TT.isOSMSVCRT() || TT.isOSIAMCU())
1261 return false;
1262
1263 // Check if the first argument is marked sret and if it is passed in memory.
1264 bool IsSRetInMem = false;
1265 if (!Args.empty())
1266 IsSRetInMem = Args.front().Flags.isSRet() && ArgLocs.front().isMemLoc();
1267 return IsSRetInMem;
1268}
1269
1270/// Make a copy of an aggregate at address specified by "Src" to address
1271/// "Dst" with size and alignment information specified by the specific
1272/// parameter attribute. The copy will be passed as a byval function parameter.
1274 SDValue Chain, ISD::ArgFlagsTy Flags,
1275 SelectionDAG &DAG, const SDLoc &dl) {
1276 SDValue SizeNode = DAG.getIntPtrConstant(Flags.getByValSize(), dl);
1277 Align Alignment = Flags.getNonZeroByValAlign();
1278 return DAG.getMemcpy(Chain, dl, Dst, Src, SizeNode, Alignment, Alignment,
1279 /*isVolatile*/ false, /*AlwaysInline=*/true,
1280 /*CI=*/nullptr, std::nullopt, MachinePointerInfo(),
1282}
1283
1284/// Return true if the calling convention is one that we can guarantee TCO for.
1290
1291/// Return true if we might ever do TCO for calls with this calling convention.
1293 switch (CC) {
1294 // C calling conventions:
1295 case CallingConv::C:
1296 case CallingConv::Win64:
1299 // Callee pop conventions:
1304 // Swift:
1305 case CallingConv::Swift:
1306 return true;
1307 default:
1308 return canGuaranteeTCO(CC);
1309 }
1310}
1311
1312/// Return true if the function is being made into a tailcall target by
1313/// changing its ABI.
1314static bool shouldGuaranteeTCO(CallingConv::ID CC, bool GuaranteedTailCallOpt) {
1315 return (GuaranteedTailCallOpt && canGuaranteeTCO(CC)) ||
1317}
1318
1319bool X86TargetLowering::mayBeEmittedAsTailCall(const CallInst *CI) const {
1320 if (!CI->isTailCall())
1321 return false;
1322
1323 CallingConv::ID CalleeCC = CI->getCallingConv();
1324 if (!mayTailCallThisCC(CalleeCC))
1325 return false;
1326
1327 return true;
1328}
1329
1330SDValue
1331X86TargetLowering::LowerMemArgument(SDValue Chain, CallingConv::ID CallConv,
1333 const SDLoc &dl, SelectionDAG &DAG,
1334 const CCValAssign &VA,
1335 MachineFrameInfo &MFI, unsigned i) const {
1336 // Create the nodes corresponding to a load from this parameter slot.
1337 ISD::ArgFlagsTy Flags = Ins[i].Flags;
1338 bool AlwaysUseMutable = shouldGuaranteeTCO(
1339 CallConv, DAG.getTarget().Options.GuaranteedTailCallOpt);
1340 bool isImmutable = !AlwaysUseMutable && !Flags.isByVal();
1341 EVT ValVT;
1342 MVT PtrVT = getPointerTy(DAG.getDataLayout());
1343
1344 // If value is passed by pointer we have address passed instead of the value
1345 // itself. No need to extend if the mask value and location share the same
1346 // absolute size.
1347 bool ExtendedInMem =
1348 VA.isExtInLoc() && VA.getValVT().getScalarType() == MVT::i1 &&
1350
1351 if (VA.getLocInfo() == CCValAssign::Indirect || ExtendedInMem)
1352 ValVT = VA.getLocVT();
1353 else
1354 ValVT = VA.getValVT();
1355
1356 // FIXME: For now, all byval parameter objects are marked mutable. This can be
1357 // changed with more analysis.
1358 // In case of tail call optimization mark all arguments mutable. Since they
1359 // could be overwritten by lowering of arguments in case of a tail call.
1360 if (Flags.isByVal()) {
1361 unsigned Bytes = Flags.getByValSize();
1362 if (Bytes == 0) Bytes = 1; // Don't create zero-sized stack objects.
1363
1364 // FIXME: For now, all byval parameter objects are marked as aliasing. This
1365 // can be improved with deeper analysis.
1366 int FI = MFI.CreateFixedObject(Bytes, VA.getLocMemOffset(), isImmutable,
1367 /*isAliased=*/true);
1368 return DAG.getFrameIndex(FI, PtrVT);
1369 }
1370
1371 EVT ArgVT = Ins[i].ArgVT;
1372
1373 // If this is a vector that has been split into multiple parts, don't elide
1374 // the copy. The layout on the stack may not match the packed in-memory
1375 // layout.
1376 bool ScalarizedVector = ArgVT.isVector() && !VA.getLocVT().isVector();
1377
1378 // This is an argument in memory. We might be able to perform copy elision.
1379 // If the argument is passed directly in memory without any extension, then we
1380 // can perform copy elision. Large vector types, for example, may be passed
1381 // indirectly by pointer.
1382 if (Flags.isCopyElisionCandidate() &&
1383 VA.getLocInfo() != CCValAssign::Indirect && !ExtendedInMem &&
1384 !ScalarizedVector) {
1385 SDValue PartAddr;
1386 if (Ins[i].PartOffset == 0) {
1387 // If this is a one-part value or the first part of a multi-part value,
1388 // create a stack object for the entire argument value type and return a
1389 // load from our portion of it. This assumes that if the first part of an
1390 // argument is in memory, the rest will also be in memory.
1391 int FI = MFI.CreateFixedObject(ArgVT.getStoreSize(), VA.getLocMemOffset(),
1392 /*IsImmutable=*/false);
1393 PartAddr = DAG.getFrameIndex(FI, PtrVT);
1394 return DAG.getLoad(
1395 ValVT, dl, Chain, PartAddr,
1397 }
1398
1399 // This is not the first piece of an argument in memory. See if there is
1400 // already a fixed stack object including this offset. If so, assume it
1401 // was created by the PartOffset == 0 branch above and create a load from
1402 // the appropriate offset into it.
1403 int64_t PartBegin = VA.getLocMemOffset();
1404 int64_t PartEnd = PartBegin + ValVT.getSizeInBits() / 8;
1405 int FI = MFI.getObjectIndexBegin();
1406 for (; MFI.isFixedObjectIndex(FI); ++FI) {
1407 int64_t ObjBegin = MFI.getObjectOffset(FI);
1408 int64_t ObjEnd = ObjBegin + MFI.getObjectSize(FI);
1409 if (ObjBegin <= PartBegin && PartEnd <= ObjEnd)
1410 break;
1411 }
1412 if (MFI.isFixedObjectIndex(FI)) {
1413 SDValue Addr =
1414 DAG.getNode(ISD::ADD, dl, PtrVT, DAG.getFrameIndex(FI, PtrVT),
1415 DAG.getIntPtrConstant(Ins[i].PartOffset, dl));
1416 return DAG.getLoad(ValVT, dl, Chain, Addr,
1418 DAG.getMachineFunction(), FI, Ins[i].PartOffset));
1419 }
1420 }
1421
1422 int FI = MFI.CreateFixedObject(ValVT.getSizeInBits() / 8,
1423 VA.getLocMemOffset(), isImmutable);
1424
1425 // Set SExt or ZExt flag.
1426 if (VA.getLocInfo() == CCValAssign::ZExt) {
1427 MFI.setObjectZExt(FI, true);
1428 } else if (VA.getLocInfo() == CCValAssign::SExt) {
1429 MFI.setObjectSExt(FI, true);
1430 }
1431
1432 MaybeAlign Alignment;
1433 if (Subtarget.isTargetWindowsMSVC() && !Subtarget.is64Bit() &&
1434 ValVT != MVT::f80)
1435 Alignment = MaybeAlign(4);
1436 SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
1437 SDValue Val = DAG.getLoad(
1438 ValVT, dl, Chain, FIN,
1440 Alignment);
1441 return ExtendedInMem
1442 ? (VA.getValVT().isVector()
1443 ? DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VA.getValVT(), Val)
1444 : DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), Val))
1445 : Val;
1446}
1447
1448// FIXME: Get this from tablegen.
1450 const X86Subtarget &Subtarget) {
1451 assert(Subtarget.is64Bit());
1452
1453 if (Subtarget.isCallingConvWin64(CallConv)) {
1454 static const MCPhysReg GPR64ArgRegsWin64[] = {
1455 X86::RCX, X86::RDX, X86::R8, X86::R9
1456 };
1457 return GPR64ArgRegsWin64;
1458 }
1459
1460 static const MCPhysReg GPR64ArgRegs64Bit[] = {
1461 X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9
1462 };
1463 return GPR64ArgRegs64Bit;
1464}
1465
1466// FIXME: Get this from tablegen.
1468 CallingConv::ID CallConv,
1469 const X86Subtarget &Subtarget) {
1470 assert(Subtarget.is64Bit());
1471 if (Subtarget.isCallingConvWin64(CallConv)) {
1472 // The XMM registers which might contain var arg parameters are shadowed
1473 // in their paired GPR. So we only need to save the GPR to their home
1474 // slots.
1475 // TODO: __vectorcall will change this.
1476 return {};
1477 }
1478
1479 bool isSoftFloat = Subtarget.useSoftFloat();
1480 if (isSoftFloat || !Subtarget.hasSSE1())
1481 // Kernel mode asks for SSE to be disabled, so there are no XMM argument
1482 // registers.
1483 return {};
1484
1485 static const MCPhysReg XMMArgRegs64Bit[] = {
1486 X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
1487 X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
1488 };
1489 return XMMArgRegs64Bit;
1490}
1491
1492#ifndef NDEBUG
1494 return llvm::is_sorted(
1495 ArgLocs, [](const CCValAssign &A, const CCValAssign &B) -> bool {
1496 return A.getValNo() < B.getValNo();
1497 });
1498}
1499#endif
1500
1501namespace {
1502/// This is a helper class for lowering variable arguments parameters.
1503class VarArgsLoweringHelper {
1504public:
1505 VarArgsLoweringHelper(X86MachineFunctionInfo *FuncInfo, const SDLoc &Loc,
1506 SelectionDAG &DAG, const X86Subtarget &Subtarget,
1507 CallingConv::ID CallConv, CCState &CCInfo)
1508 : FuncInfo(FuncInfo), DL(Loc), DAG(DAG), Subtarget(Subtarget),
1509 TheMachineFunction(DAG.getMachineFunction()),
1510 TheFunction(TheMachineFunction.getFunction()),
1511 FrameInfo(TheMachineFunction.getFrameInfo()),
1512 FrameLowering(*Subtarget.getFrameLowering()),
1513 TargLowering(DAG.getTargetLoweringInfo()), CallConv(CallConv),
1514 CCInfo(CCInfo) {}
1515
1516 // Lower variable arguments parameters.
1517 void lowerVarArgsParameters(SDValue &Chain, unsigned StackSize);
1518
1519private:
1520 void createVarArgAreaAndStoreRegisters(SDValue &Chain, unsigned StackSize);
1521
1522 void forwardMustTailParameters(SDValue &Chain);
1523
1524 bool is64Bit() const { return Subtarget.is64Bit(); }
1525 bool isWin64() const { return Subtarget.isCallingConvWin64(CallConv); }
1526
1527 X86MachineFunctionInfo *FuncInfo;
1528 const SDLoc &DL;
1529 SelectionDAG &DAG;
1530 const X86Subtarget &Subtarget;
1531 MachineFunction &TheMachineFunction;
1532 const Function &TheFunction;
1533 MachineFrameInfo &FrameInfo;
1534 const TargetFrameLowering &FrameLowering;
1535 const TargetLowering &TargLowering;
1536 CallingConv::ID CallConv;
1537 CCState &CCInfo;
1538};
1539} // namespace
1540
1541void VarArgsLoweringHelper::createVarArgAreaAndStoreRegisters(
1542 SDValue &Chain, unsigned StackSize) {
1543 // If the function takes variable number of arguments, make a frame index for
1544 // the start of the first vararg value... for expansion of llvm.va_start. We
1545 // can skip this if there are no va_start calls.
1546 if (is64Bit() || (CallConv != CallingConv::X86_FastCall &&
1547 CallConv != CallingConv::X86_ThisCall)) {
1548 FuncInfo->setVarArgsFrameIndex(
1549 FrameInfo.CreateFixedObject(1, StackSize, true));
1550 }
1551
1552 // 64-bit calling conventions support varargs and register parameters, so we
1553 // have to do extra work to spill them in the prologue.
1554 if (is64Bit()) {
1555 // Find the first unallocated argument registers.
1557 ArrayRef<MCPhysReg> ArgXMMs =
1558 get64BitArgumentXMMs(TheMachineFunction, CallConv, Subtarget);
1559 unsigned NumIntRegs = CCInfo.getFirstUnallocated(ArgGPRs);
1560 unsigned NumXMMRegs = CCInfo.getFirstUnallocated(ArgXMMs);
1561
1562 assert(!(NumXMMRegs && !Subtarget.hasSSE1()) &&
1563 "SSE register cannot be used when SSE is disabled!");
1564
1565 if (isWin64()) {
1566 // Get to the caller-allocated home save location. Add 8 to account
1567 // for the return address.
1568 int HomeOffset = FrameLowering.getOffsetOfLocalArea() + 8;
1569 FuncInfo->setRegSaveFrameIndex(
1570 FrameInfo.CreateFixedObject(1, NumIntRegs * 8 + HomeOffset, false));
1571 // Fixup to set vararg frame on shadow area (4 x i64).
1572 if (NumIntRegs < 4)
1573 FuncInfo->setVarArgsFrameIndex(FuncInfo->getRegSaveFrameIndex());
1574 } else {
1575 // For X86-64, if there are vararg parameters that are passed via
1576 // registers, then we must store them to their spots on the stack so
1577 // they may be loaded by dereferencing the result of va_next.
1578 FuncInfo->setVarArgsGPOffset(NumIntRegs * 8);
1579 FuncInfo->setVarArgsFPOffset(ArgGPRs.size() * 8 + NumXMMRegs * 16);
1580 FuncInfo->setRegSaveFrameIndex(FrameInfo.CreateStackObject(
1581 ArgGPRs.size() * 8 + ArgXMMs.size() * 16, Align(16), false));
1582 }
1583
1585 LiveGPRs; // list of SDValue for GPR registers keeping live input value
1586 SmallVector<SDValue, 8> LiveXMMRegs; // list of SDValue for XMM registers
1587 // keeping live input value
1588 SDValue ALVal; // if applicable keeps SDValue for %al register
1589
1590 // Gather all the live in physical registers.
1591 for (MCPhysReg Reg : ArgGPRs.slice(NumIntRegs)) {
1592 Register GPR = TheMachineFunction.addLiveIn(Reg, &X86::GR64RegClass);
1593 LiveGPRs.push_back(DAG.getCopyFromReg(Chain, DL, GPR, MVT::i64));
1594 }
1595 const auto &AvailableXmms = ArgXMMs.slice(NumXMMRegs);
1596 if (!AvailableXmms.empty()) {
1597 Register AL = TheMachineFunction.addLiveIn(X86::AL, &X86::GR8RegClass);
1598 ALVal = DAG.getCopyFromReg(Chain, DL, AL, MVT::i8);
1599 for (MCPhysReg Reg : AvailableXmms) {
1600 // FastRegisterAllocator spills virtual registers at basic
1601 // block boundary. That leads to usages of xmm registers
1602 // outside of check for %al. Pass physical registers to
1603 // VASTART_SAVE_XMM_REGS to avoid unneccessary spilling.
1604 TheMachineFunction.getRegInfo().addLiveIn(Reg);
1605 LiveXMMRegs.push_back(DAG.getRegister(Reg, MVT::v4f32));
1606 }
1607 }
1608
1609 // Store the integer parameter registers.
1611 SDValue RSFIN =
1612 DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
1613 TargLowering.getPointerTy(DAG.getDataLayout()));
1614 unsigned Offset = FuncInfo->getVarArgsGPOffset();
1615 for (SDValue Val : LiveGPRs) {
1616 SDValue FIN = DAG.getNode(ISD::ADD, DL,
1617 TargLowering.getPointerTy(DAG.getDataLayout()),
1618 RSFIN, DAG.getIntPtrConstant(Offset, DL));
1619 SDValue Store =
1620 DAG.getStore(Val.getValue(1), DL, Val, FIN,
1622 DAG.getMachineFunction(),
1623 FuncInfo->getRegSaveFrameIndex(), Offset));
1624 MemOps.push_back(Store);
1625 Offset += 8;
1626 }
1627
1628 // Now store the XMM (fp + vector) parameter registers.
1629 if (!LiveXMMRegs.empty()) {
1630 SmallVector<SDValue, 12> SaveXMMOps;
1631 SaveXMMOps.push_back(Chain);
1632 SaveXMMOps.push_back(ALVal);
1633 SaveXMMOps.push_back(RSFIN);
1634 SaveXMMOps.push_back(
1635 DAG.getTargetConstant(FuncInfo->getVarArgsFPOffset(), DL, MVT::i32));
1636 llvm::append_range(SaveXMMOps, LiveXMMRegs);
1637 MachineMemOperand *StoreMMO =
1640 DAG.getMachineFunction(), FuncInfo->getRegSaveFrameIndex(),
1641 Offset),
1643 MemOps.push_back(DAG.getMemIntrinsicNode(X86ISD::VASTART_SAVE_XMM_REGS,
1644 DL, DAG.getVTList(MVT::Other),
1645 SaveXMMOps, MVT::i8, StoreMMO));
1646 }
1647
1648 if (!MemOps.empty())
1649 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOps);
1650 }
1651}
1652
1653void VarArgsLoweringHelper::forwardMustTailParameters(SDValue &Chain) {
1654 // Find the largest legal vector type.
1655 MVT VecVT = MVT::Other;
1656 // FIXME: Only some x86_32 calling conventions support AVX512.
1657 if (Subtarget.useAVX512Regs() &&
1658 (is64Bit() || (CallConv == CallingConv::X86_VectorCall ||
1659 CallConv == CallingConv::Intel_OCL_BI)))
1660 VecVT = MVT::v16f32;
1661 else if (Subtarget.hasAVX())
1662 VecVT = MVT::v8f32;
1663 else if (Subtarget.hasSSE2())
1664 VecVT = MVT::v4f32;
1665
1666 // We forward some GPRs and some vector types.
1667 SmallVector<MVT, 2> RegParmTypes;
1668 MVT IntVT = is64Bit() ? MVT::i64 : MVT::i32;
1669 RegParmTypes.push_back(IntVT);
1670 if (VecVT != MVT::Other)
1671 RegParmTypes.push_back(VecVT);
1672
1673 // Compute the set of forwarded registers. The rest are scratch.
1675 FuncInfo->getForwardedMustTailRegParms();
1676 CCInfo.analyzeMustTailForwardedRegisters(Forwards, RegParmTypes, CC_X86);
1677
1678 // Forward AL for SysV x86_64 targets, since it is used for varargs.
1679 if (is64Bit() && !isWin64() && !CCInfo.isAllocated(X86::AL)) {
1680 Register ALVReg = TheMachineFunction.addLiveIn(X86::AL, &X86::GR8RegClass);
1681 Forwards.push_back(ForwardedRegister(ALVReg, X86::AL, MVT::i8));
1682 }
1683
1684 // Copy all forwards from physical to virtual registers.
1685 for (ForwardedRegister &FR : Forwards) {
1686 // FIXME: Can we use a less constrained schedule?
1687 SDValue RegVal = DAG.getCopyFromReg(Chain, DL, FR.VReg, FR.VT);
1688 FR.VReg = TheMachineFunction.getRegInfo().createVirtualRegister(
1689 TargLowering.getRegClassFor(FR.VT));
1690 Chain = DAG.getCopyToReg(Chain, DL, FR.VReg, RegVal);
1691 }
1692}
1693
1694void VarArgsLoweringHelper::lowerVarArgsParameters(SDValue &Chain,
1695 unsigned StackSize) {
1696 // Set FrameIndex to the 0xAAAAAAA value to mark unset state.
1697 // If necessary, it would be set into the correct value later.
1698 FuncInfo->setVarArgsFrameIndex(0xAAAAAAA);
1699 FuncInfo->setRegSaveFrameIndex(0xAAAAAAA);
1700
1701 if (FrameInfo.hasVAStart())
1702 createVarArgAreaAndStoreRegisters(Chain, StackSize);
1703
1704 if (FrameInfo.hasMustTailInVarArgFunc())
1705 forwardMustTailParameters(Chain);
1706}
1707
1708SDValue X86TargetLowering::LowerFormalArguments(
1709 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
1710 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
1711 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1713 X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
1714
1715 const Function &F = MF.getFunction();
1716 if (F.hasExternalLinkage() && Subtarget.isTargetCygMing() &&
1717 F.getName() == "main")
1718 FuncInfo->setForceFramePointer(true);
1719
1720 MachineFrameInfo &MFI = MF.getFrameInfo();
1721 bool Is64Bit = Subtarget.is64Bit();
1722 bool IsWin64 = Subtarget.isCallingConvWin64(CallConv);
1723
1724 // On x86_64 with x87 disabled, x86_fp80 cannot be handled: the type would
1725 // need to be returned/passed in x87 registers (FP0/FP1) which are
1726 // unavailable. Emit a clear diagnostic instead of crashing later with
1727 // "Cannot select: build_pair".
1728 if (Is64Bit && !Subtarget.hasX87()) {
1729 if (F.getReturnType()->isX86_FP80Ty() ||
1730 any_of(F.args(), [](const Argument &Arg) {
1731 return Arg.getType()->isX86_FP80Ty();
1732 }))
1734 "cannot use x86_fp80 type with x87 disabled on x86_64 target");
1735 }
1736
1737 assert(
1738 !(IsVarArg && canGuaranteeTCO(CallConv)) &&
1739 "Var args not supported with calling conv' regcall, fastcc, ghc or hipe");
1740
1741 // Assign locations to all of the incoming arguments.
1743 CCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, *DAG.getContext());
1744
1745 // Allocate shadow area for Win64.
1746 if (IsWin64)
1747 CCInfo.AllocateStack(32, Align(8));
1748
1749 CCInfo.AnalyzeArguments(Ins, CC_X86);
1750
1751 // In vectorcall calling convention a second pass is required for the HVA
1752 // types.
1753 if (CallingConv::X86_VectorCall == CallConv) {
1754 CCInfo.AnalyzeArgumentsSecondPass(Ins, CC_X86);
1755 }
1756
1757 // The next loop assumes that the locations are in the same order of the
1758 // input arguments.
1759 assert(isSortedByValueNo(ArgLocs) &&
1760 "Argument Location list must be sorted before lowering");
1761
1762 SDValue ArgValue;
1763 for (unsigned I = 0, InsIndex = 0, E = ArgLocs.size(); I != E;
1764 ++I, ++InsIndex) {
1765 assert(InsIndex < Ins.size() && "Invalid Ins index");
1766 CCValAssign &VA = ArgLocs[I];
1767
1768 if (VA.isRegLoc()) {
1769 EVT RegVT = VA.getLocVT();
1770 if (VA.needsCustom()) {
1771 assert(
1772 VA.getValVT() == MVT::v64i1 &&
1773 "Currently the only custom case is when we split v64i1 to 2 regs");
1774
1775 // v64i1 values, in regcall calling convention, that are
1776 // compiled to 32 bit arch, are split up into two registers.
1777 ArgValue =
1778 getv64i1Argument(VA, ArgLocs[++I], Chain, DAG, dl, Subtarget);
1779 } else {
1780 const TargetRegisterClass *RC;
1781 if (RegVT == MVT::i8)
1782 RC = &X86::GR8RegClass;
1783 else if (RegVT == MVT::i16)
1784 RC = &X86::GR16RegClass;
1785 else if (RegVT == MVT::i32)
1786 RC = &X86::GR32RegClass;
1787 else if (Is64Bit && RegVT == MVT::i64)
1788 RC = &X86::GR64RegClass;
1789 else if (RegVT == MVT::f16)
1790 RC = Subtarget.hasAVX512() ? &X86::FR16XRegClass : &X86::FR16RegClass;
1791 else if (RegVT == MVT::f32)
1792 RC = Subtarget.hasAVX512() ? &X86::FR32XRegClass : &X86::FR32RegClass;
1793 else if (RegVT == MVT::f64)
1794 RC = Subtarget.hasAVX512() ? &X86::FR64XRegClass : &X86::FR64RegClass;
1795 else if (RegVT == MVT::f80)
1796 RC = &X86::RFP80RegClass;
1797 else if (RegVT == MVT::f128)
1798 RC = &X86::VR128RegClass;
1799 else if (RegVT.is512BitVector())
1800 RC = &X86::VR512RegClass;
1801 else if (RegVT.is256BitVector())
1802 RC = Subtarget.hasVLX() ? &X86::VR256XRegClass : &X86::VR256RegClass;
1803 else if (RegVT.is128BitVector())
1804 RC = Subtarget.hasVLX() ? &X86::VR128XRegClass : &X86::VR128RegClass;
1805 else if (RegVT == MVT::x86mmx)
1806 RC = &X86::VR64RegClass;
1807 else if (RegVT == MVT::v1i1)
1808 RC = &X86::VK1RegClass;
1809 else if (RegVT == MVT::v8i1)
1810 RC = &X86::VK8RegClass;
1811 else if (RegVT == MVT::v16i1)
1812 RC = &X86::VK16RegClass;
1813 else if (RegVT == MVT::v32i1)
1814 RC = &X86::VK32RegClass;
1815 else if (RegVT == MVT::v64i1)
1816 RC = &X86::VK64RegClass;
1817 else
1818 llvm_unreachable("Unknown argument type!");
1819
1820 Register Reg = MF.addLiveIn(VA.getLocReg(), RC);
1821 ArgValue = DAG.getCopyFromReg(Chain, dl, Reg, RegVT);
1822 }
1823
1824 // If this is an 8 or 16-bit value, it is really passed promoted to 32
1825 // bits. Insert an assert[sz]ext to capture this, then truncate to the
1826 // right size.
1827 if (VA.getLocInfo() == CCValAssign::SExt)
1828 ArgValue = DAG.getNode(ISD::AssertSext, dl, RegVT, ArgValue,
1829 DAG.getValueType(VA.getValVT()));
1830 else if (VA.getLocInfo() == CCValAssign::ZExt)
1831 ArgValue = DAG.getNode(ISD::AssertZext, dl, RegVT, ArgValue,
1832 DAG.getValueType(VA.getValVT()));
1833 else if (VA.getLocInfo() == CCValAssign::BCvt)
1834 ArgValue = DAG.getBitcast(VA.getValVT(), ArgValue);
1835
1836 if (VA.isExtInLoc()) {
1837 // Handle MMX values passed in XMM regs.
1838 if (RegVT.isVector() && VA.getValVT().getScalarType() != MVT::i1)
1839 ArgValue = DAG.getNode(X86ISD::MOVDQ2Q, dl, VA.getValVT(), ArgValue);
1840 else if (VA.getValVT().isVector() &&
1841 VA.getValVT().getScalarType() == MVT::i1 &&
1842 ((VA.getLocVT() == MVT::i64) || (VA.getLocVT() == MVT::i32) ||
1843 (VA.getLocVT() == MVT::i16) || (VA.getLocVT() == MVT::i8))) {
1844 // Promoting a mask type (v*i1) into a register of type i64/i32/i16/i8
1845 ArgValue = lowerRegToMasks(ArgValue, VA.getValVT(), RegVT, dl, DAG);
1846 } else
1847 ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
1848 }
1849 } else {
1850 assert(VA.isMemLoc());
1851 ArgValue =
1852 LowerMemArgument(Chain, CallConv, Ins, dl, DAG, VA, MFI, InsIndex);
1853 }
1854
1855 // If value is passed via pointer - do a load.
1856 if (VA.getLocInfo() == CCValAssign::Indirect &&
1857 !(Ins[I].Flags.isByVal() && VA.isRegLoc())) {
1858 ArgValue =
1859 DAG.getLoad(VA.getValVT(), dl, Chain, ArgValue, MachinePointerInfo());
1860 }
1861
1862 InVals.push_back(ArgValue);
1863 }
1864
1865 for (unsigned I = 0, E = Ins.size(); I != E; ++I) {
1866 if (Ins[I].Flags.isSwiftAsync()) {
1867 auto X86FI = MF.getInfo<X86MachineFunctionInfo>();
1868 if (X86::isExtendedSwiftAsyncFrameSupported(Subtarget, MF))
1869 X86FI->setHasSwiftAsyncContext(true);
1870 else {
1871 int PtrSize = Subtarget.is64Bit() ? 8 : 4;
1872 int FI =
1873 MF.getFrameInfo().CreateStackObject(PtrSize, Align(PtrSize), false);
1874 X86FI->setSwiftAsyncContextFrameIdx(FI);
1875 SDValue St = DAG.getStore(
1876 DAG.getEntryNode(), dl, InVals[I],
1877 DAG.getFrameIndex(FI, PtrSize == 8 ? MVT::i64 : MVT::i32),
1879 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, St, Chain);
1880 }
1881 }
1882
1883 // Swift calling convention does not require we copy the sret argument
1884 // into %rax/%eax for the return. We don't set SRetReturnReg for Swift.
1885 if (CallConv == CallingConv::Swift || CallConv == CallingConv::SwiftTail)
1886 continue;
1887
1888 // All x86 ABIs require that for returning structs by value we copy the
1889 // sret argument into %rax/%eax (depending on ABI) for the return. Save
1890 // the argument into a virtual register so that we can access it from the
1891 // return points.
1892 if (Ins[I].Flags.isSRet()) {
1893 assert(!FuncInfo->getSRetReturnReg() &&
1894 "SRet return has already been set");
1895 MVT PtrTy = getPointerTy(DAG.getDataLayout());
1896 Register Reg =
1898 FuncInfo->setSRetReturnReg(Reg);
1899 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[I]);
1900 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Copy, Chain);
1901 break;
1902 }
1903 }
1904
1905 unsigned StackSize = CCInfo.getStackSize();
1906 // Align stack specially for tail calls.
1907 if (shouldGuaranteeTCO(CallConv,
1909 StackSize = GetAlignedArgumentStackSize(StackSize, DAG);
1910
1911 if (IsVarArg)
1912 VarArgsLoweringHelper(FuncInfo, dl, DAG, Subtarget, CallConv, CCInfo)
1913 .lowerVarArgsParameters(Chain, StackSize);
1914
1915 // Some CCs need callee pop.
1916 if (X86::isCalleePop(CallConv, Is64Bit, IsVarArg,
1918 FuncInfo->setBytesToPopOnReturn(StackSize); // Callee pops everything.
1919 } else if (CallConv == CallingConv::X86_INTR && Ins.size() == 2) {
1920 // X86 interrupts must pop the error code (and the alignment padding) if
1921 // present.
1922 FuncInfo->setBytesToPopOnReturn(Is64Bit ? 16 : 4);
1923 } else {
1924 FuncInfo->setBytesToPopOnReturn(0); // Callee pops nothing.
1925 // If this is an sret function, the return should pop the hidden pointer.
1926 if (hasCalleePopSRet(Ins, ArgLocs, Subtarget))
1927 FuncInfo->setBytesToPopOnReturn(4);
1928 }
1929
1930 if (!Is64Bit) {
1931 // RegSaveFrameIndex is X86-64 only.
1932 FuncInfo->setRegSaveFrameIndex(0xAAAAAAA);
1933 }
1934
1935 FuncInfo->setArgumentStackSize(StackSize);
1936
1937 if (WinEHFuncInfo *EHInfo = MF.getWinEHFuncInfo()) {
1938 EHPersonality Personality = classifyEHPersonality(F.getPersonalityFn());
1939 if (Personality == EHPersonality::CoreCLR) {
1940 assert(Is64Bit);
1941 // TODO: Add a mechanism to frame lowering that will allow us to indicate
1942 // that we'd prefer this slot be allocated towards the bottom of the frame
1943 // (i.e. near the stack pointer after allocating the frame). Every
1944 // funclet needs a copy of this slot in its (mostly empty) frame, and the
1945 // offset from the bottom of this and each funclet's frame must be the
1946 // same, so the size of funclets' (mostly empty) frames is dictated by
1947 // how far this slot is from the bottom (since they allocate just enough
1948 // space to accommodate holding this slot at the correct offset).
1949 int PSPSymFI = MFI.CreateStackObject(8, Align(8), /*isSpillSlot=*/false);
1950 EHInfo->PSPSymFrameIdx = PSPSymFI;
1951 }
1952 }
1953
1954 if (shouldDisableArgRegFromCSR(CallConv) ||
1955 F.hasFnAttribute("no_caller_saved_registers")) {
1956 MachineRegisterInfo &MRI = MF.getRegInfo();
1957 for (std::pair<MCRegister, Register> Pair : MRI.liveins())
1958 MRI.disableCalleeSavedRegister(Pair.first);
1959 }
1960
1961 if (CallingConv::PreserveNone == CallConv)
1962 for (const ISD::InputArg &In : Ins) {
1963 if (In.Flags.isSwiftSelf() || In.Flags.isSwiftAsync() ||
1964 In.Flags.isSwiftError()) {
1965 errorUnsupported(DAG, dl,
1966 "Swift attributes can't be used with preserve_none");
1967 break;
1968 }
1969 }
1970
1971 return Chain;
1972}
1973
1974SDValue X86TargetLowering::LowerMemOpCallTo(SDValue Chain, SDValue StackPtr,
1975 SDValue Arg, const SDLoc &dl,
1976 SelectionDAG &DAG,
1977 const CCValAssign &VA,
1978 ISD::ArgFlagsTy Flags,
1979 bool isByVal) const {
1980 unsigned LocMemOffset = VA.getLocMemOffset();
1981 SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, dl);
1982 PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(DAG.getDataLayout()),
1983 StackPtr, PtrOff);
1984 if (isByVal)
1985 return CreateCopyOfByValArgument(Arg, PtrOff, Chain, Flags, DAG, dl);
1986
1987 MaybeAlign Alignment;
1988 if (Subtarget.isTargetWindowsMSVC() && !Subtarget.is64Bit() &&
1989 Arg.getSimpleValueType() != MVT::f80)
1990 Alignment = MaybeAlign(4);
1991 return DAG.getStore(
1992 Chain, dl, Arg, PtrOff,
1994 Alignment);
1995}
1996
1997/// Emit a load of return address if tail call
1998/// optimization is performed and it is required.
1999SDValue X86TargetLowering::EmitTailCallLoadRetAddr(
2000 SelectionDAG &DAG, SDValue &OutRetAddr, SDValue Chain, bool IsTailCall,
2001 bool Is64Bit, int FPDiff, const SDLoc &dl) const {
2002 // Adjust the Return address stack slot.
2003 EVT VT = getPointerTy(DAG.getDataLayout());
2004 OutRetAddr = getReturnAddressFrameIndex(DAG);
2005
2006 // Load the "old" Return address.
2007 OutRetAddr = DAG.getLoad(VT, dl, Chain, OutRetAddr, MachinePointerInfo());
2008 return SDValue(OutRetAddr.getNode(), 1);
2009}
2010
2011/// Emit a store of the return address if tail call
2012/// optimization is performed and it is required (FPDiff!=0).
2014 SDValue Chain, SDValue RetAddrFrIdx,
2015 EVT PtrVT, unsigned SlotSize,
2016 int FPDiff, const SDLoc &dl) {
2017 // Store the return address to the appropriate stack slot.
2018 if (!FPDiff) return Chain;
2019 // Calculate the new stack slot for the return address.
2020 int NewReturnAddrFI =
2021 MF.getFrameInfo().CreateFixedObject(SlotSize, (int64_t)FPDiff - SlotSize,
2022 false);
2023 SDValue NewRetAddrFrIdx = DAG.getFrameIndex(NewReturnAddrFI, PtrVT);
2024 Chain = DAG.getStore(Chain, dl, RetAddrFrIdx, NewRetAddrFrIdx,
2026 DAG.getMachineFunction(), NewReturnAddrFI));
2027 return Chain;
2028}
2029
2030/// Returns a vector_shuffle mask for an movs{s|d}, movd
2031/// operation of specified width.
2032SDValue X86TargetLowering::getMOVL(SelectionDAG &DAG, const SDLoc &dl, MVT VT,
2033 SDValue V1, SDValue V2) const {
2034 unsigned NumElems = VT.getVectorNumElements();
2035 SmallVector<int, 8> Mask;
2036 Mask.push_back(NumElems);
2037 for (unsigned i = 1; i != NumElems; ++i)
2038 Mask.push_back(i);
2039 return DAG.getVectorShuffle(VT, dl, V1, V2, Mask);
2040}
2041
2042// Returns the type of copying which is required to set up a byval argument to
2043// a tail-called function. This isn't needed for non-tail calls, because they
2044// always need the equivalent of CopyOnce, but tail-calls sometimes need two to
2045// avoid clobbering another argument (CopyViaTemp), and sometimes can be
2046// optimised to zero copies when forwarding an argument from the caller's
2047// caller (NoCopy).
2048X86TargetLowering::ByValCopyKind X86TargetLowering::ByValNeedsCopyForTailCall(
2049 SelectionDAG &DAG, SDValue Src, SDValue Dst, ISD::ArgFlagsTy Flags) const {
2050 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
2051
2052 // Globals are always safe to copy from.
2054 return CopyOnce;
2055
2056 // Can only analyse frame index nodes, conservatively assume we need a
2057 // temporary.
2058 auto *SrcFrameIdxNode = dyn_cast<FrameIndexSDNode>(Src);
2059 auto *DstFrameIdxNode = dyn_cast<FrameIndexSDNode>(Dst);
2060 if (!SrcFrameIdxNode || !DstFrameIdxNode)
2061 return CopyViaTemp;
2062
2063 int SrcFI = SrcFrameIdxNode->getIndex();
2064 int DstFI = DstFrameIdxNode->getIndex();
2065 assert(MFI.isFixedObjectIndex(DstFI) &&
2066 "byval passed in non-fixed stack slot");
2067
2068 int64_t SrcOffset = MFI.getObjectOffset(SrcFI);
2069 int64_t DstOffset = MFI.getObjectOffset(DstFI);
2070
2071 // If the source is in the local frame, then the copy to the argument
2072 // memory is always valid.
2073 bool FixedSrc = MFI.isFixedObjectIndex(SrcFI);
2074 if (!FixedSrc || (FixedSrc && SrcOffset < 0))
2075 return CopyOnce;
2076
2077 // If the value is already in the correct location, then no copying is
2078 // needed. If not, then we need to copy via a temporary.
2079 if (SrcOffset == DstOffset)
2080 return NoCopy;
2081 else
2082 return CopyViaTemp;
2083}
2084
2085SDValue
2086X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
2087 SmallVectorImpl<SDValue> &InVals) const {
2088 SelectionDAG &DAG = CLI.DAG;
2089 SDLoc &dl = CLI.DL;
2090 SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs;
2091 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
2092 SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins;
2093 SDValue Chain = CLI.Chain;
2094 SDValue Callee = CLI.Callee;
2095 CallingConv::ID CallConv = CLI.CallConv;
2096 bool &isTailCall = CLI.IsTailCall;
2097 bool isVarArg = CLI.IsVarArg;
2098 const auto *CB = CLI.CB;
2099
2101 bool Is64Bit = Subtarget.is64Bit();
2102 bool IsWin64 = Subtarget.isCallingConvWin64(CallConv);
2103 bool ShouldGuaranteeTCO = shouldGuaranteeTCO(
2104 CallConv, MF.getTarget().Options.GuaranteedTailCallOpt);
2105 X86MachineFunctionInfo *X86Info = MF.getInfo<X86MachineFunctionInfo>();
2106 bool HasNCSR = (CB && isa<CallInst>(CB) &&
2107 CB->hasFnAttr("no_caller_saved_registers"));
2108 bool IsIndirectCall = (CB && isa<CallInst>(CB) && CB->isIndirectCall());
2109 bool IsCFICall = IsIndirectCall && CLI.CFIType;
2110 const Module *M = MF.getFunction().getParent();
2111
2112 // If the indirect call target has the nocf_check attribute, the call needs
2113 // the NOTRACK prefix. For simplicity just disable tail calls as there are
2114 // so many variants.
2115 // FIXME: This will cause backend errors if the user forces the issue.
2116 bool IsNoTrackIndirectCall = IsIndirectCall && CB->doesNoCfCheck() &&
2117 M->getModuleFlag("cf-protection-branch");
2118 if (IsNoTrackIndirectCall)
2119 isTailCall = false;
2120
2121 MachineFunction::CallSiteInfo CSInfo;
2122 if (CallConv == CallingConv::X86_INTR)
2123 report_fatal_error("X86 interrupts may not be called directly");
2124
2125 // Set type id for call site info.
2126 setTypeIdForCallsiteInfo(CB, MF, CSInfo);
2127
2128 if (IsIndirectCall && !IsWin64 &&
2129 M->getModuleFlag("import-call-optimization"))
2130 errorUnsupported(DAG, dl,
2131 "Indirect calls must have a normal calling convention if "
2132 "Import Call Optimization is enabled");
2133
2134 // Analyze operands of the call, assigning locations to each operand.
2136 CCState CCInfo(CallConv, isVarArg, MF, ArgLocs, *DAG.getContext());
2137
2138 // Allocate shadow area for Win64.
2139 if (IsWin64)
2140 CCInfo.AllocateStack(32, Align(8));
2141
2142 CCInfo.AnalyzeArguments(Outs, CC_X86);
2143
2144 // In vectorcall calling convention a second pass is required for the HVA
2145 // types.
2146 if (CallingConv::X86_VectorCall == CallConv) {
2147 CCInfo.AnalyzeArgumentsSecondPass(Outs, CC_X86);
2148 }
2149
2150 // We cannot guarantee TCO for mismatched calling conventions.
2151 if (isTailCall && ShouldGuaranteeTCO) {
2152 CallingConv::ID CallerCC = MF.getFunction().getCallingConv();
2153 isTailCall = (CallConv == CallerCC);
2154 }
2155
2156 // Check if this tail call is a "sibling" call, which is loosely defined to
2157 // be a tail call that doesn't require heroics like moving the return
2158 // address or swapping byval arguments. We treat some musttail calls as
2159 // sibling calls to avoid unnecessary argument copies.
2160 bool IsMustTail = CLI.CB && CLI.CB->isMustTailCall();
2161 bool IsSibcall = false;
2162 if (isTailCall) {
2163 IsSibcall = isEligibleForSiblingCallOpt(CLI, CCInfo, ArgLocs);
2164 isTailCall = IsSibcall || IsMustTail || ShouldGuaranteeTCO;
2165 }
2166
2167 if (isTailCall)
2168 ++NumTailCalls;
2169
2170 if (IsMustTail && !isTailCall)
2171 report_fatal_error("failed to perform tail call elimination on a call "
2172 "site marked musttail");
2173
2174 assert(!(isVarArg && canGuaranteeTCO(CallConv)) &&
2175 "Var args not supported with calling convention fastcc, ghc or hipe");
2176
2177 // Get a count of how many bytes are to be pushed on the stack.
2178 unsigned NumBytes = CCInfo.getAlignedCallFrameSize();
2179 if (IsSibcall)
2180 // This is a sibcall. The memory operands are available in caller's
2181 // own caller's stack.
2182 NumBytes = 0;
2183 else if (ShouldGuaranteeTCO && canGuaranteeTCO(CallConv))
2184 // The callee pops this amount, so compute it as LowerFormalArguments does.
2185 NumBytes = GetAlignedArgumentStackSize(CCInfo.getStackSize(), DAG);
2186
2187 // A sibcall is ABI-compatible and does not need to adjust the stack pointer.
2188 int FPDiff = 0;
2189 if (isTailCall && ShouldGuaranteeTCO && !IsSibcall) {
2190 // Lower arguments at fp - stackoffset + fpdiff.
2191 unsigned NumBytesCallerPushed = X86Info->getBytesToPopOnReturn();
2192
2193 FPDiff = NumBytesCallerPushed - NumBytes;
2194
2195 // Set the delta of movement of the returnaddr stackslot.
2196 // But only set if delta is greater than previous delta.
2197 if (FPDiff < X86Info->getTCReturnAddrDelta())
2198 X86Info->setTCReturnAddrDelta(FPDiff);
2199 }
2200
2201 unsigned NumBytesToPush = NumBytes;
2202 unsigned NumBytesToPop = NumBytes;
2203
2205 const X86RegisterInfo *RegInfo = Subtarget.getRegisterInfo();
2206
2207 // If we are doing a tail-call, any byval arguments will be written to stack
2208 // space which was used for incoming arguments. If any the values being used
2209 // are incoming byval arguments to this function, then they might be
2210 // overwritten by the stores of the outgoing arguments. To avoid this, we
2211 // need to make a temporary copy of them in local stack space, then copy back
2212 // to the argument area.
2213 // FIXME: There's potential to improve the code by using virtual registers for
2214 // temporary storage, and letting the register allocator spill if needed.
2215 SmallVector<SDValue, 8> ByValTemporaries;
2216 SDValue ByValTempChain;
2217 if (isTailCall) {
2218 // Use null SDValue to mean "no temporary recorded for this arg index".
2219 ByValTemporaries.assign(OutVals.size(), SDValue());
2220
2221 SmallVector<SDValue, 8> ByValCopyChains;
2222 for (const CCValAssign &VA : ArgLocs) {
2223 unsigned ArgIdx = VA.getValNo();
2224 SDValue Src = OutVals[ArgIdx];
2225 ISD::ArgFlagsTy Flags = Outs[ArgIdx].Flags;
2226
2227 if (!Flags.isByVal())
2228 continue;
2229
2230 auto PtrVT = getPointerTy(DAG.getDataLayout());
2231
2232 if (!StackPtr.getNode())
2233 StackPtr =
2234 DAG.getCopyFromReg(Chain, dl, RegInfo->getStackRegister(), PtrVT);
2235
2236 // Destination: where this byval should live in the callee’s frame
2237 // after the tail call.
2238 int64_t Offset = VA.getLocMemOffset() + FPDiff;
2241 /*IsImmutable=*/true);
2242 SDValue Dst = DAG.getFrameIndex(FI, PtrVT);
2243
2244 ByValCopyKind Copy = ByValNeedsCopyForTailCall(DAG, Src, Dst, Flags);
2245
2246 if (Copy == NoCopy) {
2247 // If the argument is already at the correct offset on the stack
2248 // (because we are forwarding a byval argument from our caller), we
2249 // don't need any copying.
2250 continue;
2251 } else if (Copy == CopyOnce) {
2252 // If the argument is in our local stack frame, no other argument
2253 // preparation can clobber it, so we can copy it to the final location
2254 // later.
2255 ByValTemporaries[ArgIdx] = Src;
2256 } else {
2257 assert(Copy == CopyViaTemp && "unexpected enum value");
2258 // If we might be copying this argument from the outgoing argument
2259 // stack area, we need to copy via a temporary in the local stack
2260 // frame.
2261 MachineFrameInfo &MFI = MF.getFrameInfo();
2262 int TempFrameIdx = MFI.CreateStackObject(Flags.getByValSize(),
2263 Flags.getNonZeroByValAlign(),
2264 /*isSS=*/false);
2265 SDValue Temp =
2266 DAG.getFrameIndex(TempFrameIdx, getPointerTy(DAG.getDataLayout()));
2267
2268 SDValue CopyChain =
2269 CreateCopyOfByValArgument(Src, Temp, Chain, Flags, DAG, dl);
2270 ByValCopyChains.push_back(CopyChain);
2271 ByValTemporaries[ArgIdx] = Temp;
2272 }
2273 }
2274 if (!ByValCopyChains.empty())
2275 ByValTempChain =
2276 DAG.getNode(ISD::TokenFactor, dl, MVT::Other, ByValCopyChains);
2277 }
2278
2279 // If we have an inalloca argument, all stack space has already been allocated
2280 // for us and be right at the top of the stack. We don't support multiple
2281 // arguments passed in memory when using inalloca.
2282 if (!Outs.empty() && Outs.back().Flags.isInAlloca()) {
2283 NumBytesToPush = 0;
2284 if (!ArgLocs.back().isMemLoc())
2285 report_fatal_error("cannot use inalloca attribute on a register "
2286 "parameter");
2287 if (ArgLocs.back().getLocMemOffset() != 0)
2288 report_fatal_error("any parameter with the inalloca attribute must be "
2289 "the only memory argument");
2290 } else if (CLI.IsPreallocated) {
2291 assert(ArgLocs.back().isMemLoc() &&
2292 "cannot use preallocated attribute on a register "
2293 "parameter");
2294 SmallVector<size_t, 4> PreallocatedOffsets;
2295 for (size_t i = 0; i < CLI.OutVals.size(); ++i) {
2296 if (CLI.CB->paramHasAttr(i, Attribute::Preallocated)) {
2297 PreallocatedOffsets.push_back(ArgLocs[i].getLocMemOffset());
2298 }
2299 }
2300 auto *MFI = DAG.getMachineFunction().getInfo<X86MachineFunctionInfo>();
2301 size_t PreallocatedId = MFI->getPreallocatedIdForCallSite(CLI.CB);
2302 MFI->setPreallocatedStackSize(PreallocatedId, NumBytes);
2303 MFI->setPreallocatedArgOffsets(PreallocatedId, PreallocatedOffsets);
2304 NumBytesToPush = 0;
2305 }
2306
2307 if (!IsSibcall && !IsMustTail)
2308 Chain = DAG.getCALLSEQ_START(Chain, NumBytesToPush,
2309 NumBytes - NumBytesToPush, dl);
2310
2311 SDValue RetAddrFrIdx;
2312 // Load return address for tail calls.
2313 if (isTailCall && FPDiff)
2314 Chain = EmitTailCallLoadRetAddr(DAG, RetAddrFrIdx, Chain, isTailCall,
2315 Is64Bit, FPDiff, dl);
2316
2318 SmallVector<SDValue, 8> MemOpChains;
2319
2320 // The next loop assumes that the locations are in the same order of the
2321 // input arguments.
2322 assert(isSortedByValueNo(ArgLocs) &&
2323 "Argument Location list must be sorted before lowering");
2324
2325 // Walk the register/memloc assignments, inserting copies/loads. In the case
2326 // of tail call optimization arguments are handle later.
2327 for (unsigned I = 0, OutIndex = 0, E = ArgLocs.size(); I != E;
2328 ++I, ++OutIndex) {
2329 assert(OutIndex < Outs.size() && "Invalid Out index");
2330 // Skip inalloca/preallocated arguments, they have already been written.
2331 ISD::ArgFlagsTy Flags = Outs[OutIndex].Flags;
2332 if (Flags.isInAlloca() || Flags.isPreallocated())
2333 continue;
2334
2335 CCValAssign &VA = ArgLocs[I];
2336 EVT RegVT = VA.getLocVT();
2337 SDValue Arg = OutVals[OutIndex];
2338 bool isByVal = Flags.isByVal();
2339
2340 // Promote the value if needed.
2341 switch (VA.getLocInfo()) {
2342 default: llvm_unreachable("Unknown loc info!");
2343 case CCValAssign::Full: break;
2344 case CCValAssign::SExt:
2345 Arg = DAG.getNode(ISD::SIGN_EXTEND, dl, RegVT, Arg);
2346 break;
2347 case CCValAssign::ZExt:
2348 Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, RegVT, Arg);
2349 break;
2350 case CCValAssign::AExt:
2351 if (Arg.getValueType().isVector() &&
2352 Arg.getValueType().getVectorElementType() == MVT::i1)
2353 Arg = lowerMasksToReg(Arg, RegVT, dl, DAG);
2354 else if (RegVT.is128BitVector()) {
2355 // Special case: passing MMX values in XMM registers.
2356 Arg = DAG.getBitcast(MVT::i64, Arg);
2357 Arg = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i64, Arg);
2358 Arg = getMOVL(DAG, dl, MVT::v2i64, DAG.getUNDEF(MVT::v2i64), Arg);
2359 } else
2360 Arg = DAG.getNode(ISD::ANY_EXTEND, dl, RegVT, Arg);
2361 break;
2362 case CCValAssign::BCvt:
2363 Arg = DAG.getBitcast(RegVT, Arg);
2364 break;
2365 case CCValAssign::Indirect: {
2366 if (isByVal) {
2367 // Memcpy the argument to a temporary stack slot to prevent
2368 // the caller from seeing any modifications the callee may make
2369 // as guaranteed by the `byval` attribute.
2370 int FrameIdx = MF.getFrameInfo().CreateStackObject(
2371 Flags.getByValSize(),
2372 std::max(Align(16), Flags.getNonZeroByValAlign()), false);
2373 SDValue StackSlot =
2374 DAG.getFrameIndex(FrameIdx, getPointerTy(DAG.getDataLayout()));
2375 Chain =
2376 CreateCopyOfByValArgument(Arg, StackSlot, Chain, Flags, DAG, dl);
2377 // From now on treat this as a regular pointer
2378 Arg = StackSlot;
2379 isByVal = false;
2380 } else {
2381 // Store the argument.
2382 SDValue SpillSlot = DAG.CreateStackTemporary(VA.getValVT());
2383 int FI = cast<FrameIndexSDNode>(SpillSlot)->getIndex();
2384 Chain = DAG.getStore(
2385 Chain, dl, Arg, SpillSlot,
2387 Arg = SpillSlot;
2388 }
2389 break;
2390 }
2391 }
2392
2393 if (VA.needsCustom()) {
2394 assert(VA.getValVT() == MVT::v64i1 &&
2395 "Currently the only custom case is when we split v64i1 to 2 regs");
2396 // Split v64i1 value into two registers
2397 Passv64i1ArgInRegs(dl, DAG, Arg, RegsToPass, VA, ArgLocs[++I], Subtarget);
2398 } else if (VA.isRegLoc()) {
2399 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
2400 const TargetOptions &Options = DAG.getTarget().Options;
2401 if (Options.EmitCallSiteInfo)
2402 CSInfo.ArgRegPairs.emplace_back(VA.getLocReg(), I);
2403 if (isVarArg && IsWin64) {
2404 // Win64 ABI requires argument XMM reg to be copied to the corresponding
2405 // shadow reg if callee is a varargs function.
2406 Register ShadowReg;
2407 switch (VA.getLocReg()) {
2408 case X86::XMM0: ShadowReg = X86::RCX; break;
2409 case X86::XMM1: ShadowReg = X86::RDX; break;
2410 case X86::XMM2: ShadowReg = X86::R8; break;
2411 case X86::XMM3: ShadowReg = X86::R9; break;
2412 }
2413 if (ShadowReg)
2414 RegsToPass.push_back(std::make_pair(ShadowReg, Arg));
2415 }
2416 } else if (!IsSibcall && (!isTailCall || (isByVal && !IsMustTail))) {
2417 assert(VA.isMemLoc());
2418 if (!StackPtr.getNode())
2419 StackPtr = DAG.getCopyFromReg(Chain, dl, RegInfo->getStackRegister(),
2421 MemOpChains.push_back(LowerMemOpCallTo(Chain, StackPtr, Arg,
2422 dl, DAG, VA, Flags, isByVal));
2423 }
2424 }
2425
2426 if (!MemOpChains.empty())
2427 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, MemOpChains);
2428
2429 if (Subtarget.isPICStyleGOT()) {
2430 // ELF / PIC requires GOT in the EBX register before function calls via PLT
2431 // GOT pointer.
2432 if (!isTailCall) {
2433 // Only PLT calls (GlobalAddress or ExternalSymbol) require the GOT in
2434 // EBX. Indirect calls through a register or an absolute address do not
2435 // go through the PLT and do not need EBX to hold the GOT base.
2436 if ((Callee->getOpcode() == ISD::GlobalAddress ||
2437 Callee->getOpcode() == ISD::ExternalSymbol))
2438 RegsToPass.push_back(std::make_pair(
2439 Register(X86::EBX), DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(),
2440 getPointerTy(DAG.getDataLayout()))));
2441 } else {
2442 // If we are tail calling and generating PIC/GOT style code load the
2443 // address of the callee into ECX. The value in ecx is used as target of
2444 // the tail jump. This is done to circumvent the ebx/callee-saved problem
2445 // for tail calls on PIC/GOT architectures. Normally we would just put the
2446 // address of GOT into ebx and then call target@PLT. But for tail calls
2447 // ebx would be restored (since ebx is callee saved) before jumping to the
2448 // target@PLT.
2449
2450 // Note: The actual moving to ECX is done further down.
2451 GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
2452 if (G && !G->getGlobal()->hasLocalLinkage() &&
2453 G->getGlobal()->hasDefaultVisibility())
2454 Callee = LowerGlobalAddress(Callee, DAG);
2455 else if (isa<ExternalSymbolSDNode>(Callee))
2456 Callee = LowerExternalSymbol(Callee, DAG);
2457 }
2458 }
2459
2460 if (Is64Bit && isVarArg && !IsWin64 && !IsMustTail &&
2461 (Subtarget.hasSSE1() || !M->getModuleFlag("SkipRaxSetup"))) {
2462 // From AMD64 ABI document:
2463 // For calls that may call functions that use varargs or stdargs
2464 // (prototype-less calls or calls to functions containing ellipsis (...) in
2465 // the declaration) %al is used as hidden argument to specify the number
2466 // of SSE registers used. The contents of %al do not need to match exactly
2467 // the number of registers, but must be an ubound on the number of SSE
2468 // registers used and is in the range 0 - 8 inclusive.
2469
2470 // Count the number of XMM registers allocated.
2471 static const MCPhysReg XMMArgRegs[] = {
2472 X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
2473 X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
2474 };
2475 unsigned NumXMMRegs = CCInfo.getFirstUnallocated(XMMArgRegs);
2476 assert((Subtarget.hasSSE1() || !NumXMMRegs)
2477 && "SSE registers cannot be used when SSE is disabled");
2478 RegsToPass.push_back(std::make_pair(Register(X86::AL),
2479 DAG.getConstant(NumXMMRegs, dl,
2480 MVT::i8)));
2481 }
2482
2483 if (isVarArg && IsMustTail) {
2484 const auto &Forwards = X86Info->getForwardedMustTailRegParms();
2485 for (const auto &F : Forwards) {
2486 SDValue Val = DAG.getCopyFromReg(Chain, dl, F.VReg, F.VT);
2487 RegsToPass.push_back(std::make_pair(F.PReg, Val));
2488 }
2489 }
2490
2491 // For tail calls lower the arguments to the 'real' stack slots. Sibcalls
2492 // don't need this because the eligibility check rejects calls that require
2493 // shuffling arguments passed in memory.
2494 if (isTailCall && !IsSibcall) {
2495 // Force all the incoming stack arguments to be loaded from the stack
2496 // before any new outgoing arguments or the return address are stored to the
2497 // stack, because the outgoing stack slots may alias the incoming argument
2498 // stack slots, and the alias isn't otherwise explicit. This is slightly
2499 // more conservative than necessary, because it means that each store
2500 // effectively depends on every argument instead of just those arguments it
2501 // would clobber.
2502 Chain = DAG.getStackArgumentTokenFactor(Chain);
2503
2504 if (ByValTempChain)
2505 Chain =
2506 DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chain, ByValTempChain);
2507
2508 SmallVector<SDValue, 8> MemOpChains2;
2509 SDValue FIN;
2510 int FI = 0;
2511 for (unsigned I = 0, OutsIndex = 0, E = ArgLocs.size(); I != E;
2512 ++I, ++OutsIndex) {
2513 CCValAssign &VA = ArgLocs[I];
2514
2515 if (VA.isRegLoc()) {
2516 if (VA.needsCustom()) {
2517 assert((CallConv == CallingConv::X86_RegCall) &&
2518 "Expecting custom case only in regcall calling convention");
2519 // This means that we are in special case where one argument was
2520 // passed through two register locations - Skip the next location
2521 ++I;
2522 }
2523
2524 continue;
2525 }
2526
2527 assert(VA.isMemLoc());
2528 SDValue Arg = OutVals[OutsIndex];
2529 ISD::ArgFlagsTy Flags = Outs[OutsIndex].Flags;
2530 // Skip inalloca/preallocated arguments. They don't require any work.
2531 if (Flags.isInAlloca() || Flags.isPreallocated())
2532 continue;
2533 // Create frame index.
2534 int32_t Offset = VA.getLocMemOffset()+FPDiff;
2535 uint32_t OpSize = (VA.getLocVT().getSizeInBits()+7)/8;
2536 FI = MF.getFrameInfo().CreateFixedObject(OpSize, Offset, true);
2537 FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
2538
2539 if (Flags.isByVal()) {
2540 if (SDValue ByValSrc = ByValTemporaries[OutsIndex]) {
2541 auto PtrVT = getPointerTy(DAG.getDataLayout());
2542 SDValue DstAddr = DAG.getFrameIndex(FI, PtrVT);
2543
2545 ByValSrc, DstAddr, Chain, Flags, DAG, dl));
2546 }
2547 } else {
2548 // Store relative to framepointer.
2549 MemOpChains2.push_back(DAG.getStore(
2550 Chain, dl, Arg, FIN,
2552 }
2553 }
2554
2555 if (!MemOpChains2.empty())
2556 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, MemOpChains2);
2557
2558 // Store the return address to the appropriate stack slot.
2559 Chain = EmitTailCallStoreRetAddr(DAG, MF, Chain, RetAddrFrIdx,
2561 RegInfo->getSlotSize(), FPDiff, dl);
2562 }
2563
2564 // Build a sequence of copy-to-reg nodes chained together with token chain
2565 // and glue operands which copy the outgoing args into registers.
2566 SDValue InGlue;
2567 for (const auto &[Reg, N] : RegsToPass) {
2568 Chain = DAG.getCopyToReg(Chain, dl, Reg, N, InGlue);
2569 InGlue = Chain.getValue(1);
2570 }
2571
2572 bool IsImpCall = false;
2573 bool IsCFGuardCall = false;
2574 if (DAG.getTarget().getCodeModel() == CodeModel::Large) {
2575 assert(Is64Bit && "Large code model is only legal in 64-bit mode.");
2576 // In the 64-bit large code model, we have to make all calls
2577 // through a register, since the call instruction's 32-bit
2578 // pc-relative offset may not be large enough to hold the whole
2579 // address.
2580 } else if (Callee->getOpcode() == ISD::GlobalAddress ||
2581 Callee->getOpcode() == ISD::ExternalSymbol) {
2582 // Lower direct calls to global addresses and external symbols. Setting
2583 // ForCall to true here has the effect of removing WrapperRIP when possible
2584 // to allow direct calls to be selected without first materializing the
2585 // address into a register.
2586 Callee = LowerGlobalOrExternal(Callee, DAG, /*ForCall=*/true, &IsImpCall);
2587 } else if (Subtarget.isTarget64BitILP32() &&
2588 Callee.getValueType() == MVT::i32) {
2589 // Zero-extend the 32-bit Callee address into a 64-bit according to x32 ABI
2590 Callee = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i64, Callee);
2591 } else if (Is64Bit && CB && isCFGuardCall(CB)) {
2592 // We'll use a specific psuedo instruction for tail calls to control flow
2593 // guard functions to guarantee the instruction used for the call. To do
2594 // this we need to unwrap the load now and use the CFG Func GV as the
2595 // callee.
2596 IsCFGuardCall = true;
2597 auto *LoadNode = cast<LoadSDNode>(Callee);
2598 GlobalAddressSDNode *GA =
2599 cast<GlobalAddressSDNode>(unwrapAddress(LoadNode->getBasePtr()));
2601 "CFG Call should be to a guard function");
2602 assert(LoadNode->getOffset()->isUndef() &&
2603 "CFG Function load should not have an offset");
2605 GA->getGlobal(), dl, GA->getValueType(0), 0, X86II::MO_NO_FLAG);
2606 }
2607
2608 if (Is64Bit && !Subtarget.isTarget64BitILP32() &&
2609 Callee.getValueType() == MVT::i32) {
2610 // On 64-bit targets, extend 32-bit MS __ptr32 callees before the call.
2611 // Use sign-extension for __sptr and zero-extension for __uptr.
2612 assert(CB && "CallBase expected for 32-bit callee");
2614 unsigned AS = CB->getCalledOperand()->getType()->getPointerAddressSpace();
2615 if (AS == X86AS::PTR32_UPTR)
2616 ExtOpc = ISD::ZERO_EXTEND;
2617 Callee = DAG.getNode(ExtOpc, dl, MVT::i64, Callee);
2618 }
2619
2621
2622 if (!IsSibcall && isTailCall && !IsMustTail) {
2623 Chain = DAG.getCALLSEQ_END(Chain, NumBytesToPop, 0, InGlue, dl);
2624 InGlue = Chain.getValue(1);
2625 }
2626
2627 Ops.push_back(Chain);
2628 Ops.push_back(Callee);
2629
2630 if (isTailCall)
2631 Ops.push_back(DAG.getSignedTargetConstant(FPDiff, dl, MVT::i32));
2632
2633 // Add argument registers to the end of the list so that they are known live
2634 // into the call.
2635 for (const auto &[Reg, N] : RegsToPass)
2636 Ops.push_back(DAG.getRegister(Reg, N.getValueType()));
2637
2638 // Add a register mask operand representing the call-preserved registers.
2639 const uint32_t *Mask = [&]() {
2640 auto AdaptedCC = CallConv;
2641 // If HasNCSR is asserted (attribute NoCallerSavedRegisters exists),
2642 // use X86_INTR calling convention because it has the same CSR mask
2643 // (same preserved registers).
2644 if (HasNCSR)
2646 // If NoCalleeSavedRegisters is requested, than use GHC since it happens
2647 // to use the CSR_NoRegs_RegMask.
2648 if (CB && CB->hasFnAttr("no_callee_saved_registers"))
2649 AdaptedCC = (CallingConv::ID)CallingConv::GHC;
2650 return RegInfo->getCallPreservedMask(MF, AdaptedCC);
2651 }();
2652 assert(Mask && "Missing call preserved mask for calling convention");
2653
2654 if (MachineOperand::clobbersPhysReg(Mask, RegInfo->getFramePtr())) {
2655 X86Info->setFPClobberedByCall(true);
2656 if (CLI.CB && isa<InvokeInst>(CLI.CB))
2657 X86Info->setFPClobberedByInvoke(true);
2658 }
2659 if (MachineOperand::clobbersPhysReg(Mask, RegInfo->getBaseRegister())) {
2660 X86Info->setBPClobberedByCall(true);
2661 if (CLI.CB && isa<InvokeInst>(CLI.CB))
2662 X86Info->setBPClobberedByInvoke(true);
2663 }
2664
2665 // If this is an invoke in a 32-bit function using a funclet-based
2666 // personality, assume the function clobbers all registers. If an exception
2667 // is thrown, the runtime will not restore CSRs.
2668 // FIXME: Model this more precisely so that we can register allocate across
2669 // the normal edge and spill and fill across the exceptional edge.
2670 if (!Is64Bit && CLI.CB && isa<InvokeInst>(CLI.CB)) {
2671 const Function &CallerFn = MF.getFunction();
2672 EHPersonality Pers =
2673 CallerFn.hasPersonalityFn()
2676 if (isFuncletEHPersonality(Pers))
2677 Mask = RegInfo->getNoPreservedMask();
2678 }
2679
2680 // Define a new register mask from the existing mask.
2681 uint32_t *RegMask = nullptr;
2682
2683 // In some calling conventions we need to remove the used physical registers
2684 // from the reg mask. Create a new RegMask for such calling conventions.
2685 // RegMask for calling conventions that disable only return registers (e.g.
2686 // preserve_most) will be modified later in LowerCallResult.
2687 bool ShouldDisableArgRegs = shouldDisableArgRegFromCSR(CallConv) || HasNCSR;
2688 if (ShouldDisableArgRegs || shouldDisableRetRegFromCSR(CallConv)) {
2689 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
2690
2691 // Allocate a new Reg Mask and copy Mask.
2692 RegMask = MF.allocateRegMask();
2693 unsigned RegMaskSize = MachineOperand::getRegMaskSize(TRI->getNumRegs());
2694 memcpy(RegMask, Mask, sizeof(RegMask[0]) * RegMaskSize);
2695
2696 // Make sure all sub registers of the argument registers are reset
2697 // in the RegMask.
2698 if (ShouldDisableArgRegs) {
2699 for (auto const &RegPair : RegsToPass)
2700 for (MCPhysReg SubReg : TRI->subregs_inclusive(RegPair.first))
2701 RegMask[SubReg / 32] &= ~(1u << (SubReg % 32));
2702 }
2703
2704 // Create the RegMask Operand according to our updated mask.
2705 Ops.push_back(DAG.getRegisterMask(RegMask));
2706 } else {
2707 // Create the RegMask Operand according to the static mask.
2708 Ops.push_back(DAG.getRegisterMask(Mask));
2709 }
2710
2711 if (InGlue.getNode())
2712 Ops.push_back(InGlue);
2713
2714 if (isTailCall) {
2715 // We used to do:
2716 //// If this is the first return lowered for this function, add the regs
2717 //// to the liveout set for the function.
2718 // This isn't right, although it's probably harmless on x86; liveouts
2719 // should be computed from returns not tail calls. Consider a void
2720 // function making a tail call to a function returning int.
2722 auto Opcode =
2723 IsCFGuardCall ? X86ISD::TC_RETURN_GLOBALADDR : X86ISD::TC_RETURN;
2724 SDValue Ret = DAG.getNode(Opcode, dl, MVT::Other, Ops);
2725
2726 if (IsCFICall)
2727 Ret.getNode()->setCFIType(CLI.CFIType->getZExtValue());
2728
2729 DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
2730 DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
2731 return Ret;
2732 }
2733
2734 // Returns a chain & a glue for retval copy to use.
2735 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
2736 if (IsImpCall) {
2737 Chain = DAG.getNode(X86ISD::IMP_CALL, dl, NodeTys, Ops);
2738 } else if (IsNoTrackIndirectCall) {
2739 Chain = DAG.getNode(X86ISD::NT_CALL, dl, NodeTys, Ops);
2740 } else if (IsCFGuardCall) {
2741 Chain = DAG.getNode(X86ISD::CALL_GLOBALADDR, dl, NodeTys, Ops);
2742 } else if (CLI.CB && objcarc::hasAttachedCallOpBundle(CLI.CB)) {
2743 // Calls with a "clang.arc.attachedcall" bundle are special. They should be
2744 // expanded to the call, directly followed by a special marker sequence and
2745 // a call to a ObjC library function. Use the CALL_RVMARKER to do that.
2746 assert(!isTailCall &&
2747 "tail calls cannot be marked with clang.arc.attachedcall");
2748 assert(Is64Bit && "clang.arc.attachedcall is only supported in 64bit mode");
2749
2750 // Add a target global address for the retainRV/claimRV runtime function
2751 // just before the call target.
2753 auto PtrVT = getPointerTy(DAG.getDataLayout());
2754 auto GA = DAG.getTargetGlobalAddress(ARCFn, dl, PtrVT);
2755 Ops.insert(Ops.begin() + 1, GA);
2756 Chain = DAG.getNode(X86ISD::CALL_RVMARKER, dl, NodeTys, Ops);
2757 } else {
2758 Chain = DAG.getNode(X86ISD::CALL, dl, NodeTys, Ops);
2759 }
2760
2761 if (IsCFICall)
2762 Chain.getNode()->setCFIType(CLI.CFIType->getZExtValue());
2763
2764 InGlue = Chain.getValue(1);
2765 DAG.addNoMergeSiteInfo(Chain.getNode(), CLI.NoMerge);
2766 DAG.addCallSiteInfo(Chain.getNode(), std::move(CSInfo));
2767
2768 // Save heapallocsite metadata.
2769 if (CLI.CB)
2770 if (MDNode *HeapAlloc = CLI.CB->getMetadata("heapallocsite"))
2771 DAG.addHeapAllocSite(Chain.getNode(), HeapAlloc);
2772
2773 // Create the CALLSEQ_END node.
2774 unsigned NumBytesForCalleeToPop = 0; // Callee pops nothing.
2775 if (X86::isCalleePop(CallConv, Is64Bit, isVarArg,
2777 NumBytesForCalleeToPop = NumBytes; // Callee pops everything
2778 } else if (hasCalleePopSRet(Outs, ArgLocs, Subtarget)) {
2779 // If this call passes a struct-return pointer, the callee
2780 // pops that struct pointer.
2781 NumBytesForCalleeToPop = 4;
2782 }
2783
2784 // Returns a glue for retval copy to use.
2785 if (!IsSibcall) {
2786 Chain = DAG.getCALLSEQ_END(Chain, NumBytesToPop, NumBytesForCalleeToPop,
2787 InGlue, dl);
2788 InGlue = Chain.getValue(1);
2789 }
2790
2791 if (CallingConv::PreserveNone == CallConv)
2792 for (const ISD::OutputArg &Out : Outs) {
2793 if (Out.Flags.isSwiftSelf() || Out.Flags.isSwiftAsync() ||
2794 Out.Flags.isSwiftError()) {
2795 errorUnsupported(DAG, dl,
2796 "Swift attributes can't be used with preserve_none");
2797 break;
2798 }
2799 }
2800
2801 // Handle result values, copying them out of physregs into vregs that we
2802 // return.
2803 return LowerCallResult(Chain, InGlue, CallConv, isVarArg, Ins, dl, DAG,
2804 InVals, RegMask);
2805}
2806
2807//===----------------------------------------------------------------------===//
2808// Fast Calling Convention (tail call) implementation
2809//===----------------------------------------------------------------------===//
2810
2811// Like std call, callee cleans arguments, convention except that ECX is
2812// reserved for storing the tail called function address. Only 2 registers are
2813// free for argument passing (inreg). Tail call optimization is performed
2814// provided:
2815// * tailcallopt is enabled
2816// * caller/callee are fastcc
2817// On X86_64 architecture with GOT-style position independent code only local
2818// (within module) calls are supported at the moment.
2819// To keep the stack aligned according to platform abi the function
2820// GetAlignedArgumentStackSize ensures that argument delta is always multiples
2821// of stack alignment. (Dynamic linkers need this - Darwin's dyld for example)
2822// If a tail called function callee has more arguments than the caller the
2823// caller needs to make sure that there is room to move the RETADDR to. This is
2824// achieved by reserving an area the size of the argument delta right after the
2825// original RETADDR, but before the saved framepointer or the spilled registers
2826// e.g. caller(arg1, arg2) calls callee(arg1, arg2,arg3,arg4)
2827// stack layout:
2828// arg1
2829// arg2
2830// RETADDR
2831// [ new RETADDR
2832// move area ]
2833// (possible EBP)
2834// ESI
2835// EDI
2836// local1 ..
2837
2838/// Make the stack size align e.g 16n + 12 aligned for a 16-byte align
2839/// requirement.
2840unsigned
2841X86TargetLowering::GetAlignedArgumentStackSize(const unsigned StackSize,
2842 SelectionDAG &DAG) const {
2843 const Align StackAlignment = Subtarget.getFrameLowering()->getStackAlign();
2844 const uint64_t SlotSize = Subtarget.getRegisterInfo()->getSlotSize();
2845 assert(StackSize % SlotSize == 0 &&
2846 "StackSize must be a multiple of SlotSize");
2847 return alignTo(StackSize + SlotSize, StackAlignment) - SlotSize;
2848}
2849
2850/// Return true if the given stack call argument is already available in the
2851/// same position (relatively) of the caller's incoming argument stack.
2852static
2855 const X86InstrInfo *TII, const CCValAssign &VA) {
2856 unsigned Bytes = Arg.getValueSizeInBits() / 8;
2857
2858 for (;;) {
2859 // Look through nodes that don't alter the bits of the incoming value.
2860 unsigned Op = Arg.getOpcode();
2861 if (Op == ISD::ZERO_EXTEND || Op == ISD::ANY_EXTEND || Op == ISD::BITCAST ||
2862 Op == ISD::AssertZext) {
2863 Arg = Arg.getOperand(0);
2864 continue;
2865 }
2866 if (Op == ISD::TRUNCATE) {
2867 const SDValue &TruncInput = Arg.getOperand(0);
2868 if (TruncInput.getOpcode() == ISD::AssertZext &&
2869 cast<VTSDNode>(TruncInput.getOperand(1))->getVT() ==
2870 Arg.getValueType()) {
2871 Arg = TruncInput.getOperand(0);
2872 continue;
2873 }
2874 }
2875 break;
2876 }
2877
2878 int FI = INT_MAX;
2879 if (Arg.getOpcode() == ISD::CopyFromReg) {
2880 Register VR = cast<RegisterSDNode>(Arg.getOperand(1))->getReg();
2881 if (!VR.isVirtual())
2882 return false;
2883 MachineInstr *Def = MRI->getVRegDef(VR);
2884 if (!Def)
2885 return false;
2886 if (!Flags.isByVal()) {
2887 if (!TII->isLoadFromStackSlot(*Def, FI))
2888 return false;
2889 } else {
2890 unsigned Opcode = Def->getOpcode();
2891 if ((Opcode == X86::LEA32r || Opcode == X86::LEA64r ||
2892 Opcode == X86::LEA64_32r) &&
2893 Def->getOperand(1).isFI()) {
2894 FI = Def->getOperand(1).getIndex();
2895 Bytes = Flags.getByValSize();
2896 } else
2897 return false;
2898 }
2899 } else if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(Arg)) {
2900 if (Flags.isByVal())
2901 // ByVal argument is passed in as a pointer but it's now being
2902 // dereferenced. e.g.
2903 // define @foo(%struct.X* %A) {
2904 // tail call @bar(%struct.X* byval %A)
2905 // }
2906 return false;
2907 SDValue Ptr = Ld->getBasePtr();
2909 if (!FINode)
2910 return false;
2911 FI = FINode->getIndex();
2912 } else if (Arg.getOpcode() == ISD::FrameIndex && Flags.isByVal()) {
2914 FI = FINode->getIndex();
2915 Bytes = Flags.getByValSize();
2916 } else
2917 return false;
2918
2919 assert(FI != INT_MAX);
2920 if (!MFI.isFixedObjectIndex(FI))
2921 return false;
2922
2923 if (Offset != MFI.getObjectOffset(FI))
2924 return false;
2925
2926 // If this is not byval, check that the argument stack object is immutable.
2927 // inalloca and argument copy elision can create mutable argument stack
2928 // objects. Byval objects can be mutated, but a byval call intends to pass the
2929 // mutated memory.
2930 if (!Flags.isByVal() && !MFI.isImmutableObjectIndex(FI))
2931 return false;
2932
2933 if (VA.getLocVT().getFixedSizeInBits() >
2935 // If the argument location is wider than the argument type, check that any
2936 // extension flags match.
2937 if (Flags.isZExt() != MFI.isObjectZExt(FI) ||
2938 Flags.isSExt() != MFI.isObjectSExt(FI)) {
2939 return false;
2940 }
2941 }
2942
2943 return Bytes == MFI.getObjectSize(FI);
2944}
2945
2946/// Return true if the call forwards the caller's own sret pointer to the callee
2947/// as its sret argument. We prove this in IR, since SelectionDAG is built per
2948/// basic block and the caller's sret pointer is only visible as a function
2949/// argument in the entry block.
2950static bool isCallerSRetForwarded(const CallBase *CB, const Function &CallerF) {
2951 if (!CB)
2952 return false;
2953
2954 // The verifier allows at most one sret parameter. A caller with a sret return
2955 // register but no sret Argument has an implicit sret from a demoted return,
2956 // which cannot be forwarded from IR.
2957 const Argument *CallerSRet =
2958 llvm::find_if(CallerF.args(),
2959 [](const Argument &Arg) { return Arg.hasStructRetAttr(); });
2960 if (CallerSRet == CallerF.arg_end())
2961 return false;
2962
2963 // Check that the callee receives it as its sret argument.
2964 for (const Use &U : CB->args())
2965 if (U.get() == CallerSRet &&
2966 CB->paramHasAttr(CB->getArgOperandNo(&U), Attribute::StructRet))
2967 return true;
2968 return false;
2969}
2970
2971/// Check whether the call is eligible for sibling call optimization. Sibling
2972/// calls are loosely defined to be simple, profitable tail calls that only
2973/// require adjusting register parameters. We do not speculatively to optimize
2974/// complex calls that require lots of argument memory operations that may
2975/// alias.
2976///
2977/// Note that LLVM supports multiple ways, such as musttail, to force tail call
2978/// emission. Returning false from this function will not prevent tail call
2979/// emission in all cases.
2980bool X86TargetLowering::isEligibleForSiblingCallOpt(
2982 SmallVectorImpl<CCValAssign> &ArgLocs) const {
2983 SelectionDAG &DAG = CLI.DAG;
2984 const SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs;
2985 const SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
2986 const SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins;
2987 SDValue Callee = CLI.Callee;
2988 CallingConv::ID CalleeCC = CLI.CallConv;
2989 bool isVarArg = CLI.IsVarArg;
2990
2991 if (!mayTailCallThisCC(CalleeCC))
2992 return false;
2993
2994 // If -tailcallopt is specified, make fastcc functions tail-callable.
2996 X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
2997 const Function &CallerF = MF.getFunction();
2998
2999 // If the function return type is x86_fp80 and the callee return type is not,
3000 // then the FP_EXTEND of the call result is not a nop. It's not safe to
3001 // perform a tailcall optimization here.
3002 if (CallerF.getReturnType()->isX86_FP80Ty() && !CLI.RetTy->isX86_FP80Ty())
3003 return false;
3004
3005 // Win64 functions have extra shadow space for argument homing. Don't do the
3006 // sibcall if the caller and callee have mismatched expectations for this
3007 // space.
3008 CallingConv::ID CallerCC = CallerF.getCallingConv();
3009 bool IsCalleeWin64 = Subtarget.isCallingConvWin64(CalleeCC);
3010 bool IsCallerWin64 = Subtarget.isCallingConvWin64(CallerCC);
3011 if (IsCalleeWin64 != IsCallerWin64)
3012 return false;
3013
3014 // Do not optimize vararg calls with 6 arguments for LFI since LFI reserves
3015 // %r11, meaning there will not be enough registers available.
3016 if (Subtarget.isLFI() && ArgLocs.size() > 5)
3017 return false;
3018
3019 // If we are using a GOT, don't generate sibling calls to non-local,
3020 // default-visibility symbols. Tail calling such a symbol requires using a GOT
3021 // relocation, which forces early binding of the symbol. This breaks code that
3022 // require lazy function symbol resolution. Using musttail or
3023 // GuaranteedTailCallOpt will override this.
3024 if (Subtarget.isPICStyleGOT()) {
3025 if (isa<ExternalSymbolSDNode>(Callee))
3026 return false;
3027 if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
3028 if (!G->getGlobal()->hasLocalLinkage() &&
3029 G->getGlobal()->hasDefaultVisibility())
3030 return false;
3031 }
3032 }
3033
3034 // Look for obvious safe cases to perform tail call optimization that do not
3035 // require ABI changes. This is what gcc calls sibcall.
3036
3037 // Can't do sibcall if stack needs to be dynamically re-aligned. PEI needs to
3038 // emit a special epilogue.
3039 const X86RegisterInfo *RegInfo = Subtarget.getRegisterInfo();
3040 if (RegInfo->hasStackRealignment(MF))
3041 return false;
3042
3043 // Avoid sibcall optimization if we are an sret return function and the callee
3044 // is incompatible, unless such premises are proven wrong. See comment in
3045 // LowerReturn about why hasStructRetAttr is insufficient.
3046 if (FuncInfo->getSRetReturnReg()) {
3047 // For a compatible tail call the callee must return our sret pointer. So it
3048 // needs to be (a) an sret function itself and (b) we pass our sret as its
3049 // sret.
3050 if (!isCallerSRetForwarded(CLI.CB, CallerF))
3051 return false;
3052 } else if (hasCalleePopSRet(Outs, ArgLocs, Subtarget))
3053 // The callee pops an sret, so we cannot tail-call, as our caller doesn't
3054 // expect that.
3055 return false;
3056
3057 // Do not sibcall optimize vararg calls unless all arguments are passed via
3058 // registers.
3059 LLVMContext &C = *DAG.getContext();
3060 if (isVarArg && !Outs.empty()) {
3061 // Optimizing for varargs on Win64 is unlikely to be safe without
3062 // additional testing.
3063 if (IsCalleeWin64 || IsCallerWin64)
3064 return false;
3065
3066 for (const auto &VA : ArgLocs)
3067 if (!VA.isRegLoc())
3068 return false;
3069 }
3070
3071 // If the call result is in ST0 / ST1, it needs to be popped off the x87
3072 // stack. Therefore, if it's not used by the call it is not safe to optimize
3073 // this into a sibcall.
3074 bool Unused = false;
3075 for (const auto &In : Ins) {
3076 if (!In.Used) {
3077 Unused = true;
3078 break;
3079 }
3080 }
3081 if (Unused) {
3083 CCState RVCCInfo(CalleeCC, false, MF, RVLocs, C);
3084 RVCCInfo.AnalyzeCallResult(Ins, RetCC_X86);
3085 for (const auto &VA : RVLocs) {
3086 if (VA.getLocReg() == X86::FP0 || VA.getLocReg() == X86::FP1)
3087 return false;
3088 }
3089 }
3090
3091 // Check that the call results are passed in the same way.
3092 if (!CCState::resultsCompatible(CalleeCC, CallerCC, MF, C, Ins,
3094 return false;
3095 // The callee has to preserve all registers the caller needs to preserve.
3096 const X86RegisterInfo *TRI = Subtarget.getRegisterInfo();
3097 const uint32_t *CallerPreserved = TRI->getCallPreservedMask(MF, CallerCC);
3098 if (CallerCC != CalleeCC) {
3099 const uint32_t *CalleePreserved = TRI->getCallPreservedMask(MF, CalleeCC);
3100 if (!TRI->regmaskSubsetEqual(CallerPreserved, CalleePreserved))
3101 return false;
3102 }
3103
3104 // The stack frame of the caller cannot be replaced by the tail-callee one's
3105 // if the function is required to preserve all the registers. Conservatively
3106 // prevent tail optimization even if hypothetically all the registers are used
3107 // for passing formal parameters or returning values.
3108 if (CallerF.hasFnAttribute("no_caller_saved_registers"))
3109 return false;
3110
3111 unsigned StackArgsSize = CCInfo.getStackSize();
3112
3113 // If the callee takes no arguments then go on to check the results of the
3114 // call.
3115 if (!Outs.empty()) {
3116 if (StackArgsSize > 0) {
3117 // Check if the arguments are already laid out in the right way as
3118 // the caller's fixed stack objects.
3119 MachineFrameInfo &MFI = MF.getFrameInfo();
3120 const MachineRegisterInfo *MRI = &MF.getRegInfo();
3121 const X86InstrInfo *TII = Subtarget.getInstrInfo();
3122 for (unsigned I = 0, E = ArgLocs.size(); I != E; ++I) {
3123 const CCValAssign &VA = ArgLocs[I];
3124 SDValue Arg = OutVals[I];
3125 ISD::ArgFlagsTy Flags = Outs[I].Flags;
3127 return false;
3128 if (!VA.isRegLoc()) {
3129 if (!MatchingStackOffset(Arg, VA.getLocMemOffset(), Flags, MFI, MRI,
3130 TII, VA))
3131 return false;
3132 }
3133 }
3134 }
3135
3136 bool PositionIndependent = isPositionIndependent();
3137 // If the tailcall address may be in a register, then make sure it's
3138 // possible to register allocate for it. In 32-bit, the call address can
3139 // only target EAX, EDX, or ECX since the tail call must be scheduled after
3140 // callee-saved registers are restored. These happen to be the same
3141 // registers used to pass 'inreg' arguments so watch out for those.
3142 if (!Subtarget.is64Bit() && ((!isa<GlobalAddressSDNode>(Callee) &&
3143 !isa<ExternalSymbolSDNode>(Callee)) ||
3144 PositionIndependent)) {
3145 unsigned NumInRegs = 0;
3146 // In PIC we need an extra register to formulate the address computation
3147 // for the callee.
3148 unsigned MaxInRegs = PositionIndependent ? 2 : 3;
3149
3150 for (const auto &VA : ArgLocs) {
3151 if (!VA.isRegLoc())
3152 continue;
3153 Register Reg = VA.getLocReg();
3154 switch (Reg) {
3155 default: break;
3156 case X86::EAX: case X86::EDX: case X86::ECX:
3157 if (++NumInRegs == MaxInRegs)
3158 return false;
3159 break;
3160 }
3161 }
3162 }
3163
3164 const MachineRegisterInfo &MRI = MF.getRegInfo();
3165 if (!parametersInCSRMatch(MRI, CallerPreserved, ArgLocs, OutVals))
3166 return false;
3167 }
3168
3169 bool CalleeWillPop =
3170 X86::isCalleePop(CalleeCC, Subtarget.is64Bit(), isVarArg,
3172
3173 if (unsigned BytesToPop = FuncInfo->getBytesToPopOnReturn()) {
3174 // If we have bytes to pop, the callee must pop them.
3175 bool CalleePopMatches = CalleeWillPop && BytesToPop == StackArgsSize;
3176 if (!CalleePopMatches)
3177 return false;
3178 } else if (CalleeWillPop && StackArgsSize > 0) {
3179 // If we don't have bytes to pop, make sure the callee doesn't pop any.
3180 return false;
3181 }
3182
3183 return true;
3184}
3185
3186/// Determines whether the callee is required to pop its own arguments.
3187/// Callee pop is necessary to support tail calls.
3189 bool is64Bit, bool IsVarArg, bool GuaranteeTCO) {
3190 // If GuaranteeTCO is true, we force some calls to be callee pop so that we
3191 // can guarantee TCO.
3192 if (!IsVarArg && shouldGuaranteeTCO(CallingConv, GuaranteeTCO))
3193 return true;
3194
3195 switch (CallingConv) {
3196 default:
3197 return false;
3202 return !is64Bit;
3203 }
3204}
return SDValue()
const AArch64Subtarget & Subtarget
static bool canGuaranteeTCO(CallingConv::ID CC, bool GuaranteeTailCalls)
Return true if the calling convention is one that we can guarantee TCO for.
static bool mayTailCallThisCC(CallingConv::ID CC)
Return true if we might ever do TCO for calls with this calling convention.
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const HexagonInstrInfo * TII
static bool IsIndirectCall(const MachineInstr *MI)
static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst, SDValue Chain, ISD::ArgFlagsTy Flags, SelectionDAG &DAG, const SDLoc &dl)
CreateCopyOfByValArgument - Make a copy of an aggregate at address specified by "Src" to address "Dst...
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static LVOptions Options
Definition LVOptions.cpp:25
const MCPhysReg ArgGPRs[]
static bool shouldGuaranteeTCO(CallingConv::ID CC, bool GuaranteedTailCallOpt)
Return true if the function is being made into a tailcall target by changing its ABI.
static bool MatchingStackOffset(SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags, MachineFrameInfo &MFI, const MachineRegisterInfo *MRI, const M68kInstrInfo *TII, const CCValAssign &VA)
Return true if the given stack call argument is already available in the same position (relatively) o...
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define T
This file defines ARC utility functions which are used by various parts of the compiler.
static CodeModel::Model getCodeModel(const PPCSubtarget &S, const TargetMachine &TM, const MachineOperand &MO)
static void getMaxByValAlign(Type *Ty, Align &MaxAlign, Align MaxMaxAlign)
getMaxByValAlign - Helper for getByValTypeAlignment to determine the desired ByVal argument alignment...
RISCVCC::CondCode CC
MachineRegisterInfo & MRI
MachineInstr *& Lo
const char * Msg
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Definition Value.cpp:479
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
TTI::PartialReductionExtendKind ExtendKind
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
static bool is64Bit(const char *name)
static SDValue lowerMasksToReg(const SDValue &ValArg, const EVT &ValLoc, const SDLoc &DL, SelectionDAG &DAG)
Lowers masks values (v*i1) to the local register values.
static bool isCallerSRetForwarded(const CallBase *CB, const Function &CallerF)
Return true if the call forwards the caller's own sret pointer to the callee as its sret argument.
static void Passv64i1ArgInRegs(const SDLoc &DL, SelectionDAG &DAG, SDValue &Arg, SmallVectorImpl< std::pair< Register, SDValue > > &RegsToPass, CCValAssign &VA, CCValAssign &NextVA, const X86Subtarget &Subtarget)
Breaks v64i1 value into two registers and adds the new node to the DAG.
static SDValue getv64i1Argument(CCValAssign &VA, CCValAssign &NextVA, SDValue &Root, SelectionDAG &DAG, const SDLoc &DL, const X86Subtarget &Subtarget, SDValue *InGlue=nullptr)
Reads two 32 bit registers and creates a 64 bit mask value.
static ArrayRef< MCPhysReg > get64BitArgumentXMMs(MachineFunction &MF, CallingConv::ID CallConv, const X86Subtarget &Subtarget)
static bool isSortedByValueNo(ArrayRef< CCValAssign > ArgLocs)
static ArrayRef< MCPhysReg > get64BitArgumentGPRs(CallingConv::ID CallConv, const X86Subtarget &Subtarget)
static SDValue getPopFromX87Reg(SelectionDAG &DAG, SDValue Chain, const SDLoc &dl, Register Reg, EVT VT, SDValue Glue)
static std::pair< MVT, unsigned > handleMaskRegisterForCallingConv(unsigned NumElts, CallingConv::ID CC, const X86Subtarget &Subtarget)
static bool shouldDisableRetRegFromCSR(CallingConv::ID CC)
Returns true if a CC can dynamically exclude a register from the list of callee-saved-registers (Targ...
static void errorUnsupported(SelectionDAG &DAG, const SDLoc &dl, const char *Msg)
Call this when the user attempts to do something unsupported, like returning a double without SSE2 en...
static SDValue EmitTailCallStoreRetAddr(SelectionDAG &DAG, MachineFunction &MF, SDValue Chain, SDValue RetAddrFrIdx, EVT PtrVT, unsigned SlotSize, int FPDiff, const SDLoc &dl)
Emit a store of the return address if tail call optimization is performed and it is required (FPDiff!...
static bool shouldDisableArgRegFromCSR(CallingConv::ID CC)
Returns true if a CC can dynamically exclude a register from the list of callee-saved-registers (Targ...
static bool hasStackGuardSlotTLS(const Triple &TargetTriple)
static SDValue lowerRegToMasks(const SDValue &ValArg, const EVT &ValVT, const EVT &ValLoc, const SDLoc &DL, SelectionDAG &DAG)
The function will lower a register of various sizes (8/16/32/64) to a mask value of the expected size...
static Constant * SegmentOffset(IRBuilderBase &IRB, int Offset, unsigned AddressSpace)
static bool hasCalleePopSRet(const SmallVectorImpl< T > &Args, const SmallVectorImpl< CCValAssign > &ArgLocs, const X86Subtarget &Subtarget)
Determines whether Args, either a set of outgoing arguments to a call, or a set of incoming args of a...
static bool isBitAligned(Align Alignment, uint64_t SizeInBits)
bool isCallingConvWin64(CallingConv::ID CC, bool IsVarArg) const
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition ArrayRef.h:185
CCState - This class holds information needed while lowering arguments and return values.
static LLVM_ABI bool resultsCompatible(CallingConv::ID CalleeCC, CallingConv::ID CallerCC, MachineFunction &MF, LLVMContext &C, const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn CalleeFn, CCAssignFn CallerFn)
Returns true if the results of the two calling conventions are compatible.
uint64_t getStackSize() const
Returns the size of the currently allocated portion of the stack.
CCValAssign - Represent assignment of one arg/retval to a location.
void convertToReg(MCRegister Reg)
Register getLocReg() const
LocInfo getLocInfo() const
bool needsCustom() const
bool isExtInLoc() const
int64_t getLocMemOffset() const
unsigned getValNo() const
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
CallingConv::ID getCallingConv() const
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned getArgOperandNo(const Use *U) const
Given a use for a arg operand, get the arg operand number that corresponds to it.
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:135
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
This is an important base class in LLVM.
Definition Constant.h:44
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
Diagnostic information for unsupported feature in backend.
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
iterator_range< arg_iterator > args()
Definition Function.h:877
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:273
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition Function.h:890
Constant * getPersonalityFn() const
Get the personality function associated with this function.
arg_iterator arg_end()
Definition Function.h:862
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:731
const GlobalValue * getGlobal() const
Module * getParent()
Get the module that this global value is contained inside of...
void setDSOLocal(bool Local)
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
Common base class shared among various IRBuilders.
Definition IRBuilder.h:111
Module * getModule() const
Get the module.
Definition IRBuilder.h:190
LLVMContext & getContext() const
Definition IRBuilder.h:178
PointerType * getPtrTy(unsigned AddrSpace=0)
Fetch the type representing a pointer.
Definition IRBuilder.h:571
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
Tracks which library functions to use for a particular subtarget or function.
This class is used to represent ISD::LOAD nodes.
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:213
Machine Value Type.
@ INVALID_SIMPLE_VALUE_TYPE
SimpleValueType SimpleTy
unsigned getVectorNumElements() const
bool isVector() const
Return true if this is a vector value type.
bool is512BitVector() const
Return true if this is a 512-bit vector type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
MVT getVectorElementType() const
MVT getScalarType() const
If this is a vector, return the element type, otherwise return this.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
void setObjectZExt(int ObjectIdx, bool IsZExt)
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.
void setObjectSExt(int ObjectIdx, bool IsSExt)
bool isImmutableObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to an immutable object.
void setHasTailCall(bool V=true)
bool isObjectZExt(int ObjectIdx) const
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
bool isObjectSExt(int ObjectIdx) const
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
int getObjectIndexBegin() const
Return the minimum frame object index.
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
MCSymbol * getPICBaseSymbol() const
getPICBaseSymbol - Return a function-local symbol to represent the PIC base.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
uint32_t * allocateRegMask()
Allocate and initialize a register mask with NumRegister bits.
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.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Register addLiveIn(MCRegister PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags F, LLT MemTy, Align BaseAlignment, const MMOMetadata &Metadata=MMOMetadata(), SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
@ EK_Custom32
EK_Custom32 - Each entry is a 32-bit value that is custom lowered by the TargetLowering::LowerCustomJ...
@ EK_LabelDifference64
EK_LabelDifference64 - Each entry is the address of the block minus the address of the jump table.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOStore
The memory access writes data.
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
ArrayRef< std::pair< MCRegister, Register > > liveins() const
LLVM_ABI void disableCalleeSavedRegister(MCRegister Reg)
Disables the register from the list of CSRs.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
Represents one node in the SelectionDAG.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
void setCFIType(uint32_t Type)
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, unsigned TargetFlags=0)
LLVM_ABI SDValue getStackArgumentTokenFactor(SDValue Chain)
Compute a TokenFactor to force all the incoming stack arguments to be loaded from the stack.
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
void addNoMergeSiteInfo(const SDNode *Node, bool NoMerge)
Set NoMergeSiteInfo to be associated with Node if NoMerge is true.
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2, SDValue InGlue, const SDLoc &DL)
Return a new CALLSEQ_END node, which always must have a glue result (to ensure it's not CSE'd).
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
void addHeapAllocSite(const SDNode *Node, MDNode *MD)
Set HeapAllocSite to be associated with Node.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
SDValue getSignedTargetConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
SDValue getCALLSEQ_START(SDValue Chain, uint64_t InSize, uint64_t OutSize, const SDLoc &DL)
Return a new CALLSEQ_START node, that starts new call frame, in which InSize bytes are set up inside ...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
const TargetMachine & getTarget() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
void addCallSiteInfo(const SDNode *Node, CallSiteInfo &&CallInfo)
Set CallSiteInfo to be associated with Node.
LLVMContext * getContext() const
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
Class to represent struct types.
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
virtual Value * getIRStackGuard(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const
If the target has a standard location for the stack protector guard, returns the address of that loca...
const TargetMachine & getTargetMachine() const
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
virtual void insertSSPDeclarations(Module &M, const LibcallLoweringInfo &Libcalls) const
Inserts necessary declarations for SSP (stack protection) purpose.
MVT getRegisterType(LLVMContext &Context, EVT VT) const
Return the type of registers that this ValueType will eventually require.
virtual unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
virtual std::pair< const TargetRegisterClass *, uint8_t > findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) const
Return the largest legal super-reg register class of the register class for the specified type and it...
virtual Value * getSafeStackPointerLocation(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const
Returns the target-specific address of the unsafe stack pointer.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
std::vector< ArgListEntry > ArgListTy
virtual const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
bool parametersInCSRMatch(const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask, const SmallVectorImpl< CCValAssign > &ArgLocs, const SmallVectorImpl< SDValue > &OutVals) const
Check whether parameters to a call that are passed in callee saved registers are the same as from the...
bool isPositionIndependent() const
virtual ArrayRef< MCPhysReg > getRoundingControlRegisters() const
Returns a 0 terminated array of rounding control registers that can be attached into strict FP call.
virtual unsigned getJumpTableEncoding() const
Return the entry encoding for a jump table in the current function.
void setTypeIdForCallsiteInfo(const CallBase *CB, MachineFunction &MF, MachineFunction::CallSiteInfo &CSInfo) const
TargetOptions Options
CodeModel::Model getCodeModel() const
Returns the code model.
unsigned GuaranteedTailCallOpt
GuaranteedTailCallOpt - This flag is enabled when -tailcallopt is specified on the commandline.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
bool isAndroid() const
Tests whether the target is Android.
Definition Triple.h:911
bool isMusl() const
Tests whether the environment is musl-libc.
Definition Triple.h:929
bool isOSGlibc() const
Tests whether the OS uses glibc.
Definition Triple.h:849
bool isOSFuchsia() const
Definition Triple.h:751
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:300
bool isX86_FP80Ty() const
Return true if this is x86 long double.
Definition Type.h:161
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
void setBytesToPopOnReturn(unsigned bytes)
void setVarArgsGPOffset(unsigned Offset)
SmallVectorImpl< ForwardedRegister > & getForwardedMustTailRegParms()
void setVarArgsFPOffset(unsigned Offset)
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const override
Register getStackRegister() const
unsigned getSlotSize() const
Register getFramePtr() const
Returns physical register used as frame pointer.
Register getBaseRegister() const
const uint32_t * getNoPreservedMask() const override
std::pair< const TargetRegisterClass *, uint8_t > findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) const override
Return the largest legal super-reg register class of the register class for the specified type and it...
SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const override
Returns relocation base for the given PIC jumptable.
unsigned getJumpTableEncoding() const override
Return the entry encoding for a jump table in the current function.
bool isMemoryAccessFast(EVT VT, Align Alignment) const
Value * getIRStackGuard(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const override
If the target has a standard location for the stack protector cookie, returns the address of that loc...
bool useSoftFloat() const override
Value * getSafeStackPointerLocation(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const override
Return true if the target stores SafeStack pointer at a fixed offset in some non-standard address spa...
const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const override
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
bool isSafeMemOpType(MVT VT) const override
Returns true if it's safe to use load / store of the specified type to expand memcpy / memset inline.
bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const override
For some targets, an LLVM struct type must be broken down into multiple simple types,...
Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const override
Return the desired alignment for ByVal aggregate function arguments in the caller parameter area.
MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, Align Alignment, MachineMemOperand::Flags Flags, unsigned *Fast) const override
Returns true if the target allows unaligned memory accesses of the specified type.
EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &FuncAttributes) const override
It returns EVT::Other if the type should be determined using generic target-independent logic.
unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const override
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
void markLibCallAttributes(MachineFunction *MF, unsigned CC, ArgListTy &Args) const override
void insertSSPDeclarations(Module &M, const LibcallLoweringInfo &Libcalls) const override
Inserts necessary declarations for SSP (stack protection) purpose.
bool isScalarFPTypeInSSEReg(EVT VT) const
Return true if the specified scalar FP type is computed in an SSE register, not on the X87 floating p...
unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain targets require unusual breakdowns of certain types.
bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const override
This function returns true if the memory access is aligned or if the target allows this specific unal...
SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const
SDValue unwrapAddress(SDValue N) const override
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
Return the value type to use for ISD::SETCC.
EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const override
For types supported by the target, this is an identity function.
const MCExpr * LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI, const MachineBasicBlock *MBB, unsigned uid, MCContext &Ctx) const override
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:201
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
CallingConv Namespace - This namespace contains an enum with a value for the well-known calling conve...
Definition CallingConv.h:21
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ HiPE
Used by the High-Performance Erlang Compiler (HiPE).
Definition CallingConv.h:53
@ Swift
Calling convention for Swift.
Definition CallingConv.h:69
@ PreserveMost
Used for runtime calls that preserves most registers.
Definition CallingConv.h:63
@ X86_INTR
x86 hardware interrupt context.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
Definition CallingConv.h:50
@ X86_ThisCall
Similar to X86_StdCall.
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
Definition CallingConv.h:66
@ X86_StdCall
stdcall is mostly used by the Win32 API.
Definition CallingConv.h:99
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ PreserveNone
Used for runtime calls that preserves none general registers.
Definition CallingConv.h:90
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
Definition CallingConv.h:76
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
Definition CallingConv.h:87
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ X86_FastCall
'fast' analog of X86_StdCall.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:43
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:266
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:885
@ GlobalAddress
Definition ISDOpcodes.h:90
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:589
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:876
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:681
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:232
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:581
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:226
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:882
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:55
@ ExternalSymbol
Definition ISDOpcodes.h:95
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:991
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:888
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:64
LLVM_ABI LegalityPredicate isVector(unsigned TypeIdx)
True iff the specified type index is a vector.
@ PTR32_UPTR
Definition X86.h:582
@ MO_NO_FLAG
MO_NO_FLAG - No flag for the operand.
@ GlobalBaseReg
On Darwin, this node represents the result of the popl at function entry, used for PIC code.
@ POP_FROM_X87_REG
The same as ISD::CopyFromReg except that this node makes it explicit that it may lower to an x87 FPU ...
bool isExtendedSwiftAsyncFrameSupported(const X86Subtarget &Subtarget, const MachineFunction &MF)
True if the target supports the extended frame for async Swift functions.
bool isCalleePop(CallingConv::ID CallingConv, bool is64Bit, bool IsVarArg, bool GuaranteeTCO)
Determines whether the callee is required to pop its own arguments.
std::optional< Function * > getAttachedARCFunction(const CallBase *CB)
This function returns operand bundle clang_arc_attachedcall's argument, which is the address of the A...
Definition ObjCARCUtil.h:43
bool hasAttachedCallOpBundle(const CallBase *CB)
Definition ObjCARCUtil.h:29
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
LLVM_ABI bool isCFGuardCall(const CallBase *CB)
Definition CFGuard.cpp:316
InstructionCost Cost
@ Unknown
Not known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI bool isCFGuardFunction(const GlobalValue *GV)
Definition CFGuard.cpp:321
@ Store
The extracted value is stored (ExtractElement only).
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:149
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
Definition STLExtras.h:1986
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
@ Fast
Assign the register banks as fast as possible (default).
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
bool CC_X86(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
bool RetCC_X86(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1788
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
static constexpr Align Constant()
Allow constructions of constexpr Align.
Definition Alignment.h:93
Extended Value Type.
Definition ValueTypes.h:35
EVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
Definition ValueTypes.h:90
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:433
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:338
ElementCount getVectorElementCount() const
Definition ValueTypes.h:388
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:411
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:98
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:354
bool is128BitVector() const
Return true if this is a 128-bit vector type.
Definition ValueTypes.h:245
bool is512BitVector() const
Return true if this is a 512-bit vector type.
Definition ValueTypes.h:255
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:191
bool is256BitVector() const
Return true if this is a 256-bit vector type.
Definition ValueTypes.h:250
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:366
bool isVectorOf(EVT EltVT) const
Return true if this is a vector with matching element type.
Definition ValueTypes.h:196
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:374
Describes a register that needs to be forwarded from the prologue to a musttail call.
SmallVector< ArgRegPair, 1 > ArgRegPairs
Vector of call argument and its forwarding register.
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getStack(MachineFunction &MF, int64_t Offset, uint8_t ID=0)
Stack pointer relative access.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
A simple container for information about the supported runtime calls.
LLVM_ABI FunctionCallee getOrInsertLibcallDecl(Module &M, RTLIB::LibcallImpl LibcallImpl) const
LLVM_ABI GlobalValue * getOrInsertImplGlobal(Module &M, RTLIB::LibcallImpl LibcallImpl) const
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
This structure contains all information that is necessary for lowering calls.
SmallVector< ISD::InputArg, 32 > Ins
SmallVector< ISD::OutputArg, 32 > Outs
Type * RetTy
Same as OrigRetTy, or partially legalized for soft float libcalls.