LLVM 19.0.0git
Macros | Typedefs | Functions | Variables
StatepointLowering.cpp File Reference
#include "StatepointLowering.h"
#include "SelectionDAGBuilder.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/FunctionLoweringInfo.h"
#include "llvm/CodeGen/GCMetadata.h"
#include "llvm/CodeGen/ISDOpcodes.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/RuntimeLibcalls.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
#include "llvm/CodeGen/StackMaps.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/CodeGenTypes/MachineValueType.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/GCStrategy.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Statepoint.h"
#include "llvm/IR/Type.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <iterator>
#include <tuple>
#include <utility>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "statepoint-lowering"
 

Typedefs

typedef FunctionLoweringInfo::StatepointRelocationRecord RecordType
 

Functions

 STATISTIC (NumSlotsAllocatedForStatepoints, "Number of stack slots allocated for statepoints")
 
 STATISTIC (NumOfStatepoints, "Number of statepoint nodes encountered")
 
 STATISTIC (StatepointMaxSlotsRequired, "Maximum number of stack slots required for a singe statepoint")
 
static void pushStackMapConstant (SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder, uint64_t Value)
 
static std::optional< int > findPreviousSpillSlot (const Value *Val, SelectionDAGBuilder &Builder, int LookUpDepth)
 Utility function for reservePreviousStackSlotForValue.
 
static bool willLowerDirectly (SDValue Incoming)
 Return true if-and-only-if the given SDValue can be lowered as either a constant argument or a stack reference.
 
static void reservePreviousStackSlotForValue (const Value *IncomingValue, SelectionDAGBuilder &Builder)
 Try to find existing copies of the incoming values in stack slots used for statepoint spilling.
 
static std::pair< SDValue, SDNode * > lowerCallFromStatepointLoweringInfo (SelectionDAGBuilder::StatepointLoweringInfo &SI, SelectionDAGBuilder &Builder)
 Extract call from statepoint, lower it and return pointer to the call node.
 
static MachineMemOperandgetMachineMemOperand (MachineFunction &MF, FrameIndexSDNode &FI)
 
static std::tuple< SDValue, SDValue, MachineMemOperand * > spillIncomingStatepointValue (SDValue Incoming, SDValue Chain, SelectionDAGBuilder &Builder)
 Spill a value incoming to the statepoint.
 
static void lowerIncomingStatepointValue (SDValue Incoming, bool RequireSpillSlot, SmallVectorImpl< SDValue > &Ops, SmallVectorImpl< MachineMemOperand * > &MemRefs, SelectionDAGBuilder &Builder)
 Lower a single value incoming to a statepoint node.
 
static bool isGCValue (const Value *V, SelectionDAGBuilder &Builder)
 Return true if value V represents the GC value.
 
static void lowerStatepointMetaArgs (SmallVectorImpl< SDValue > &Ops, SmallVectorImpl< MachineMemOperand * > &MemRefs, SmallVectorImpl< SDValue > &GCPtrs, DenseMap< SDValue, int > &LowerAsVReg, SelectionDAGBuilder::StatepointLoweringInfo &SI, SelectionDAGBuilder &Builder)
 Lower deopt state and gc pointer arguments of the statepoint.
 
static std::pair< const GCResultInst *, const GCResultInst * > getGCResultLocality (const GCStatepointInst &S)
 Return two gc.results if present.
 

Variables

static cl::opt< boolUseRegistersForDeoptValues ("use-registers-for-deopt-values", cl::Hidden, cl::init(false), cl::desc("Allow using registers for non pointer deopt args"))
 
static cl::opt< boolUseRegistersForGCPointersInLandingPad ("use-registers-for-gc-values-in-landing-pad", cl::Hidden, cl::init(false), cl::desc("Allow using registers for gc pointer in landing pad"))
 
static cl::opt< unsignedMaxRegistersForGCPointers ("max-registers-for-gc-values", cl::Hidden, cl::init(0), cl::desc("Max number of VRegs allowed to pass GC pointer meta args in"))
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "statepoint-lowering"

Definition at line 57 of file StatepointLowering.cpp.

Typedef Documentation

◆ RecordType

Definition at line 77 of file StatepointLowering.cpp.

Function Documentation

◆ findPreviousSpillSlot()

static std::optional< int > findPreviousSpillSlot ( const Value Val,
SelectionDAGBuilder Builder,
int  LookUpDepth 
)
static

Utility function for reservePreviousStackSlotForValue.

Tries to find stack slot index to which we have spilled value for previous statepoints. LookUpDepth specifies maximum DFS depth this function is allowed to look.

Definition at line 161 of file StatepointLowering.cpp.

