LLVM 23.0.0git
CallLowering.h
Go to the documentation of this file.
1//===- llvm/CodeGen/GlobalISel/CallLowering.h - Call lowering ---*- C++ -*-===//
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 describes how to lower LLVM calls to machine code calls.
11///
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CODEGEN_GLOBALISEL_CALLLOWERING_H
15#define LLVM_CODEGEN_GLOBALISEL_CALLLOWERING_H
16
17#include "llvm/ADT/ArrayRef.h"
25#include "llvm/IR/CallingConv.h"
26#include "llvm/IR/Type.h"
27#include "llvm/IR/Value.h"
30#include <cstdint>
31#include <functional>
32
33namespace llvm {
34
35class AttributeList;
36class CallBase;
37class DataLayout;
38class Function;
41class MachineFunction;
44class TargetLowering;
45
47 const TargetLowering *TLI;
48
49 virtual void anchor();
50public:
61
62 struct ArgInfo : public BaseArgInfo {
64 // If the argument had to be split into multiple parts according to the
65 // target calling convention, then this contains the original vregs
66 // if the argument was an incoming arg.
68
69 /// Optionally track the original IR value for the argument. This may not be
70 /// meaningful in all contexts. This should only be used on for forwarding
71 /// through to use for aliasing information in MachinePointerInfo for memory
72 /// arguments.
73 const Value *OrigValue = nullptr;
74
75 /// Index original Function's argument.
76 unsigned OrigArgIndex;
77
78 /// Sentinel value for implicit machine-level input arguments.
79 static const unsigned NoArgIndex = UINT_MAX;
80
81 ArgInfo(ArrayRef<Register> Regs, Type *Ty, unsigned OrigIndex,
83 const Value *OrigValue = nullptr)
85 OrigArgIndex(OrigIndex) {
86 if (!Regs.empty() && Flags.empty())
87 this->Flags.push_back(ISD::ArgFlagsTy());
88 // FIXME: We should have just one way of saying "no register".
89 assert(((Ty->isVoidTy() || Ty->isEmptyTy()) ==
90 (Regs.empty() || Regs[0] == 0)) &&
91 "only void types should have no register");
92 }
93
97
98 ArgInfo() = default;
99 };
100
105
107 /// Calling convention to be used for the call.
109
110 /// Destination of the call. It should be either a register, globaladdress,
111 /// or externalsymbol.
113
114 /// Descriptor for the return type of the function.
116
117 /// List of descriptors of the arguments passed to the function.
119
120 /// Valid if the call has a swifterror inout parameter, and contains the
121 /// vreg that the swifterror should be copied into after the call.
123
124 /// Valid if the call is a controlled convergent operation.
126
127 /// Original IR callsite corresponding to this call, if available.
128 const CallBase *CB = nullptr;
129
131
132 /// The auth-call information in the "ptrauth" bundle, if present.
133 std::optional<PtrAuthInfo> PAI;
134
135 /// True if the call must be tail call optimized.
136 bool IsMustTailCall = false;
137
138 /// True if the call passes all target-independent checks for tail call
139 /// optimization.
140 bool IsTailCall = false;
141
142 /// True if the call was lowered as a tail call. This is consumed by the
143 /// legalizer. This allows the legalizer to lower libcalls as tail calls.
144 bool LoweredTailCall = false;
145
146 /// True if the call is to a vararg function.
147 bool IsVarArg = false;
148
149 /// True if the function's return value can be lowered to registers.
150 bool CanLowerReturn = true;
151
152 /// VReg to hold the hidden sret parameter.
154
155 /// The stack index for sret demotion.
157
158 /// Expected type identifier for indirect calls with a CFI check.
159 const ConstantInt *CFIType = nullptr;
160
161 /// True if this call results in convergent operations.
162 bool IsConvergent = true;
163
165 };
166
167 /// Argument handling is mostly uniform between the four places that
168 /// make these decisions: function formal arguments, call
169 /// instruction args, call instruction returns and function
170 /// returns. However, once a decision has been made on where an
171 /// argument should go, exactly what happens can vary slightly. This
172 /// class abstracts the differences.
173 ///
174 /// ValueAssigner should not depend on any specific function state, and
175 /// only determine the types and locations for arguments.
177 ValueAssigner(bool IsIncoming, CCAssignFn *AssignFn_,
178 CCAssignFn *AssignFnVarArg_ = nullptr)
179 : AssignFn(AssignFn_), AssignFnVarArg(AssignFnVarArg_),
180 IsIncomingArgumentHandler(IsIncoming) {
181
182 // Some targets change the handler depending on whether the call is
183 // varargs or not. If
184 if (!AssignFnVarArg)
186 }
187
188 virtual ~ValueAssigner() = default;
189
190 /// Returns true if the handler is dealing with incoming arguments,
191 /// i.e. those that move values from some physical location to vregs.
193 return IsIncomingArgumentHandler;
194 }
195
196 /// Wrap call to (typically tablegenerated CCAssignFn). This may be
197 /// overridden to track additional state information as arguments are
198 /// assigned or apply target specific hacks around the legacy
199 /// infrastructure.
200 virtual bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
201 CCValAssign::LocInfo LocInfo, const ArgInfo &Info,
202 ISD::ArgFlagsTy Flags, CCState &State) {
203 if (getAssignFn(State.isVarArg())(ValNo, ValVT, LocVT, LocInfo, Flags,
204 Info.Ty, State))
205 return true;
206 StackSize = State.getStackSize();
207 return false;
208 }
209
210 /// Assignment function to use for a general call.
212
213 /// Assignment function to use for a variadic call. This is usually the same
214 /// as AssignFn on most targets.
216
217 /// The size of the currently allocated portion of the stack.
219
220 /// Select the appropriate assignment function depending on whether this is
221 /// a variadic call.
222 CCAssignFn *getAssignFn(bool IsVarArg) const {
223 return IsVarArg ? AssignFnVarArg : AssignFn;
224 }
225
226 private:
227 const bool IsIncomingArgumentHandler;
228 virtual void anchor();
229 };
230
233 CCAssignFn *AssignFnVarArg_ = nullptr)
234 : ValueAssigner(true, AssignFn_, AssignFnVarArg_) {}
235 };
236
239 CCAssignFn *AssignFnVarArg_ = nullptr)
240 : ValueAssigner(false, AssignFn_, AssignFnVarArg_) {}
241 };
242
247
252
253 virtual ~ValueHandler() = default;
254
255 /// Returns true if the handler is dealing with incoming arguments,
256 /// i.e. those that move values from some physical location to vregs.
259 }
260
261 /// Materialize a VReg containing the address of the specified
262 /// stack-based object. This is either based on a FrameIndex or
263 /// direct SP manipulation, depending on the context. \p MPO
264 /// should be initialized to an appropriate description of the
265 /// address created.
266 virtual Register getStackAddress(uint64_t MemSize, int64_t Offset,
268 ISD::ArgFlagsTy Flags) = 0;
269
270 /// Return the in-memory size to write for the argument at \p VA. This may
271 /// be smaller than the allocated stack slot size.
272 ///
273 /// This is overridable primarily for targets to maintain compatibility with
274 /// hacks around the existing DAG call lowering infrastructure.
276 const CCValAssign &VA,
277 ISD::ArgFlagsTy Flags) const;
278
279 /// The specified value has been assigned to a physical register,
280 /// handle the appropriate COPY (either to or from) and mark any
281 /// relevant uses/defines as needed.
282 virtual void assignValueToReg(Register ValVReg, Register PhysReg,
283 const CCValAssign &VA,
284 ISD::ArgFlagsTy Flags) = 0;
285
286 /// The specified value has been assigned to a stack
287 /// location. Load or store it there, with appropriate extension
288 /// if necessary.
289 virtual void assignValueToAddress(Register ValVReg, Register Addr,
290 LLT MemTy, const MachinePointerInfo &MPO,
291 const CCValAssign &VA) = 0;
292
293 /// An overload which takes an ArgInfo if additional information about the
294 /// arg is needed. \p ValRegIndex is the index in \p Arg.Regs for the value
295 /// to store.
296 virtual void assignValueToAddress(const ArgInfo &Arg, unsigned ValRegIndex,
297 Register Addr, LLT MemTy,
298 const MachinePointerInfo &MPO,
299 const CCValAssign &VA) {
300 assignValueToAddress(Arg.Regs[ValRegIndex], Addr, MemTy, MPO, VA);
301 }
302
303 /// Handle custom values, which may be passed into one or more of \p VAs.
304 /// \p If the handler wants the assignments to be delayed until after
305 /// mem loc assignments, then it sets \p Thunk to the thunk to do the
306 /// assignment.
307 /// \return The number of \p VAs that have been assigned including the
308 /// first one, and which should therefore be skipped from further
309 /// processing.
311 std::function<void()> *Thunk = nullptr) {
312 // This is not a pure virtual method because not all targets need to worry
313 // about custom values.
314 llvm_unreachable("Custom values not supported");
315 }
316
317 /// Do a memory copy of \p MemSize bytes from \p SrcPtr to \p DstPtr. This
318 /// is necessary for outgoing stack-passed byval arguments.
319 void
320 copyArgumentMemory(const ArgInfo &Arg, Register DstPtr, Register SrcPtr,
321 const MachinePointerInfo &DstPtrInfo, Align DstAlign,
322 const MachinePointerInfo &SrcPtrInfo, Align SrcAlign,
323 uint64_t MemSize, CCValAssign &VA) const;
324
325 /// Extend a register to the location type given in VA, capped at extending
326 /// to at most MaxSize bits. If MaxSizeBits is 0 then no maximum is set.
327 Register extendRegister(Register ValReg, const CCValAssign &VA,
328 unsigned MaxSizeBits = 0);
329 };
330
331 /// Base class for ValueHandlers used for arguments coming into the current
332 /// function, or for return values received from a call.
336
337 /// Insert G_ASSERT_ZEXT/G_ASSERT_SEXT or other hint instruction based on \p
338 /// VA, returning the new register if a hint was inserted.
339 Register buildExtensionHint(const CCValAssign &VA, Register SrcReg,
340 LLT NarrowTy);
341
342 /// Provides a default implementation for argument handling.
343 void assignValueToReg(Register ValVReg, Register PhysReg,
344 const CCValAssign &VA,
345 ISD::ArgFlagsTy Flags = {}) override;
346 };
347
348 /// Base class for ValueHandlers used for arguments passed to a function call,
349 /// or for return values.
354
355protected:
356 /// Getter for generic TargetLowering class.
357 const TargetLowering *getTLI() const {
358 return TLI;
359 }
360
361 /// Getter for target specific TargetLowering class.
362 template <class XXXTargetLowering>
363 const XXXTargetLowering *getTLI() const {
364 return static_cast<const XXXTargetLowering *>(TLI);
365 }
366
367 /// \returns Flags corresponding to the attributes on the \p ArgIdx-th
368 /// parameter of \p Call.
369 ISD::ArgFlagsTy getAttributesForArgIdx(const CallBase &Call,
370 unsigned ArgIdx) const;
371
372 /// \returns Flags corresponding to the attributes on the return from \p Call.
373 ISD::ArgFlagsTy getAttributesForReturn(const CallBase &Call) const;
374
375 /// Adds flags to \p Flags based off of the attributes in \p Attrs.
376 /// \p OpIdx is the index in \p Attrs to add flags from.
377 void addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags,
378 const AttributeList &Attrs,
379 unsigned OpIdx) const;
380
381 template <typename FuncInfoTy>
382 void setArgFlags(ArgInfo &Arg, unsigned OpIdx, const DataLayout &DL,
383 const FuncInfoTy &FuncInfo) const;
384
385 /// Break \p OrigArgInfo into one or more pieces the calling convention can
386 /// process, returned in \p SplitArgs. For example, this should break structs
387 /// down into individual fields.
388 ///
389 /// If \p Offsets is non-null, it points to a vector to be filled in
390 /// with the in-memory offsets of each of the individual values.
391 void splitToValueTypes(const ArgInfo &OrigArgInfo,
392 SmallVectorImpl<ArgInfo> &SplitArgs,
393 const DataLayout &DL, CallingConv::ID CallConv,
394 SmallVectorImpl<TypeSize> *Offsets = nullptr) const;
395
396 /// Analyze the argument list in \p Args, using \p Assigner to populate \p
397 /// CCInfo. This will determine the types and locations to use for passed or
398 /// returned values. This may resize fields in \p Args if the value is split
399 /// across multiple registers or stack slots.
400 ///
401 /// This is independent of the function state and can be used
402 /// to determine how a call would pass arguments without needing to change the
403 /// function. This can be used to check if arguments are suitable for tail
404 /// call lowering.
405 ///
406 /// \return True if everything has succeeded, false otherwise.
407 bool determineAssignments(ValueAssigner &Assigner,
409 CCState &CCInfo) const;
410
411 /// Invoke ValueAssigner::assignArg on each of the given \p Args and then use
412 /// \p Handler to move them to the assigned locations.
413 ///
414 /// \return True if everything has succeeded, false otherwise.
415 bool
416 determineAndHandleAssignments(ValueHandler &Handler, ValueAssigner &Assigner,
418 MachineIRBuilder &MIRBuilder,
419 CallingConv::ID CallConv, bool IsVarArg,
420 ArrayRef<Register> ThisReturnRegs = {}) const;
421
422 /// Use \p Handler to insert code to handle the argument/return values
423 /// represented by \p Args. It's expected determineAssignments previously
424 /// processed these arguments to populate \p CCState and \p ArgLocs.
425 bool handleAssignments(ValueHandler &Handler, SmallVectorImpl<ArgInfo> &Args,
426 CCState &CCState,
427 SmallVectorImpl<CCValAssign> &ArgLocs,
428 MachineIRBuilder &MIRBuilder,
429 ArrayRef<Register> ThisReturnRegs = {}) const;
430
431 /// Check whether parameters to a call that are passed in callee saved
432 /// registers are the same as from the calling function. This needs to be
433 /// checked for tail call eligibility.
434 bool parametersInCSRMatch(const MachineRegisterInfo &MRI,
435 const uint32_t *CallerPreservedMask,
436 const SmallVectorImpl<CCValAssign> &ArgLocs,
437 const SmallVectorImpl<ArgInfo> &OutVals) const;
438
439 /// \returns True if the calling convention for a callee and its caller pass
440 /// results in the same way. Typically used for tail call eligibility checks.
441 ///
442 /// \p Info is the CallLoweringInfo for the call.
443 /// \p MF is the MachineFunction for the caller.
444 /// \p InArgs contains the results of the call.
445 /// \p CalleeAssigner specifies the target's handling of the argument types
446 /// for the callee.
447 /// \p CallerAssigner specifies the target's handling of the
448 /// argument types for the caller.
449 bool resultsCompatible(CallLoweringInfo &Info, MachineFunction &MF,
450 SmallVectorImpl<ArgInfo> &InArgs,
451 ValueAssigner &CalleeAssigner,
452 ValueAssigner &CallerAssigner) const;
453
454public:
455 CallLowering(const TargetLowering *TLI) : TLI(TLI) {}
456 virtual ~CallLowering() = default;
457
458 /// \return true if the target is capable of handling swifterror values that
459 /// have been promoted to a specified register. The extended versions of
460 /// lowerReturn and lowerCall should be implemented.
461 virtual bool supportSwiftError() const {
462 return false;
463 }
464
465 /// Load the returned value from the stack into virtual registers in \p VRegs.
466 /// It uses the frame index \p FI and the start offset from \p DemoteReg.
467 /// The loaded data size will be determined from \p RetTy.
468 void insertSRetLoads(MachineIRBuilder &MIRBuilder, Type *RetTy,
469 ArrayRef<Register> VRegs, Register DemoteReg,
470 int FI) const;
471
472 /// Store the return value given by \p VRegs into stack starting at the offset
473 /// specified in \p DemoteReg.
474 void insertSRetStores(MachineIRBuilder &MIRBuilder, Type *RetTy,
475 ArrayRef<Register> VRegs, Register DemoteReg) const;
476
477 /// Insert the hidden sret ArgInfo to the beginning of \p SplitArgs.
478 /// This function should be called from the target specific
479 /// lowerFormalArguments when \p F requires the sret demotion.
480 void insertSRetIncomingArgument(const Function &F,
481 SmallVectorImpl<ArgInfo> &SplitArgs,
482 Register &DemoteReg, MachineRegisterInfo &MRI,
483 const DataLayout &DL) const;
484
485 /// For the call-base described by \p CB, insert the hidden sret ArgInfo to
486 /// the OrigArgs field of \p Info.
487 void insertSRetOutgoingArgument(MachineIRBuilder &MIRBuilder,
488 const CallBase &CB,
489 CallLoweringInfo &Info) const;
490
491 /// Create a sequence of instructions to combine pieces split into register
492 /// typed values to the original IR value. \p OrigRegs contains the
493 /// destination value registers of type \p LLTy, and \p Regs contains the
494 /// legalized pieces with type \p PartLLT. This is used for incoming values
495 /// (physregs to vregs).
496 static void buildCopyFromRegs(MachineIRBuilder &B,
497 ArrayRef<Register> OrigRegs,
498 ArrayRef<Register> Regs, LLT LLTy, LLT PartLLT,
499 const ISD::ArgFlagsTy Flags);
500
501 /// Create a sequence of instructions to expand the value in \p SrcReg (of
502 /// type
503 /// \p SrcTy) to the types in \p DstRegs (of type \p PartTy). \p ExtendOp
504 /// should contain the type of scalar value extension if necessary.
505 ///
506 /// This is used for outgoing values (vregs to physregs)
507 static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
508 Register SrcReg, LLT SrcTy, LLT PartTy,
509 unsigned ExtendOp = TargetOpcode::G_ANYEXT);
510
511 /// \return True if the return type described by \p Outs can be returned
512 /// without performing sret demotion.
513 bool checkReturn(CCState &CCInfo, SmallVectorImpl<BaseArgInfo> &Outs,
514 CCAssignFn *Fn) const;
515
516 /// Get the type and the ArgFlags for the split components of \p RetTy as
517 /// returned by \c ComputeValueVTs.
518 void getReturnInfo(CallingConv::ID CallConv, Type *RetTy, AttributeList Attrs,
520 const DataLayout &DL) const;
521
522 /// Toplevel function to check the return type based on the target calling
523 /// convention. \return True if the return value of \p MF can be returned
524 /// without performing sret demotion.
525 bool checkReturnTypeForCallConv(MachineFunction &MF) const;
526
527 /// This hook must be implemented to check whether the return values
528 /// described by \p Outs can fit into the return registers. If false
529 /// is returned, an sret-demotion is performed.
532 bool IsVarArg) const {
533 return true;
534 }
535
536 /// This hook must be implemented to lower outgoing return values, described
537 /// by \p Val, into the specified virtual registers \p VRegs.
538 /// This hook is used by GlobalISel.
539 ///
540 /// \p FLI is required for sret demotion.
541 ///
542 /// \p SwiftErrorVReg is non-zero if the function has a swifterror parameter
543 /// that needs to be implicitly returned.
544 ///
545 /// \return True if the lowering succeeds, false otherwise.
546 virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
548 Register SwiftErrorVReg) const {
549 if (!supportSwiftError()) {
550 assert(SwiftErrorVReg == 0 && "attempt to use unsupported swifterror");
551 return lowerReturn(MIRBuilder, Val, VRegs, FLI);
552 }
553 return false;
554 }
555
556 /// This hook behaves as the extended lowerReturn function, but for targets
557 /// that do not support swifterror value promotion.
558 virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
559 ArrayRef<Register> VRegs,
560 FunctionLoweringInfo &FLI) const {
561 return false;
562 }
563
564 virtual bool fallBackToDAGISel(const MachineFunction &MF) const {
565 return false;
566 }
567
568 /// This hook must be implemented to lower the incoming (formal)
569 /// arguments, described by \p VRegs, for GlobalISel. Each argument
570 /// must end up in the related virtual registers described by \p VRegs.
571 /// In other words, the first argument should end up in \c VRegs[0],
572 /// the second in \c VRegs[1], and so on. For each argument, there will be one
573 /// register for each non-aggregate type, as returned by \c computeValueLLTs.
574 /// \p MIRBuilder is set to the proper insertion for the argument
575 /// lowering. \p FLI is required for sret demotion.
576 ///
577 /// \return True if the lowering succeeded, false otherwise.
578 virtual bool lowerFormalArguments(MachineIRBuilder &MIRBuilder,
579 const Function &F,
581 FunctionLoweringInfo &FLI) const {
582 return false;
583 }
584
585 /// This hook must be implemented to lower the given call instruction,
586 /// including argument and return value marshalling.
587 ///
588 ///
589 /// \return true if the lowering succeeded, false otherwise.
590 virtual bool lowerCall(MachineIRBuilder &MIRBuilder,
591 CallLoweringInfo &Info) const {
592 return false;
593 }
594
595 /// Lower the given call instruction, including argument and return value
596 /// marshalling.
597 ///
598 /// \p CI is the call/invoke instruction.
599 ///
600 /// \p ResRegs are the registers where the call's return value should be
601 /// stored (or 0 if there is no return value). There will be one register for
602 /// each non-aggregate type, as returned by \c computeValueLLTs.
603 ///
604 /// \p ArgRegs is a list of lists of virtual registers containing each
605 /// argument that needs to be passed (argument \c i should be placed in \c
606 /// ArgRegs[i]). For each argument, there will be one register for each
607 /// non-aggregate type, as returned by \c computeValueLLTs.
608 ///
609 /// \p SwiftErrorVReg is non-zero if the call has a swifterror inout
610 /// parameter, and contains the vreg that the swifterror should be copied into
611 /// after the call.
612 ///
613 /// \p GetCalleeReg is a callback to materialize a register for the callee if
614 /// the target determines it cannot jump to the destination based purely on \p
615 /// CI. This might be because \p CI is indirect, or because of the limited
616 /// range of an immediate jump.
617 ///
618 /// \return true if the lowering succeeded, false otherwise.
619 bool lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &Call,
620 ArrayRef<Register> ResRegs,
621 ArrayRef<ArrayRef<Register>> ArgRegs, Register SwiftErrorVReg,
622 std::optional<PtrAuthInfo> PAI, Register ConvergenceCtrlToken,
623 std::function<Register()> GetCalleeReg) const;
624
625 /// For targets which want to use big-endian can enable it with
626 /// enableBigEndian() hook
627 virtual bool enableBigEndian() const { return false; }
628
629 /// For targets which support the "returned" parameter attribute, returns
630 /// true if the given type is a valid one to use with "returned".
631 virtual bool isTypeIsValidForThisReturn(EVT Ty) const { return false; }
632};
633
634extern template LLVM_ABI void
635CallLowering::setArgFlags<Function>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
636 const DataLayout &DL,
637 const Function &FuncInfo) const;
638
639extern template LLVM_ABI void
640CallLowering::setArgFlags<CallBase>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
641 const DataLayout &DL,
642 const CallBase &FuncInfo) const;
643} // end namespace llvm
644
645#endif // LLVM_CODEGEN_GLOBALISEL_CALLLOWERING_H
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
Implement a low-level type suitable for MachineInstr level instruction selection.
#define F(x, y, z)
Definition MD5.cpp:54
Promote Memory to Register
Definition Mem2Reg.cpp:110
MachineInstr unsigned OpIdx
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
CCState - This class holds information needed while lowering arguments and return values.
CCValAssign - Represent assignment of one arg/retval to a location.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
virtual ~CallLowering()=default
virtual bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, ArrayRef< ArrayRef< Register > > VRegs, FunctionLoweringInfo &FLI) const
This hook must be implemented to lower the incoming (formal) arguments, described by VRegs,...
virtual bool canLowerReturn(MachineFunction &MF, CallingConv::ID CallConv, SmallVectorImpl< BaseArgInfo > &Outs, bool IsVarArg) const
This hook must be implemented to check whether the return values described by Outs can fit into the r...
virtual bool isTypeIsValidForThisReturn(EVT Ty) const
For targets which support the "returned" parameter attribute, returns true if the given type is a val...
virtual bool enableBigEndian() const
For targets which want to use big-endian can enable it with enableBigEndian() hook.
virtual bool supportSwiftError() const
CallLowering(const TargetLowering *TLI)
virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, ArrayRef< Register > VRegs, FunctionLoweringInfo &FLI, Register SwiftErrorVReg) const
This hook must be implemented to lower outgoing return values, described by Val, into the specified v...
virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, ArrayRef< Register > VRegs, FunctionLoweringInfo &FLI) const
This hook behaves as the extended lowerReturn function, but for targets that do not support swifterro...
const TargetLowering * getTLI() const
Getter for generic TargetLowering class.
const XXXTargetLowering * getTLI() const
Getter for target specific TargetLowering class.
virtual bool lowerCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo &Info) const
This hook must be implemented to lower the given call instruction, including argument and return valu...
void setArgFlags(ArgInfo &Arg, unsigned OpIdx, const DataLayout &DL, const FuncInfoTy &FuncInfo) const
virtual bool fallBackToDAGISel(const MachineFunction &MF) const
This is the shared class of boolean and integer constants.
Definition Constants.h:87
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Metadata node.
Definition Metadata.h:1080
Machine Value Type.
Helper class to build MachineInstr.
MachineOperand class - Representation of each machine instruction operand.
static MachineOperand CreateImm(int64_t Val)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
Definition Register.h:20
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM Value Representation.
Definition Value.h:75
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
bool CCAssignFn(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
CCAssignFn - This function assigns a location for Val, updating State to reflect the change.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Helper struct shared between Function Specialization and SCCP Solver.
Definition SCCPSolver.h:42
const Value * OrigValue
Optionally track the original IR value for the argument.
SmallVector< Register, 4 > Regs
SmallVector< Register, 2 > OrigRegs
unsigned OrigArgIndex
Index original Function's argument.
ArgInfo(ArrayRef< Register > Regs, Type *Ty, unsigned OrigIndex, ArrayRef< ISD::ArgFlagsTy > Flags=ArrayRef< ISD::ArgFlagsTy >(), const Value *OrigValue=nullptr)
ArgInfo(ArrayRef< Register > Regs, const Value &OrigValue, unsigned OrigIndex, ArrayRef< ISD::ArgFlagsTy > Flags=ArrayRef< ISD::ArgFlagsTy >())
static const unsigned NoArgIndex
Sentinel value for implicit machine-level input arguments.
SmallVector< ISD::ArgFlagsTy, 4 > Flags
BaseArgInfo(Type *Ty, ArrayRef< ISD::ArgFlagsTy > Flags=ArrayRef< ISD::ArgFlagsTy >())
bool IsVarArg
True if the call is to a vararg function.
bool IsMustTailCall
True if the call must be tail call optimized.
bool IsTailCall
True if the call passes all target-independent checks for tail call optimization.
MachineOperand Callee
Destination of the call.
bool CanLowerReturn
True if the function's return value can be lowered to registers.
ArgInfo OrigRet
Descriptor for the return type of the function.
const ConstantInt * CFIType
Expected type identifier for indirect calls with a CFI check.
CallingConv::ID CallConv
Calling convention to be used for the call.
Register ConvergenceCtrlToken
Valid if the call is a controlled convergent operation.
const CallBase * CB
Original IR callsite corresponding to this call, if available.
Register DemoteRegister
VReg to hold the hidden sret parameter.
bool IsConvergent
True if this call results in convergent operations.
std::optional< PtrAuthInfo > PAI
The auth-call information in the "ptrauth" bundle, if present.
int DemoteStackIndex
The stack index for sret demotion.
Register SwiftErrorVReg
Valid if the call has a swifterror inout parameter, and contains the vreg that the swifterror should ...
SmallVector< ArgInfo, 32 > OrigArgs
List of descriptors of the arguments passed to the function.
bool LoweredTailCall
True if the call was lowered as a tail call.
IncomingValueAssigner(CCAssignFn *AssignFn_, CCAssignFn *AssignFnVarArg_=nullptr)
IncomingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI)
OutgoingValueAssigner(CCAssignFn *AssignFn_, CCAssignFn *AssignFnVarArg_=nullptr)
OutgoingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI)
CCAssignFn * getAssignFn(bool IsVarArg) const
Select the appropriate assignment function depending on whether this is a variadic call.
CCAssignFn * AssignFn
Assignment function to use for a general call.
bool isIncomingArgumentHandler() const
Returns true if the handler is dealing with incoming arguments, i.e.
ValueAssigner(bool IsIncoming, CCAssignFn *AssignFn_, CCAssignFn *AssignFnVarArg_=nullptr)
CCAssignFn * AssignFnVarArg
Assignment function to use for a variadic call.
virtual bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, const ArgInfo &Info, ISD::ArgFlagsTy Flags, CCState &State)
Wrap call to (typically tablegenerated CCAssignFn).
uint64_t StackSize
The size of the currently allocated portion of the stack.
virtual Register getStackAddress(uint64_t MemSize, int64_t Offset, MachinePointerInfo &MPO, ISD::ArgFlagsTy Flags)=0
Materialize a VReg containing the address of the specified stack-based object.
virtual void assignValueToAddress(const ArgInfo &Arg, unsigned ValRegIndex, Register Addr, LLT MemTy, const MachinePointerInfo &MPO, const CCValAssign &VA)
An overload which takes an ArgInfo if additional information about the arg is needed.
virtual LLT getStackValueStoreType(const DataLayout &DL, const CCValAssign &VA, ISD::ArgFlagsTy Flags) const
Return the in-memory size to write for the argument at VA.
virtual void assignValueToReg(Register ValVReg, Register PhysReg, const CCValAssign &VA, ISD::ArgFlagsTy Flags)=0
The specified value has been assigned to a physical register, handle the appropriate COPY (either to ...
bool isIncomingArgumentHandler() const
Returns true if the handler is dealing with incoming arguments, i.e.
virtual void assignValueToAddress(Register ValVReg, Register Addr, LLT MemTy, const MachinePointerInfo &MPO, const CCValAssign &VA)=0
The specified value has been assigned to a stack location.
virtual unsigned assignCustomValue(ArgInfo &Arg, ArrayRef< CCValAssign > VAs, std::function< void()> *Thunk=nullptr)
Handle custom values, which may be passed into one or more of VAs.
ValueHandler(bool IsIncoming, MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI)
Extended Value Type.
Definition ValueTypes.h:35
This class contains a discriminated union of information about pointers in memory operands,...