LLVM 22.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"
24#include "llvm/IR/CallingConv.h"
25#include "llvm/IR/Type.h"
26#include "llvm/IR/Value.h"
29#include <cstdint>
30#include <functional>
31
32namespace llvm {
33
34class AttributeList;
35class CallBase;
36class DataLayout;
37class Function;
40class MachineFunction;
43class TargetLowering;
44
46 const TargetLowering *TLI;
47
48 virtual void anchor();
49public:
60
61 struct ArgInfo : public BaseArgInfo {
63 // If the argument had to be split into multiple parts according to the
64 // target calling convention, then this contains the original vregs
65 // if the argument was an incoming arg.
67
68 /// Optionally track the original IR value for the argument. This may not be
69 /// meaningful in all contexts. This should only be used on for forwarding
70 /// through to use for aliasing information in MachinePointerInfo for memory
71 /// arguments.
72 const Value *OrigValue = nullptr;
73
74 /// Index original Function's argument.
75 unsigned OrigArgIndex;
76
77 /// Sentinel value for implicit machine-level input arguments.
78 static const unsigned NoArgIndex = UINT_MAX;
79
80 ArgInfo(ArrayRef<Register> Regs, Type *Ty, unsigned OrigIndex,
82 const Value *OrigValue = nullptr)
84 OrigArgIndex(OrigIndex) {
85 if (!Regs.empty() && Flags.empty())
86 this->Flags.push_back(ISD::ArgFlagsTy());
87 // FIXME: We should have just one way of saying "no register".
88 assert(((Ty->isVoidTy() || Ty->isEmptyTy()) ==
89 (Regs.empty() || Regs[0] == 0)) &&
90 "only void types should have no register");
91 }
92
96
97 ArgInfo() = default;
98 };
99
104
106 /// Calling convention to be used for the call.
108
109 /// Destination of the call. It should be either a register, globaladdress,
110 /// or externalsymbol.
112
113 /// Descriptor for the return type of the function.
115
116 /// List of descriptors of the arguments passed to the function.
118
119 /// Valid if the call has a swifterror inout parameter, and contains the
120 /// vreg that the swifterror should be copied into after the call.
122
123 /// Valid if the call is a controlled convergent operation.
125
126 /// Original IR callsite corresponding to this call, if available.
127 const CallBase *CB = nullptr;
128
130
131 /// The auth-call information in the "ptrauth" bundle, if present.
132 std::optional<PtrAuthInfo> PAI;
133
134 /// True if the call must be tail call optimized.
135 bool IsMustTailCall = false;
136
137 /// True if the call passes all target-independent checks for tail call
138 /// optimization.
139 bool IsTailCall = false;
140
141 /// True if the call was lowered as a tail call. This is consumed by the
142 /// legalizer. This allows the legalizer to lower libcalls as tail calls.
143 bool LoweredTailCall = false;
144
145 /// True if the call is to a vararg function.
146 bool IsVarArg = false;
147
148 /// True if the function's return value can be lowered to registers.
149 bool CanLowerReturn = true;
150
151 /// VReg to hold the hidden sret parameter.
153
154 /// The stack index for sret demotion.
156
157 /// Expected type identifier for indirect calls with a CFI check.
158 const ConstantInt *CFIType = nullptr;
159
160 /// True if this call results in convergent operations.
161 bool IsConvergent = true;
162
164 };
165
166 /// Argument handling is mostly uniform between the four places that
167 /// make these decisions: function formal arguments, call
168 /// instruction args, call instruction returns and function
169 /// returns. However, once a decision has been made on where an
170 /// argument should go, exactly what happens can vary slightly. This
171 /// class abstracts the differences.
172 ///
173 /// ValueAssigner should not depend on any specific function state, and
174 /// only determine the types and locations for arguments.
176 ValueAssigner(bool IsIncoming, CCAssignFn *AssignFn_,
177 CCAssignFn *AssignFnVarArg_ = nullptr)
178 : AssignFn(AssignFn_), AssignFnVarArg(AssignFnVarArg_),
179 IsIncomingArgumentHandler(IsIncoming) {
180
181 // Some targets change the handler depending on whether the call is
182 // varargs or not. If
183 if (!AssignFnVarArg)
185 }
186
187 virtual ~ValueAssigner() = default;
188
189 /// Returns true if the handler is dealing with incoming arguments,
190 /// i.e. those that move values from some physical location to vregs.
192 return IsIncomingArgumentHandler;
193 }
194
195 /// Wrap call to (typically tablegenerated CCAssignFn). This may be
196 /// overridden to track additional state information as arguments are
197 /// assigned or apply target specific hacks around the legacy
198 /// infrastructure.
199 virtual bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
200 CCValAssign::LocInfo LocInfo, const ArgInfo &Info,
201 ISD::ArgFlagsTy Flags, CCState &State) {
202 if (getAssignFn(State.isVarArg())(ValNo, ValVT, LocVT, LocInfo, Flags,
203 Info.Ty, State))
204 return true;
205 StackSize = State.getStackSize();
206 return false;
207 }
208
209 /// Assignment function to use for a general call.
211
212 /// Assignment function to use for a variadic call. This is usually the same
213 /// as AssignFn on most targets.
215
216 /// The size of the currently allocated portion of the stack.
218
219 /// Select the appropriate assignment function depending on whether this is
220 /// a variadic call.
221 CCAssignFn *getAssignFn(bool IsVarArg) const {
222 return IsVarArg ? AssignFnVarArg : AssignFn;
223 }
224
225 private:
226 const bool IsIncomingArgumentHandler;
227 virtual void anchor();
228 };
229
232 CCAssignFn *AssignFnVarArg_ = nullptr)
233 : ValueAssigner(true, AssignFn_, AssignFnVarArg_) {}
234 };
235
238 CCAssignFn *AssignFnVarArg_ = nullptr)
239 : ValueAssigner(false, AssignFn_, AssignFnVarArg_) {}
240 };
241
246
251
252 virtual ~ValueHandler() = default;
253
254 /// Returns true if the handler is dealing with incoming arguments,
255 /// i.e. those that move values from some physical location to vregs.
258 }
259
260 /// Materialize a VReg containing the address of the specified
261 /// stack-based object. This is either based on a FrameIndex or
262 /// direct SP manipulation, depending on the context. \p MPO
263 /// should be initialized to an appropriate description of the
264 /// address created.
265 virtual Register getStackAddress(uint64_t MemSize, int64_t Offset,
267 ISD::ArgFlagsTy Flags) = 0;
268
269 /// Return the in-memory size to write for the argument at \p VA. This may
270 /// be smaller than the allocated stack slot size.
271 ///
272 /// This is overridable primarily for targets to maintain compatibility with
273 /// hacks around the existing DAG call lowering infrastructure.
275 const CCValAssign &VA,
276 ISD::ArgFlagsTy Flags) const;
277
278 /// The specified value has been assigned to a physical register,
279 /// handle the appropriate COPY (either to or from) and mark any
280 /// relevant uses/defines as needed.
281 virtual void assignValueToReg(Register ValVReg, Register PhysReg,
282 const CCValAssign &VA) = 0;
283
284 /// The specified value has been assigned to a stack
285 /// location. Load or store it there, with appropriate extension
286 /// if necessary.
287 virtual void assignValueToAddress(Register ValVReg, Register Addr,
288 LLT MemTy, const MachinePointerInfo &MPO,
289 const CCValAssign &VA) = 0;
290
291 /// An overload which takes an ArgInfo if additional information about the
292 /// arg is needed. \p ValRegIndex is the index in \p Arg.Regs for the value
293 /// to store.
294 virtual void assignValueToAddress(const ArgInfo &Arg, unsigned ValRegIndex,
295 Register Addr, LLT MemTy,
296 const MachinePointerInfo &MPO,
297 const CCValAssign &VA) {
298 assignValueToAddress(Arg.Regs[ValRegIndex], Addr, MemTy, MPO, VA);
299 }
300
301 /// Handle custom values, which may be passed into one or more of \p VAs.
302 /// \p If the handler wants the assignments to be delayed until after
303 /// mem loc assignments, then it sets \p Thunk to the thunk to do the
304 /// assignment.
305 /// \return The number of \p VAs that have been assigned including the
306 /// first one, and which should therefore be skipped from further
307 /// processing.
309 std::function<void()> *Thunk = nullptr) {
310 // This is not a pure virtual method because not all targets need to worry
311 // about custom values.
312 llvm_unreachable("Custom values not supported");
313 }
314
315 /// Do a memory copy of \p MemSize bytes from \p SrcPtr to \p DstPtr. This
316 /// is necessary for outgoing stack-passed byval arguments.
317 void
318 copyArgumentMemory(const ArgInfo &Arg, Register DstPtr, Register SrcPtr,
319 const MachinePointerInfo &DstPtrInfo, Align DstAlign,
320 const MachinePointerInfo &SrcPtrInfo, Align SrcAlign,
321 uint64_t MemSize, CCValAssign &VA) const;
322
323 /// Extend a register to the location type given in VA, capped at extending
324 /// to at most MaxSize bits. If MaxSizeBits is 0 then no maximum is set.
325 Register extendRegister(Register ValReg, const CCValAssign &VA,
326 unsigned MaxSizeBits = 0);
327 };
328
329 /// Base class for ValueHandlers used for arguments coming into the current
330 /// function, or for return values received from a call.
334
335 /// Insert G_ASSERT_ZEXT/G_ASSERT_SEXT or other hint instruction based on \p
336 /// VA, returning the new register if a hint was inserted.
337 Register buildExtensionHint(const CCValAssign &VA, Register SrcReg,
338 LLT NarrowTy);
339
340 /// Provides a default implementation for argument handling.
341 void assignValueToReg(Register ValVReg, Register PhysReg,
342 const CCValAssign &VA) override;
343 };
344
345 /// Base class for ValueHandlers used for arguments passed to a function call,
346 /// or for return values.
351
352protected:
353 /// Getter for generic TargetLowering class.
354 const TargetLowering *getTLI() const {
355 return TLI;
356 }
357
358 /// Getter for target specific TargetLowering class.
359 template <class XXXTargetLowering>
360 const XXXTargetLowering *getTLI() const {
361 return static_cast<const XXXTargetLowering *>(TLI);
362 }
363
364 /// \returns Flags corresponding to the attributes on the \p ArgIdx-th
365 /// parameter of \p Call.
366 ISD::ArgFlagsTy getAttributesForArgIdx(const CallBase &Call,
367 unsigned ArgIdx) const;
368
369 /// \returns Flags corresponding to the attributes on the return from \p Call.
370 ISD::ArgFlagsTy getAttributesForReturn(const CallBase &Call) const;
371
372 /// Adds flags to \p Flags based off of the attributes in \p Attrs.
373 /// \p OpIdx is the index in \p Attrs to add flags from.
374 void addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags,
375 const AttributeList &Attrs,
376 unsigned OpIdx) const;
377
378 template <typename FuncInfoTy>
379 void setArgFlags(ArgInfo &Arg, unsigned OpIdx, const DataLayout &DL,
380 const FuncInfoTy &FuncInfo) const;
381
382 /// Break \p OrigArgInfo into one or more pieces the calling convention can
383 /// process, returned in \p SplitArgs. For example, this should break structs
384 /// down into individual fields.
385 ///
386 /// If \p Offsets is non-null, it points to a vector to be filled in
387 /// with the in-memory offsets of each of the individual values.
388 void splitToValueTypes(const ArgInfo &OrigArgInfo,
389 SmallVectorImpl<ArgInfo> &SplitArgs,
390 const DataLayout &DL, CallingConv::ID CallConv,
391 SmallVectorImpl<uint64_t> *Offsets = nullptr) const;
392
393 /// Analyze the argument list in \p Args, using \p Assigner to populate \p
394 /// CCInfo. This will determine the types and locations to use for passed or
395 /// returned values. This may resize fields in \p Args if the value is split
396 /// across multiple registers or stack slots.
397 ///
398 /// This is independent of the function state and can be used
399 /// to determine how a call would pass arguments without needing to change the
400 /// function. This can be used to check if arguments are suitable for tail
401 /// call lowering.
402 ///
403 /// \return True if everything has succeeded, false otherwise.
404 bool determineAssignments(ValueAssigner &Assigner,
406 CCState &CCInfo) const;
407
408 /// Invoke ValueAssigner::assignArg on each of the given \p Args and then use
409 /// \p Handler to move them to the assigned locations.
410 ///
411 /// \return True if everything has succeeded, false otherwise.
412 bool
413 determineAndHandleAssignments(ValueHandler &Handler, ValueAssigner &Assigner,
415 MachineIRBuilder &MIRBuilder,
416 CallingConv::ID CallConv, bool IsVarArg,
417 ArrayRef<Register> ThisReturnRegs = {}) const;
418
419 /// Use \p Handler to insert code to handle the argument/return values
420 /// represented by \p Args. It's expected determineAssignments previously
421 /// processed these arguments to populate \p CCState and \p ArgLocs.
422 bool handleAssignments(ValueHandler &Handler, SmallVectorImpl<ArgInfo> &Args,
423 CCState &CCState,
424 SmallVectorImpl<CCValAssign> &ArgLocs,
425 MachineIRBuilder &MIRBuilder,
426 ArrayRef<Register> ThisReturnRegs = {}) const;
427
428 /// Check whether parameters to a call that are passed in callee saved
429 /// registers are the same as from the calling function. This needs to be
430 /// checked for tail call eligibility.
431 bool parametersInCSRMatch(const MachineRegisterInfo &MRI,
432 const uint32_t *CallerPreservedMask,
433 const SmallVectorImpl<CCValAssign> &ArgLocs,
434 const SmallVectorImpl<ArgInfo> &OutVals) const;
435
436 /// \returns True if the calling convention for a callee and its caller pass
437 /// results in the same way. Typically used for tail call eligibility checks.
438 ///
439 /// \p Info is the CallLoweringInfo for the call.
440 /// \p MF is the MachineFunction for the caller.
441 /// \p InArgs contains the results of the call.
442 /// \p CalleeAssigner specifies the target's handling of the argument types
443 /// for the callee.
444 /// \p CallerAssigner specifies the target's handling of the
445 /// argument types for the caller.
446 bool resultsCompatible(CallLoweringInfo &Info, MachineFunction &MF,
447 SmallVectorImpl<ArgInfo> &InArgs,
448 ValueAssigner &CalleeAssigner,
449 ValueAssigner &CallerAssigner) const;
450
451public:
452 CallLowering(const TargetLowering *TLI) : TLI(TLI) {}
453 virtual ~CallLowering() = default;
454
455 /// \return true if the target is capable of handling swifterror values that
456 /// have been promoted to a specified register. The extended versions of
457 /// lowerReturn and lowerCall should be implemented.
458 virtual bool supportSwiftError() const {
459 return false;
460 }
461
462 /// Load the returned value from the stack into virtual registers in \p VRegs.
463 /// It uses the frame index \p FI and the start offset from \p DemoteReg.
464 /// The loaded data size will be determined from \p RetTy.
465 void insertSRetLoads(MachineIRBuilder &MIRBuilder, Type *RetTy,
466 ArrayRef<Register> VRegs, Register DemoteReg,
467 int FI) const;
468
469 /// Store the return value given by \p VRegs into stack starting at the offset
470 /// specified in \p DemoteReg.
471 void insertSRetStores(MachineIRBuilder &MIRBuilder, Type *RetTy,
472 ArrayRef<Register> VRegs, Register DemoteReg) const;
473
474 /// Insert the hidden sret ArgInfo to the beginning of \p SplitArgs.
475 /// This function should be called from the target specific
476 /// lowerFormalArguments when \p F requires the sret demotion.
477 void insertSRetIncomingArgument(const Function &F,
478 SmallVectorImpl<ArgInfo> &SplitArgs,
479 Register &DemoteReg, MachineRegisterInfo &MRI,
480 const DataLayout &DL) const;
481
482 /// For the call-base described by \p CB, insert the hidden sret ArgInfo to
483 /// the OrigArgs field of \p Info.
484 void insertSRetOutgoingArgument(MachineIRBuilder &MIRBuilder,
485 const CallBase &CB,
486 CallLoweringInfo &Info) const;
487
488 /// \return True if the return type described by \p Outs can be returned
489 /// without performing sret demotion.
490 bool checkReturn(CCState &CCInfo, SmallVectorImpl<BaseArgInfo> &Outs,
491 CCAssignFn *Fn) const;
492
493 /// Get the type and the ArgFlags for the split components of \p RetTy as
494 /// returned by \c ComputeValueVTs.
495 void getReturnInfo(CallingConv::ID CallConv, Type *RetTy, AttributeList Attrs,
497 const DataLayout &DL) const;
498
499 /// Toplevel function to check the return type based on the target calling
500 /// convention. \return True if the return value of \p MF can be returned
501 /// without performing sret demotion.
502 bool checkReturnTypeForCallConv(MachineFunction &MF) const;
503
504 /// This hook must be implemented to check whether the return values
505 /// described by \p Outs can fit into the return registers. If false
506 /// is returned, an sret-demotion is performed.
509 bool IsVarArg) const {
510 return true;
511 }
512
513 /// This hook must be implemented to lower outgoing return values, described
514 /// by \p Val, into the specified virtual registers \p VRegs.
515 /// This hook is used by GlobalISel.
516 ///
517 /// \p FLI is required for sret demotion.
518 ///
519 /// \p SwiftErrorVReg is non-zero if the function has a swifterror parameter
520 /// that needs to be implicitly returned.
521 ///
522 /// \return True if the lowering succeeds, false otherwise.
523 virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
525 Register SwiftErrorVReg) const {
526 if (!supportSwiftError()) {
527 assert(SwiftErrorVReg == 0 && "attempt to use unsupported swifterror");
528 return lowerReturn(MIRBuilder, Val, VRegs, FLI);
529 }
530 return false;
531 }
532
533 /// This hook behaves as the extended lowerReturn function, but for targets
534 /// that do not support swifterror value promotion.
535 virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
536 ArrayRef<Register> VRegs,
537 FunctionLoweringInfo &FLI) const {
538 return false;
539 }
540
541 virtual bool fallBackToDAGISel(const MachineFunction &MF) const {
542 return false;
543 }
544
545 /// This hook must be implemented to lower the incoming (formal)
546 /// arguments, described by \p VRegs, for GlobalISel. Each argument
547 /// must end up in the related virtual registers described by \p VRegs.
548 /// In other words, the first argument should end up in \c VRegs[0],
549 /// the second in \c VRegs[1], and so on. For each argument, there will be one
550 /// register for each non-aggregate type, as returned by \c computeValueLLTs.
551 /// \p MIRBuilder is set to the proper insertion for the argument
552 /// lowering. \p FLI is required for sret demotion.
553 ///
554 /// \return True if the lowering succeeded, false otherwise.
555 virtual bool lowerFormalArguments(MachineIRBuilder &MIRBuilder,
556 const Function &F,
558 FunctionLoweringInfo &FLI) const {
559 return false;
560 }
561
562 /// This hook must be implemented to lower the given call instruction,
563 /// including argument and return value marshalling.
564 ///
565 ///
566 /// \return true if the lowering succeeded, false otherwise.
567 virtual bool lowerCall(MachineIRBuilder &MIRBuilder,
568 CallLoweringInfo &Info) const {
569 return false;
570 }
571
572 /// Lower the given call instruction, including argument and return value
573 /// marshalling.
574 ///
575 /// \p CI is the call/invoke instruction.
576 ///
577 /// \p ResRegs are the registers where the call's return value should be
578 /// stored (or 0 if there is no return value). There will be one register for
579 /// each non-aggregate type, as returned by \c computeValueLLTs.
580 ///
581 /// \p ArgRegs is a list of lists of virtual registers containing each
582 /// argument that needs to be passed (argument \c i should be placed in \c
583 /// ArgRegs[i]). For each argument, there will be one register for each
584 /// non-aggregate type, as returned by \c computeValueLLTs.
585 ///
586 /// \p SwiftErrorVReg is non-zero if the call has a swifterror inout
587 /// parameter, and contains the vreg that the swifterror should be copied into
588 /// after the call.
589 ///
590 /// \p GetCalleeReg is a callback to materialize a register for the callee if
591 /// the target determines it cannot jump to the destination based purely on \p
592 /// CI. This might be because \p CI is indirect, or because of the limited
593 /// range of an immediate jump.
594 ///
595 /// \return true if the lowering succeeded, false otherwise.
596 bool lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &Call,
597 ArrayRef<Register> ResRegs,
598 ArrayRef<ArrayRef<Register>> ArgRegs, Register SwiftErrorVReg,
599 std::optional<PtrAuthInfo> PAI, Register ConvergenceCtrlToken,
600 std::function<Register()> GetCalleeReg) const;
601
602 /// For targets which want to use big-endian can enable it with
603 /// enableBigEndian() hook
604 virtual bool enableBigEndian() const { return false; }
605
606 /// For targets which support the "returned" parameter attribute, returns
607 /// true if the given type is a valid one to use with "returned".
608 virtual bool isTypeIsValidForThisReturn(EVT Ty) const { return false; }
609};
610
611extern template LLVM_ABI void
612CallLowering::setArgFlags<Function>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
613 const DataLayout &DL,
614 const Function &FuncInfo) const;
615
616extern template LLVM_ABI void
617CallLowering::setArgFlags<CallBase>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
618 const DataLayout &DL,
619 const CallBase &FuncInfo) const;
620} // end namespace llvm
621
622#endif // LLVM_CODEGEN_GLOBALISEL_CALLLOWERING_H
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Analysis containing CSE Info
Definition CSEInfo.cpp:27
#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:63
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Metadata node.
Definition Metadata.h:1078
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.
@ 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.
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.
virtual void assignValueToReg(Register ValVReg, Register PhysReg, const CCValAssign &VA)=0
The specified value has been assigned to a physical register, handle the appropriate COPY (either to ...
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,...