References assert(), findPreviousSpillSlot(), llvm::SelectionDAGBuilder::FuncInfo, llvm::FunctionLoweringInfo::StatepointRelocationRecord::Spill, and llvm::FunctionLoweringInfo::StatepointRelocationMaps.

Referenced by findPreviousSpillSlot(), and reservePreviousStackSlotForValue().

◆ getGCResultLocality()

static std::pair< const GCResultInst *, const GCResultInst * > getGCResultLocality ( const GCStatepointInst S)
static

Return two gc.results if present.

First result is a block local gc.result, second result is a non-block local gc.result. Corresponding entry will be nullptr if not present.

Definition at line 996 of file StatepointLowering.cpp.

References llvm::Instruction::getParent(), and llvm::Value::users().

Referenced by llvm::SelectionDAGBuilder::LowerStatepoint().

◆ getMachineMemOperand()

static MachineMemOperand * getMachineMemOperand ( MachineFunction MF,
FrameIndexSDNode FI 
)
static

◆ isGCValue()

static bool isGCValue ( const Value V,
SelectionDAGBuilder Builder 
)
static

Return true if value V represents the GC value.

The behavior is conservative in case it is not sure that value is not GC the function returns true.

Definition at line 500 of file StatepointLowering.cpp.

References llvm::SelectionDAGBuilder::GFI.

Referenced by llvm::SelectionDAGBuilder::LowerStatepoint(), and lowerStatepointMetaArgs().

◆ lowerCallFromStatepointLoweringInfo()

static std::pair< SDValue, SDNode * > lowerCallFromStatepointLoweringInfo ( SelectionDAGBuilder::StatepointLoweringInfo SI,
SelectionDAGBuilder Builder 
)
static

Extract call from statepoint, lower it and return pointer to the call node.

Also update NodeMap so that getValue(statepoint) will reference lowered call result

Definition at line 319 of file StatepointLowering.cpp.

References assert(), llvm::ISD::CALLSEQ_END, llvm::ISD::CopyFromReg, llvm::SDValue::getNode(), llvm::SDNode::getOpcode(), llvm::SDNode::getOperand(), llvm::ISD::LOAD, and llvm::SelectionDAGBuilder::lowerInvokable().

Referenced by llvm::SelectionDAGBuilder::LowerAsSTATEPOINT().

◆ lowerIncomingStatepointValue()

static void lowerIncomingStatepointValue ( SDValue  Incoming,
bool  RequireSpillSlot,
SmallVectorImpl< SDValue > &  Ops,
SmallVectorImpl< MachineMemOperand * > &  MemRefs,
SelectionDAGBuilder Builder 
)
static

◆ lowerStatepointMetaArgs()

static void lowerStatepointMetaArgs ( SmallVectorImpl< SDValue > &  Ops,
SmallVectorImpl< MachineMemOperand * > &  MemRefs,
SmallVectorImpl< SDValue > &  GCPtrs,
DenseMap< SDValue, int > &  LowerAsVReg,
SelectionDAGBuilder::StatepointLoweringInfo SI,
SelectionDAGBuilder Builder 
)
static

Lower deopt state and gc pointer arguments of the statepoint.

The actual lowering is described in lowerIncomingStatepointValue. This function is responsible for lowering everything in the right position and playing some tricks to avoid redundant stack manipulation where possible. On completion, 'Ops' will contain ready to use operands for machine code statepoint. The chain nodes will have already been created and the DAG root will be set to the last value spilled (if any were).

Definition at line 518 of file StatepointLowering.cpp.

