class CallLowering

Declaration

class CallLowering { /* full declaration omitted */ };

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:44

Member Variables

private const llvm::TargetLowering* TLI

Method Overview

  • public CallLowering(const llvm::TargetLowering * TLI)
  • protected void addArgFlagsFromAttributes(ISD::ArgFlagsTy & Flags, const llvm::AttributeList & Attrs, unsigned int OpIdx) const
  • private virtual void anchor()
  • public virtual bool canLowerReturn(llvm::MachineFunction & MF, CallingConv::ID CallConv, SmallVectorImpl<llvm::CallLowering::BaseArgInfo> & Outs, bool IsVarArg) const
  • public bool checkReturn(llvm::CCState & CCInfo, SmallVectorImpl<llvm::CallLowering::BaseArgInfo> & Outs, llvm::CCAssignFn * Fn) const
  • public bool checkReturnTypeForCallConv(llvm::MachineFunction & MF) const
  • protected bool determineAndHandleAssignments(llvm::CallLowering::ValueHandler & Handler, llvm::CallLowering::ValueAssigner & Assigner, SmallVectorImpl<llvm::CallLowering::ArgInfo> & Args, llvm::MachineIRBuilder & MIRBuilder, CallingConv::ID CallConv, bool IsVarArg, ArrayRef<llvm::Register> ThisReturnRegs = None) const
  • protected bool determineAssignments(llvm::CallLowering::ValueAssigner & Assigner, SmallVectorImpl<llvm::CallLowering::ArgInfo> & Args, llvm::CCState & CCInfo) const
  • public virtual bool enableBigEndian() const
  • public virtual bool fallBackToDAGISel(const llvm::MachineFunction & MF) const
  • protected ISD::ArgFlagsTy getAttributesForArgIdx(const llvm::CallBase & Call, unsigned int ArgIdx) const
  • public void getReturnInfo(CallingConv::ID CallConv, llvm::Type * RetTy, llvm::AttributeList Attrs, SmallVectorImpl<llvm::CallLowering::BaseArgInfo> & Outs, const llvm::DataLayout & DL) const
  • protected const llvm::TargetLowering * getTLI() const
  • protected template <class XXXTargetLowering>const XXXTargetLowering * getTLI() const
  • protected bool handleAssignments(llvm::CallLowering::ValueHandler & Handler, SmallVectorImpl<llvm::CallLowering::ArgInfo> & Args, llvm::CCState & CCState, SmallVectorImpl<llvm::CCValAssign> & ArgLocs, llvm::MachineIRBuilder & MIRBuilder, ArrayRef<llvm::Register> ThisReturnRegs = None) const
  • public void insertSRetIncomingArgument(const llvm::Function & F, SmallVectorImpl<llvm::CallLowering::ArgInfo> & SplitArgs, llvm::Register & DemoteReg, llvm::MachineRegisterInfo & MRI, const llvm::DataLayout & DL) const
  • public void insertSRetLoads(llvm::MachineIRBuilder & MIRBuilder, llvm::Type * RetTy, ArrayRef<llvm::Register> VRegs, llvm::Register DemoteReg, int FI) const
  • public void insertSRetOutgoingArgument(llvm::MachineIRBuilder & MIRBuilder, const llvm::CallBase & CB, llvm::CallLowering::CallLoweringInfo & Info) const
  • public void insertSRetStores(llvm::MachineIRBuilder & MIRBuilder, llvm::Type * RetTy, ArrayRef<llvm::Register> VRegs, llvm::Register DemoteReg) const
  • public virtual bool isTypeIsValidForThisReturn(llvm::EVT Ty) const
  • public virtual bool lowerCall(llvm::MachineIRBuilder & MIRBuilder, llvm::CallLowering::CallLoweringInfo & Info) const
  • public bool lowerCall(llvm::MachineIRBuilder & MIRBuilder, const llvm::CallBase & Call, ArrayRef<llvm::Register> ResRegs, ArrayRef<ArrayRef<llvm::Register>> ArgRegs, llvm::Register SwiftErrorVReg, std::function<unsigned int ()> GetCalleeReg) const
  • public virtual bool lowerFormalArguments(llvm::MachineIRBuilder & MIRBuilder, const llvm::Function & F, ArrayRef<ArrayRef<llvm::Register>> VRegs, llvm::FunctionLoweringInfo & FLI) const
  • public virtual bool lowerReturn(llvm::MachineIRBuilder & MIRBuilder, const llvm::Value * Val, ArrayRef<llvm::Register> VRegs, llvm::FunctionLoweringInfo & FLI, llvm::Register SwiftErrorVReg) const
  • public virtual bool lowerReturn(llvm::MachineIRBuilder & MIRBuilder, const llvm::Value * Val, ArrayRef<llvm::Register> VRegs, llvm::FunctionLoweringInfo & FLI) const
  • protected bool parametersInCSRMatch(const llvm::MachineRegisterInfo & MRI, const uint32_t * CallerPreservedMask, const SmallVectorImpl<llvm::CCValAssign> & ArgLocs, const SmallVectorImpl<llvm::CallLowering::ArgInfo> & OutVals) const
  • protected bool resultsCompatible(llvm::CallLowering::CallLoweringInfo & Info, llvm::MachineFunction & MF, SmallVectorImpl<llvm::CallLowering::ArgInfo> & InArgs, llvm::CallLowering::ValueAssigner & CalleeAssigner, llvm::CallLowering::ValueAssigner & CallerAssigner) const
  • protected template <typename FuncInfoTy>void setArgFlags(llvm::CallLowering::ArgInfo & Arg, unsigned int OpIdx, const llvm::DataLayout & DL, const FuncInfoTy & FuncInfo) const
  • protected void splitToValueTypes(const llvm::CallLowering::ArgInfo & OrigArgInfo, SmallVectorImpl<llvm::CallLowering::ArgInfo> & SplitArgs, const llvm::DataLayout & DL, CallingConv::ID CallConv, SmallVectorImpl<uint64_t> * Offsets = nullptr) const
  • public virtual bool supportSwiftError() const
  • public virtual ~CallLowering()

