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) = 0;
284
285 /// The specified value has been assigned to a stack
286 /// location. Load or store it there, with appropriate extension
287 /// if necessary.
288 virtual void assignValueToAddress(Register ValVReg, Register Addr,
289 LLT MemTy, const MachinePointerInfo &MPO,
290 const CCValAssign &VA) = 0;
291
292 /// An overload which takes an ArgInfo if additional information about the
293 /// arg is needed. \p ValRegIndex is the index in \p Arg.Regs for the value
294 /// to store.
295 virtual void assignValueToAddress(const ArgInfo &Arg, unsigned ValRegIndex,
296 Register Addr, LLT MemTy,
297 const MachinePointerInfo &MPO,
298 const CCValAssign &VA) {
299 assignValueToAddress(Arg.Regs[ValRegIndex], Addr, MemTy, MPO, VA);
300 }
301
302 /// Handle custom values, which may be passed into one or more of \p VAs.
303 /// \p If the handler wants the assignments to be delayed until after
304 /// mem loc assignments, then it sets \p Thunk to the thunk to do the
305 /// assignment.
306 /// \return The number of \p VAs that have been assigned including the
307 /// first one, and which should therefore be skipped from further
308 /// processing.
310 std::function<void()> *Thunk = nullptr) {
311 // This is not a pure virtual method because not all targets need to worry
312 // about custom values.
313 llvm_unreachable("Custom values not supported");
314 }
315
316 /// Do a memory copy of \p MemSize bytes from \p SrcPtr to \p DstPtr. This
317 /// is necessary for outgoing stack-passed byval arguments.
318 void
319 copyArgumentMemory(const ArgInfo &Arg, Register DstPtr, Register SrcPtr,
320 const MachinePointerInfo &DstPtrInfo, Align DstAlign,
321 const MachinePointerInfo &SrcPtrInfo, Align SrcAlign,
322 uint64_t MemSize, CCValAssign &VA) const;
323
324 /// Extend a register to the location type given in VA, capped at extending
325 /// to at most MaxSize bits. If MaxSizeBits is 0 then no maximum is set.
326 Register extendRegister(Register ValReg, const CCValAssign &VA,
327 unsigned MaxSizeBits = 0);
328 };
329
330 /// Base class for ValueHandlers used for arguments coming into the current
331 /// function, or for return values received from a call.
335
336 /// Insert G_ASSERT_ZEXT/G_ASSERT_SEXT or other hint instruction based on \p
337 /// VA, returning the new register if a hint was inserted.
338 Register buildExtensionHint(const CCValAssign &VA, Register SrcReg,
339 LLT NarrowTy);
340
341 /// Provides a default implementation for argument handling.
342 void assignValueToReg(Register ValVReg, Register PhysReg,
343 const CCValAssign &VA) override;
344 };
345
346 /// Base class for ValueHandlers used for arguments passed to a function call,
347 /// or for return values.
352
353protected:
354 /// Getter for generic TargetLowering class.
355 const TargetLowering *getTLI() const {
356 return TLI;
357 }
358
359 /// Getter for target specific TargetLowering class.
360 template <class XXXTargetLowering>
361 const XXXTargetLowering *getTLI() const {
362 return static_cast<const XXXTargetLowering *>(TLI);
363 }
364
365 /// \returns Flags corresponding to the attributes on the \p ArgIdx-th
366 /// parameter of \p Call.
367 ISD::ArgFlagsTy getAttributesForArgIdx(const CallBase &Call,
368 unsigned ArgIdx) const;
369
370 /// \returns Flags corresponding to the attributes on the return from \p Call.
371 ISD::ArgFlagsTy getAttributesForReturn(const CallBase &Call) const;
372
373 /// Adds flags to \p Flags based off of the attributes in \p Attrs.
374 /// \p OpIdx is the index in \p Attrs to add flags from.
375 void addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags,
376 const AttributeList &Attrs,
377 unsigned OpIdx) const;
378
379 template <typename FuncInfoTy>
380 void setArgFlags(ArgInfo &Arg, unsigned OpIdx, const DataLayout &DL,
381 const FuncInfoTy &FuncInfo) const;
382
383 /// Break \p OrigArgInfo into one or more pieces the calling convention can
384 /// process, returned in \p SplitArgs. For example, this should break structs
385 /// down into individual fields.
386 ///
387 /// If \p Offsets is non-null, it points to a vector to be filled in
388 /// with the in-memory offsets of each of the individual values.
389 void splitToValueTypes(const ArgInfo &OrigArgInfo,
390 SmallVectorImpl<ArgInfo> &SplitArgs,
391 const DataLayout &DL, CallingConv::ID CallConv,
392 SmallVectorImpl<TypeSize> *Offsets = nullptr) const;
393
394 /// Analyze the argument list in \p Args, using \p Assigner to populate \p
395 /// CCInfo. This will determine the types and locations to use for passed or
396 /// returned values. This may resize fields in \p Args if the value is split
397 /// across multiple registers or stack slots.
398 ///
399 /// This is independent of the function state and can be used
400 /// to determine how a call would pass arguments without needing to change the
401 /// function. This can be used to check if arguments are suitable for tail
402 /// call lowering.
403 ///
404 /// \return True if everything has succeeded, false otherwise.
405 bool determineAssignments(ValueAssigner &Assigner,
407 CCState &CCInfo) const;
408
409 /// Invoke ValueAssigner::assignArg on each of the given \p Args and then use
410 /// \p Handler to move them to the assigned locations.
411 ///
412 /// \return True if everything has succeeded, false otherwise.
413 bool
414 determineAndHandleAssignments(ValueHandler &Handler, ValueAssigner &Assigner,
416 MachineIRBuilder &MIRBuilder,
417 CallingConv::ID CallConv, bool IsVarArg,
418 ArrayRef<Register> ThisReturnRegs = {}) const;
419
420 /// Use \p Handler to insert code to handle the argument/return values
421 /// represented by \p Args. It's expected determineAssignments previously
422 /// processed these arguments to populate \p CCState and \p ArgLocs.
423 bool handleAssignments(ValueHandler &Handler, SmallVectorImpl<ArgInfo> &Args,
424 CCState &CCState,
425 SmallVectorImpl<CCValAssign> &ArgLocs,
426 MachineIRBuilder &MIRBuilder,
427 ArrayRef<Register> ThisReturnRegs = {}) const;
428
429 /// Check whether parameters to a call that are passed in callee saved
430 /// registers are the same as from the calling function. This needs to be
431 /// checked for tail call eligibility.
432 bool parametersInCSRMatch(const MachineRegisterInfo &MRI,
433 const uint32_t *CallerPreservedMask,
434 const SmallVectorImpl<CCValAssign> &ArgLocs,
435 const SmallVectorImpl<ArgInfo> &OutVals) const;
436
437 /// \returns True if the calling convention for a callee and its caller pass
438 /// results in the same way. Typically used for tail call eligibility checks.
439 ///
440 /// \p Info is the CallLoweringInfo for the call.
441 /// \p MF is the MachineFunction for the caller.
442 /// \p InArgs contains the results of the call.
443 /// \p CalleeAssigner specifies the target's handling of the argument types
444 /// for the callee.
445 /// \p CallerAssigner specifies the target's handling of the
446 /// argument types for the caller.
447 bool resultsCompatible(CallLoweringInfo &Info, MachineFunction &MF,
448 SmallVectorImpl<ArgInfo> &InArgs,
449 ValueAssigner &CalleeAssigner,
450 ValueAssigner &CallerAssigner) const;
451
452public:
453 CallLowering(const TargetLowering *TLI) : TLI(TLI) {}
454 virtual ~CallLowering() = default;
455
456 /// \return true if the target is capable of handling swifterror values that
457 /// have been promoted to a specified register. The extended versions of
458 /// lowerReturn and lowerCall should be implemented.
459 virtual bool supportSwiftError() const {
460 return false;
461 }
462
463 /// Load the returned value from the stack into virtual registers in \p VRegs.
464 /// It uses the frame index \p FI and the start offset from \p DemoteReg.
465 /// The loaded data size will be determined from \p RetTy.
466 void insertSRetLoads(MachineIRBuilder &MIRBuilder, Type *RetTy,
467 ArrayRef<Register> VRegs, Register DemoteReg,
468 int FI) const;
469
470 /// Store the return value given by \p VRegs into stack starting at the offset
471 /// specified in \p DemoteReg.
472 void insertSRetStores(MachineIRBuilder &MIRBuilder, Type *RetTy,
473 ArrayRef<Register> VRegs, Register DemoteReg) const;
474
475 /// Insert the hidden sret ArgInfo to the beginning of \p SplitArgs.
476 /// This function should be called from the target specific
477 /// lowerFormalArguments when \p F requires the sret demotion.
478 void insertSRetIncomingArgument(const Function &F,
479 SmallVectorImpl<ArgInfo> &SplitArgs,
480 Register &DemoteReg, MachineRegisterInfo &MRI,
481 const DataLayout &DL) const;
482
483 /// For the call-base described by \p CB, insert the hidden sret ArgInfo to
484 /// the OrigArgs field of \p Info.
485 void insertSRetOutgoingArgument(MachineIRBuilder &MIRBuilder,
486 const CallBase &CB,
487 CallLoweringInfo &Info) const;
488
489 /// Create a sequence of instructions to combine pieces split into register
490 /// typed values to the original IR value. \p OrigRegs contains the
491 /// destination value registers of type \p LLTy, and \p Regs contains the
492 /// legalized pieces with type \p PartLLT. This is used for incoming values
493 /// (physregs to vregs).
494 static void buildCopyFromRegs(MachineIRBuilder &B,
495 ArrayRef<Register> OrigRegs,
496 ArrayRef<Register> Regs, LLT LLTy, LLT PartLLT,
497 const ISD::ArgFlagsTy Flags);
498
499 /// Create a sequence of instructions to expand the value in \p SrcReg (of
500 /// type
501 /// \p SrcTy) to the types in \p DstRegs (of type \p PartTy). \p ExtendOp
502 /// should contain the type of scalar value extension if necessary.
503 ///
504 /// This is used for outgoing values (vregs to physregs)
505 static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
506 Register SrcReg, LLT SrcTy, LLT PartTy,
507 unsigned ExtendOp = TargetOpcode::G_ANYEXT);
508
509 /// \return True if the return type described by \p Outs can be returned
510 /// without performing sret demotion.
511 bool checkReturn(CCState &CCInfo, SmallVectorImpl<BaseArgInfo> &Outs,
512 CCAssignFn *Fn) const;
513
514 /// Get the type and the ArgFlags for the split components of \p RetTy as
515 /// returned by \c ComputeValueVTs.
516 void getReturnInfo(CallingConv::ID CallConv, Type *RetTy, AttributeList Attrs,
518 const DataLayout &DL) const;
519
520 /// Toplevel function to check the return type based on the target calling
521 /// convention. \return True if the return value of \p MF can be returned
522 /// without performing sret demotion.
523 bool checkReturnTypeForCallConv(MachineFunction &MF) const;
524
525 /// This hook must be implemented to check whether the return values
526 /// described by \p Outs can fit into the return registers. If false
527 /// is returned, an sret-demotion is performed.
530 bool IsVarArg) const {
531 return true;
532 }
533
534 /// This hook must be implemented to lower outgoing return values, described
535 /// by \p Val, into the specified virtual registers \p VRegs.
536 /// This hook is used by GlobalISel.
537 ///
538 /// \p FLI is required for sret demotion.
539 ///
540 /// \p SwiftErrorVReg is non-zero if the function has a swifterror parameter
541 /// that needs to be implicitly returned.
542 ///
543 /// \return True if the lowering succeeds, false otherwise.
544 virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
546 Register SwiftErrorVReg) const {
547 if (!supportSwiftError()) {
548 assert(SwiftErrorVReg == 0 && "attempt to use unsupported swifterror");
549 return lowerReturn(MIRBuilder, Val, VRegs, FLI);
550 }
551 return false;
552 }
553
554 /// This hook behaves as the extended lowerReturn function, but for targets
555 /// that do not support swifterror value promotion.
556 virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
557 ArrayRef<Register> VRegs,
558 FunctionLoweringInfo &FLI) const {
559 return false;
560 }
561
562 virtual bool fallBackToDAGISel(const MachineFunction &MF) const {
563 return false;
564 }
565
566 /// This hook must be implemented to lower the incoming (formal)
567 /// arguments, described by \p VRegs, for GlobalISel. Each argument
568 /// must end up in the related virtual registers described by \p VRegs.
569 /// In other words, the first argument should end up in \c VRegs[0],
570 /// the second in \c VRegs[1], and so on. For each argument, there will be one
571 /// register for each non-aggregate type, as returned by \c computeValueLLTs.
572 /// \p MIRBuilder is set to the proper insertion for the argument
573 /// lowering. \p FLI is required for sret demotion.
574 ///
575 /// \return True if the lowering succeeded, false otherwise.
576 virtual bool lowerFormalArguments(MachineIRBuilder &MIRBuilder,
577 const Function &F,
579 FunctionLoweringInfo &FLI) const {
580 return false;
581 }
582
583 /// This hook must be implemented to lower the given call instruction,
584 /// including argument and return value marshalling.
585 ///
586 ///
587 /// \return true if the lowering succeeded, false otherwise.
588 virtual bool lowerCall(MachineIRBuilder &MIRBuilder,
589 CallLoweringInfo &Info) const {
590 return false;
591 }
592
593 /// Lower the given call instruction, including argument and return value
594 /// marshalling.
595 ///
596 /// \p CI is the call/invoke instruction.
597 ///
598 /// \p ResRegs are the registers where the call's return value should be
599 /// stored (or 0 if there is no return value). There will be one register for
600 /// each non-aggregate type, as returned by \c computeValueLLTs.
601 ///
602 /// \p ArgRegs is a list of lists of virtual registers containing each
603 /// argument that needs to be passed (argument \c i should be placed in \c
604 /// ArgRegs[i]). For each argument, there will be one register for each
605 /// non-aggregate type, as returned by \c computeValueLLTs.
606 ///
607 /// \p SwiftErrorVReg is non-zero if the call has a swifterror inout
608 /// parameter, and contains the vreg that the swifterror should be copied into
609 /// after the call.
610 ///
611 /// \p GetCalleeReg is a callback to materialize a register for the callee if
612 /// the target determines it cannot jump to the destination based purely on \p
613 /// CI. This might be because \p CI is indirect, or because of the limited
614 /// range of an immediate jump.
615 ///
616 /// \return true if the lowering succeeded, false otherwise.
617 bool lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &Call,
618 ArrayRef<Register> ResRegs,
619 ArrayRef<ArrayRef<Register>> ArgRegs, Register SwiftErrorVReg,
620 std::optional<PtrAuthInfo> PAI, Register ConvergenceCtrlToken,
621 std::function<Register()> GetCalleeReg) const;
622
623 /// For targets which want to use big-endian can enable it with
624 /// enableBigEndian() hook
625 virtual bool enableBigEndian() const { return false; }
626
627 /// For targets which support the "returned" parameter attribute, returns
628 /// true if the given type is a valid one to use with "returned".
629 virtual bool isTypeIsValidForThisReturn(EVT Ty) const { return false; }
630};
631
632extern template LLVM_ABI void
633CallLowering::setArgFlags<Function>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
634 const DataLayout &DL,
635 const Function &FuncInfo) const;
636
637extern template LLVM_ABI void
638CallLowering::setArgFlags<CallBase>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
639 const DataLayout &DL,
640 const CallBase &FuncInfo) const;
641} // end namespace llvm
642
643#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.
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,...