References llvm::SmallVectorImpl< T >::append(), assert(), llvm::sampleprof::Base, llvm::SmallVectorTemplateCommon< T, typename >::begin(), llvm::SmallSet< T, N, C >::count(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::SelectionDAGBuilder::DAG, llvm::dbgs(), llvm::DeoptLiveIn, llvm::SDValue::dump(), llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::SelectionDAGBuilder::FuncInfo, llvm::FunctionLoweringInfo::getArgumentFrameIndex(), llvm::SelectionDAGBuilder::getCurSDLoc(), llvm::SelectionDAG::getFrameIndex(), llvm::SelectionDAGBuilder::getFrameIndexTy(), llvm::SelectionDAG::getMachineFunction(), getMachineMemOperand(), llvm::SelectionDAG::getTargetConstant(), llvm::SelectionDAG::getTargetFrameIndex(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SelectionDAGBuilder::getValue(), llvm::SDValue::getValueType(), llvm::SmallSet< T, N, C >::insert(), llvm::SetVector< T, Vector, Set, N >::insert(), isGCValue(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), LLVM_DEBUG, lowerIncomingStatepointValue(), MaxRegistersForGCPointers, llvm::SmallVectorTemplateBase< T, bool >::push_back(), pushStackMapConstant(), reservePreviousStackSlotForValue(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::size(), llvm::SetVector< T, Vector, Set, N >::size(), llvm::SmallVectorBase< Size_T >::size(), llvm::SetVector< T, Vector, Set, N >::takeVector(), UseRegistersForDeoptValues, UseRegistersForGCPointersInLandingPad, and willLowerDirectly().

Referenced by llvm::SelectionDAGBuilder::LowerAsSTATEPOINT().

◆ pushStackMapConstant()

static void pushStackMapConstant ( SmallVectorImpl< SDValue > &  Ops,
SelectionDAGBuilder Builder,
uint64_t  Value 
)
static

◆ reservePreviousStackSlotForValue()

static void reservePreviousStackSlotForValue ( const Value IncomingValue,
SelectionDAGBuilder Builder 
)
static

Try to find existing copies of the incoming values in stack slots used for statepoint spilling.

If we can find a spill slot for the incoming value, mark that slot as allocated, and reuse the same slot for this safepoint. This helps to avoid series of loads and stores that only serve to reshuffle values on the stack between calls.

Definition at line 269 of file StatepointLowering.cpp.

References assert(), llvm::SelectionDAGBuilder::DAG, llvm::find(), findPreviousSpillSlot(), llvm::SelectionDAGBuilder::FuncInfo, llvm::SelectionDAGBuilder::getFrameIndexTy(), llvm::StatepointLoweringState::getLocation(), llvm::SDValue::getNode(), llvm::SelectionDAG::getTargetFrameIndex(), llvm::SelectionDAGBuilder::getValue(), llvm::StatepointLoweringState::isStackSlotAllocated(), llvm::Offset, llvm::StatepointLoweringState::reserveStackSlot(), llvm::StatepointLoweringState::setLocation(), llvm::SelectionDAGBuilder::StatepointLowering, llvm::FunctionLoweringInfo::StatepointStackSlots, and willLowerDirectly().

Referenced by lowerStatepointMetaArgs().

◆ spillIncomingStatepointValue()

static std::tuple< SDValue, SDValue, MachineMemOperand * > spillIncomingStatepointValue ( SDValue  Incoming,
SDValue  Chain,
SelectionDAGBuilder Builder 
)
static

◆ STATISTIC() [1/3]

STATISTIC ( NumOfStatepoints  ,
"Number of statepoint nodes encountered"   
)

◆ STATISTIC() [2/3]

STATISTIC ( NumSlotsAllocatedForStatepoints  ,
"Number of stack slots allocated for statepoints"   
)

◆ STATISTIC() [3/3]

STATISTIC ( StatepointMaxSlotsRequired  ,
"Maximum number of stack slots required for a singe statepoint"   
)

◆ willLowerDirectly()

static bool willLowerDirectly ( SDValue  Incoming)
static

Return true if-and-only-if the given SDValue can be lowered as either a constant argument or a stack reference.

The key point is that the value doesn't need to be spilled or tracked as a vreg use.

Definition at line 248 of file StatepointLowering.cpp.

References llvm::isIntOrFPConstant().

Referenced by lowerIncomingStatepointValue(), lowerStatepointMetaArgs(), and reservePreviousStackSlotForValue().

Variable Documentation

◆ MaxRegistersForGCPointers

cl::opt< unsigned > MaxRegistersForGCPointers("max-registers-for-gc-values", cl::Hidden, cl::init(0), cl::desc("Max number of VRegs allowed to pass GC pointer meta args in")) ( "max-registers-for-gc-values"  ,
cl::Hidden  ,
cl::init(0)  ,
cl::desc("Max number of VRegs allowed to pass GC pointer meta args in")   
)
static

Referenced by lowerStatepointMetaArgs().

◆ UseRegistersForDeoptValues

cl::opt< bool > UseRegistersForDeoptValues("use-registers-for-deopt-values", cl::Hidden, cl::init(false), cl::desc("Allow using registers for non pointer deopt args")) ( "use-registers-for-deopt-values"  ,
cl::Hidden  ,
cl::init(false)  ,
cl::desc("Allow using registers for non pointer deopt args")   
)
static

Referenced by lowerStatepointMetaArgs().

◆ UseRegistersForGCPointersInLandingPad

cl::opt< bool > UseRegistersForGCPointersInLandingPad("use-registers-for-gc-values-in-landing-pad", cl::Hidden, cl::init(false), cl::desc("Allow using registers for gc pointer in landing pad")) ( "use-registers-for-gc-values-in-landing-pad"  ,
cl::Hidden  ,
cl::init(false)  ,
cl::desc("Allow using registers for gc pointer in landing pad")   
)
static

Referenced by lowerStatepointMetaArgs().