Methods

CallLowering(const llvm::TargetLowering* TLI)

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:432

Parameters

const llvm::TargetLowering* TLI

void addArgFlagsFromAttributes(
    ISD::ArgFlagsTy& Flags,
    const llvm::AttributeList& Attrs,
    unsigned int OpIdx) const

Description

Adds flags to \p Flags based off of the attributes in \p Attrs. \p OpIdx is the index in \p Attrs to add flags from.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:354

Parameters

ISD::ArgFlagsTy& Flags
const llvm::AttributeList& Attrs
unsigned int OpIdx

virtual void anchor()

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:47

virtual bool canLowerReturn(
    llvm::MachineFunction& MF,
    CallingConv::ID CallConv,
    SmallVectorImpl<
        llvm::CallLowering::BaseArgInfo>& Outs,
    bool IsVarArg) const

Description

This hook must be implemented to check whether the return values described by \p Outs can fit into the return registers. If false is returned, an sret-demotion is performed.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:487

Parameters

llvm::MachineFunction& MF
CallingConv::ID CallConv
SmallVectorImpl<llvm::CallLowering::BaseArgInfo>& Outs
bool IsVarArg

bool checkReturn(
    llvm::CCState& CCInfo,
    SmallVectorImpl<
        llvm::CallLowering::BaseArgInfo>& Outs,
    llvm::CCAssignFn* Fn) const

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:470

Parameters

llvm::CCState& CCInfo
SmallVectorImpl<llvm::CallLowering::BaseArgInfo>& Outs
llvm::CCAssignFn* Fn

Returns

True if the return type described by \p Outs can be returned without performing sret demotion.

bool checkReturnTypeForCallConv(
    llvm::MachineFunction& MF) const

Description

Toplevel function to check the return type based on the target calling convention.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:482

Parameters

llvm::MachineFunction& MF

Returns

True if the return value of \p MF can be returned without performing sret demotion.

bool determineAndHandleAssignments(
    llvm::CallLowering::ValueHandler& Handler,
    llvm::CallLowering::ValueAssigner& Assigner,
    SmallVectorImpl<llvm::CallLowering::ArgInfo>&
        Args,
    llvm::MachineIRBuilder& MIRBuilder,
    CallingConv::ID CallConv,
    bool IsVarArg,
    ArrayRef<llvm::Register> ThisReturnRegs =
        None) const

Description

Invoke ValueAssigner::assignArg on each of the given \p Args and then use\p Handler to move them to the assigned locations.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:393

Parameters

llvm::CallLowering::ValueHandler& Handler
llvm::CallLowering::ValueAssigner& Assigner
SmallVectorImpl<llvm::CallLowering::ArgInfo>& Args
llvm::MachineIRBuilder& MIRBuilder
CallingConv::ID CallConv
bool IsVarArg
ArrayRef<llvm::Register> ThisReturnRegs = None

Returns

True if everything has succeeded, false otherwise.

bool determineAssignments(
    llvm::CallLowering::ValueAssigner& Assigner,
    SmallVectorImpl<llvm::CallLowering::ArgInfo>&
        Args,
    llvm::CCState& CCInfo) const

Description

Analyze the argument list in \p Args, using \p Assigner to populate \p CCInfo. This will determine the types and locations to use for passed or returned values. This may resize fields in \p Args if the value is split across multiple registers or stack slots. This is independent of the function state and can be used to determine how a call would pass arguments without needing to change the function. This can be used to check if arguments are suitable for tail call lowering.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:384

Parameters

llvm::CallLowering::ValueAssigner& Assigner
SmallVectorImpl<llvm::CallLowering::ArgInfo>& Args
llvm::CCState& CCInfo

Returns

True if everything has succeeded, false otherwise.

virtual bool enableBigEndian() const

Description

For targets which want to use big-endian can enable it with enableBigEndian() hook

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:583

virtual bool fallBackToDAGISel(
    const llvm::MachineFunction& MF) const

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:521

Parameters

const llvm::MachineFunction& MF

ISD::ArgFlagsTy getAttributesForArgIdx(
    const llvm::CallBase& Call,
    unsigned int ArgIdx) const

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:349

Parameters

const llvm::CallBase& Call
unsigned int ArgIdx

Returns

Flags corresponding to the attributes on the \p ArgIdx-th parameter of \p Call.

void getReturnInfo(
    CallingConv::ID CallConv,
    llvm::Type* RetTy,
    llvm::AttributeList Attrs,
    SmallVectorImpl<
        llvm::CallLowering::BaseArgInfo>& Outs,
    const llvm::DataLayout& DL) const

Description

Get the type and the ArgFlags for the split components of \p RetTy as returned by \c ComputeValueVTs.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:475

Parameters

CallingConv::ID CallConv
llvm::Type* RetTy
llvm::AttributeList Attrs
SmallVectorImpl<llvm::CallLowering::BaseArgInfo>& Outs
const llvm::DataLayout& DL

const llvm::TargetLowering* getTLI() const

Description

Getter for generic TargetLowering class.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:337

template <class XXXTargetLowering>
const XXXTargetLowering* getTLI() const

Description

Getter for target specific TargetLowering class.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:343

Templates

XXXTargetLowering

bool handleAssignments(
    llvm::CallLowering::ValueHandler& Handler,
    SmallVectorImpl<llvm::CallLowering::ArgInfo>&
        Args,
    llvm::CCState& CCState,
    SmallVectorImpl<llvm::CCValAssign>& ArgLocs,
    llvm::MachineIRBuilder& MIRBuilder,
    ArrayRef<llvm::Register> ThisReturnRegs =
        None) const

Description

Use \p Handler to insert code to handle the argument/return values represented by \p Args. It's expected determineAssignments previously processed these arguments to populate \p CCState and \p ArgLocs.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:402

Parameters

llvm::CallLowering::ValueHandler& Handler
SmallVectorImpl<llvm::CallLowering::ArgInfo>& Args
llvm::CCState& CCState
SmallVectorImpl<llvm::CCValAssign>& ArgLocs
llvm::MachineIRBuilder& MIRBuilder
ArrayRef<llvm::Register> ThisReturnRegs = None

void insertSRetIncomingArgument(
    const llvm::Function& F,
    SmallVectorImpl<llvm::CallLowering::ArgInfo>&
        SplitArgs,
    llvm::Register& DemoteReg,
    llvm::MachineRegisterInfo& MRI,
    const llvm::DataLayout& DL) const

Description

Insert the hidden sret ArgInfo to the beginning of \p SplitArgs. This function should be called from the target specific lowerFormalArguments when \p F requires the sret demotion.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:457

Parameters

const llvm::Function& F
SmallVectorImpl<llvm::CallLowering::ArgInfo>& SplitArgs
llvm::Register& DemoteReg
llvm::MachineRegisterInfo& MRI
const llvm::DataLayout& DL

void insertSRetLoads(
    llvm::MachineIRBuilder& MIRBuilder,
    llvm::Type* RetTy,
    ArrayRef<llvm::Register> VRegs,
    llvm::Register DemoteReg,
    int FI) const

Description

Load the returned value from the stack into virtual registers in \p VRegs. It uses the frame index \p FI and the start offset from \p DemoteReg. The loaded data size will be determined from \p RetTy.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:445

Parameters

llvm::MachineIRBuilder& MIRBuilder
llvm::Type* RetTy
ArrayRef<llvm::Register> VRegs
llvm::Register DemoteReg
int FI

void insertSRetOutgoingArgument(
    llvm::MachineIRBuilder& MIRBuilder,
    const llvm::CallBase& CB,
    llvm::CallLowering::CallLoweringInfo& Info)
    const

Description

For the call-base described by \p CB, insert the hidden sret ArgInfo to the OrigArgs field of \p Info.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:464

Parameters

llvm::MachineIRBuilder& MIRBuilder
const llvm::CallBase& CB
llvm::CallLowering::CallLoweringInfo& Info

void insertSRetStores(
    llvm::MachineIRBuilder& MIRBuilder,
    llvm::Type* RetTy,
    ArrayRef<llvm::Register> VRegs,
    llvm::Register DemoteReg) const

Description

Store the return value given by \p VRegs into stack starting at the offset specified in \p DemoteReg.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:451

Parameters

llvm::MachineIRBuilder& MIRBuilder
llvm::Type* RetTy
ArrayRef<llvm::Register> VRegs
llvm::Register DemoteReg

virtual bool isTypeIsValidForThisReturn(
    llvm::EVT Ty) const

Description

For targets which support the "returned" parameter attribute, returns true if the given type is a valid one to use with "returned".

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:587

Parameters

llvm::EVT Ty

virtual bool lowerCall(
    llvm::MachineIRBuilder& MIRBuilder,
    llvm::CallLowering::CallLoweringInfo& Info)
    const

Description

This hook must be implemented to lower the given call instruction, including argument and return value marshalling.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:547

Parameters

llvm::MachineIRBuilder& MIRBuilder
llvm::CallLowering::CallLoweringInfo& Info

Returns

true if the lowering succeeded, false otherwise.

bool lowerCall(
    llvm::MachineIRBuilder& MIRBuilder,
    const llvm::CallBase& Call,
    ArrayRef<llvm::Register> ResRegs,
    ArrayRef<ArrayRef<llvm::Register>> ArgRegs,
    llvm::Register SwiftErrorVReg,
    std::function<unsigned int()> GetCalleeReg)
    const

Description

Lower the given call instruction, including argument and return value marshalling. \p CI is the call/invoke instruction. \p ResRegs are the registers where the call's return value should be stored (or 0 if there is no return value). There will be one register for each non-aggregate type, as returned by \c computeValueLLTs. \p ArgRegs is a list of lists of virtual registers containing each argument that needs to be passed (argument \c i should be placed in \c ArgRegs[i]). For each argument, there will be one register for each non-aggregate type, as returned by \c computeValueLLTs. \p SwiftErrorVReg is non-zero if the call has a swifterror inout parameter, and contains the vreg that the swifterror should be copied into after the call. \p GetCalleeReg is a callback to materialize a register for the callee if the target determines it cannot jump to the destination based purely on \p CI. This might be because \p CI is indirect, or because of the limited range of an immediate jump.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:576

Parameters

llvm::MachineIRBuilder& MIRBuilder
const llvm::CallBase& Call
ArrayRef<llvm::Register> ResRegs
ArrayRef<ArrayRef<llvm::Register>> ArgRegs
llvm::Register SwiftErrorVReg
std::function<unsigned int()> GetCalleeReg

Returns

true if the lowering succeeded, false otherwise.

virtual bool lowerFormalArguments(
    llvm::MachineIRBuilder& MIRBuilder,
    const llvm::Function& F,
    ArrayRef<ArrayRef<llvm::Register>> VRegs,
    llvm::FunctionLoweringInfo& FLI) const

Description

This hook must be implemented to lower the incoming (formal) arguments, described by \p VRegs, for GlobalISel. Each argument must end up in the related virtual registers described by \p VRegs. In other words, the first argument should end up in \c VRegs[0], the second in \c VRegs[1], and so on. For each argument, there will be one register for each non-aggregate type, as returned by \c computeValueLLTs. \p MIRBuilder is set to the proper insertion for the argument lowering. \p FLI is required for sret demotion.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:535

Parameters

llvm::MachineIRBuilder& MIRBuilder
const llvm::Function& F
ArrayRef<ArrayRef<llvm::Register>> VRegs
llvm::FunctionLoweringInfo& FLI

Returns

True if the lowering succeeded, false otherwise.

virtual bool lowerReturn(
    llvm::MachineIRBuilder& MIRBuilder,
    const llvm::Value* Val,
    ArrayRef<llvm::Register> VRegs,
    llvm::FunctionLoweringInfo& FLI,
    llvm::Register SwiftErrorVReg) const

Description

This hook must be implemented to lower outgoing return values, described by \p Val, into the specified virtual registers \p VRegs. This hook is used by GlobalISel. \p FLI is required for sret demotion. \p SwiftErrorVReg is non-zero if the function has a swifterror parameter that needs to be implicitly returned.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:503

Parameters

llvm::MachineIRBuilder& MIRBuilder
const llvm::Value* Val
ArrayRef<llvm::Register> VRegs
llvm::FunctionLoweringInfo& FLI
llvm::Register SwiftErrorVReg

Returns

True if the lowering succeeds, false otherwise.

virtual bool lowerReturn(
    llvm::MachineIRBuilder& MIRBuilder,
    const llvm::Value* Val,
    ArrayRef<llvm::Register> VRegs,
    llvm::FunctionLoweringInfo& FLI) const

Description

This hook behaves as the extended lowerReturn function, but for targets that do not support swifterror value promotion.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:515

Parameters

llvm::MachineIRBuilder& MIRBuilder
const llvm::Value* Val
ArrayRef<llvm::Register> VRegs
llvm::FunctionLoweringInfo& FLI

bool parametersInCSRMatch(
    const llvm::MachineRegisterInfo& MRI,
    const uint32_t* CallerPreservedMask,
    const SmallVectorImpl<llvm::CCValAssign>&
        ArgLocs,
    const SmallVectorImpl<
        llvm::CallLowering::ArgInfo>& OutVals)
    const

Description

Check whether parameters to a call that are passed in callee saved registers are the same as from the calling function. This needs to be checked for tail call eligibility.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:411

Parameters

const llvm::MachineRegisterInfo& MRI
const uint32_t* CallerPreservedMask
const SmallVectorImpl<llvm::CCValAssign>& ArgLocs
const SmallVectorImpl< llvm::CallLowering::ArgInfo>& OutVals

bool resultsCompatible(
    llvm::CallLowering::CallLoweringInfo& Info,
    llvm::MachineFunction& MF,
    SmallVectorImpl<llvm::CallLowering::ArgInfo>&
        InArgs,
    llvm::CallLowering::ValueAssigner&
        CalleeAssigner,
    llvm::CallLowering::ValueAssigner&
        CallerAssigner) const

Description

\p Info is the CallLoweringInfo for the call.\p MF is the MachineFunction for the caller.\p InArgs contains the results of the call.\p CalleeAssigner specifies the target's handling of the argument types for the callee.\p CallerAssigner specifies the target's handling of the argument types for the caller.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:426

Parameters

llvm::CallLowering::CallLoweringInfo& Info
llvm::MachineFunction& MF
SmallVectorImpl<llvm::CallLowering::ArgInfo>& InArgs
llvm::CallLowering::ValueAssigner& CalleeAssigner
llvm::CallLowering::ValueAssigner& CallerAssigner

Returns

True if the calling convention for a callee and its caller pass results in the same way. Typically used for tail call eligibility checks.

template <typename FuncInfoTy>
void setArgFlags(llvm::CallLowering::ArgInfo& Arg,
                 unsigned int OpIdx,
                 const llvm::DataLayout& DL,
                 const FuncInfoTy& FuncInfo) const

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:359

Templates

FuncInfoTy

Parameters

llvm::CallLowering::ArgInfo& Arg
unsigned int OpIdx
const llvm::DataLayout& DL
const FuncInfoTy& FuncInfo

void splitToValueTypes(
    const llvm::CallLowering::ArgInfo&
        OrigArgInfo,
    SmallVectorImpl<llvm::CallLowering::ArgInfo>&
        SplitArgs,
    const llvm::DataLayout& DL,
    CallingConv::ID CallConv,
    SmallVectorImpl<uint64_t>* Offsets =
        nullptr) const

Description

Break \p OrigArgInfo into one or more pieces the calling convention can process, returned in \p SplitArgs. For example, this should break structs down into individual fields. If \p Offsets is non-null, it points to a vector to be filled in with the in-memory offsets of each of the individual values.

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:368

Parameters

const llvm::CallLowering::ArgInfo& OrigArgInfo
SmallVectorImpl<llvm::CallLowering::ArgInfo>& SplitArgs
const llvm::DataLayout& DL
CallingConv::ID CallConv
SmallVectorImpl<uint64_t>* Offsets = nullptr

virtual bool supportSwiftError() const

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:438

Returns

true if the target is capable of handling swifterror values that have been promoted to a specified register. The extended versions of lowerReturn and lowerCall should be implemented.

virtual ~CallLowering()

Declared at: llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h:433