LLVM API Documentation

Functions | Variables
SelectionDAG.cpp File Reference
#include "llvm/CodeGen/SelectionDAG.h"
#include "SDNodeDbgValue.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Mutex.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetIntrinsicInfo.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetSelectionDAGInfo.h"
#include "llvm/Target/TargetSubtargetInfo.h"
#include <algorithm>
#include <cmath>
Include dependency graph for SelectionDAG.cpp:

Go to the source code of this file.

Functions

static SDVTList makeVTList (const EVT *VTs, unsigned NumVTs)
static int isSignedOp (ISD::CondCode Opcode)
static void AddNodeIDOpcode (FoldingSetNodeID &ID, unsigned OpC)
static void AddNodeIDValueTypes (FoldingSetNodeID &ID, SDVTList VTList)
static void AddNodeIDOperands (FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
static void AddNodeIDOperands (FoldingSetNodeID &ID, ArrayRef< SDUse > Ops)
static void AddBinaryNodeIDCustom (FoldingSetNodeID &ID, bool nuw, bool nsw, bool exact)
static void AddBinaryNodeIDCustom (FoldingSetNodeID &ID, unsigned Opcode, bool nuw, bool nsw, bool exact)
 AddBinaryNodeIDCustom - Add BinarySDNodes special infos.
static void AddNodeIDNode (FoldingSetNodeID &ID, unsigned short OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static void AddNodeIDCustom (FoldingSetNodeID &ID, const SDNode *N)
static void AddNodeIDNode (FoldingSetNodeID &ID, const SDNode *N)
static unsigned encodeMemSDNodeFlags (int ConvType, ISD::MemIndexedMode AM, bool isVolatile, bool isNonTemporal, bool isInvariant)
static bool doNotCSE (SDNode *N)
 doNotCSE - Return true if CSE should not be performed for this node.
static void VerifySDNode (SDNode *N)
 VerifySDNode - Sanity check the given SDNode. Aborts if it is invalid.
static void commuteShuffle (SDValue &N1, SDValue &N2, SmallVectorImpl< int > &M)
static SDValue getMemsetValue (SDValue Value, EVT VT, SelectionDAG &DAG, SDLoc dl)
static SDValue getMemsetStringVal (EVT VT, SDLoc dl, SelectionDAG &DAG, const TargetLowering &TLI, StringRef Str)
static SDValue getMemBasePlusOffset (SDValue Base, unsigned Offset, SDLoc dl, SelectionDAG &DAG)
static bool isMemSrcFromString (SDValue Src, StringRef &Str)
static bool FindOptimalMemOpLowering (std::vector< EVT > &MemOps, unsigned Limit, uint64_t Size, unsigned DstAlign, unsigned SrcAlign, bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc, bool AllowOverlap, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue getMemcpyLoadsAndStores (SelectionDAG &DAG, SDLoc dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, unsigned Align, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
static SDValue getMemmoveLoadsAndStores (SelectionDAG &DAG, SDLoc dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, unsigned Align, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
static SDValue getMemsetStores (SelectionDAG &DAG, SDLoc dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, unsigned Align, bool isVol, MachinePointerInfo DstPtrInfo)
 Lower the call to 'memset' intrinsic function into a series of store operations.
static MachinePointerInfo InferPointerInfo (SDValue Ptr, int64_t Offset=0)
static MachinePointerInfo InferPointerInfo (SDValue Ptr, SDValue OffsetOp)
static void checkForCyclesHelper (const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)

Variables

static ManagedStatic< std::set
< EVT, EVT::compareRawBits > > 
EVTs
static ManagedStatic< EVTArray > SimpleVTArray
static ManagedStatic
< sys::SmartMutex< true > > 
VTMutex

Function Documentation

static void AddBinaryNodeIDCustom ( FoldingSetNodeID ID,
bool  nuw,
bool  nsw,
bool  exact 
) [static]
static void AddBinaryNodeIDCustom ( FoldingSetNodeID ID,
unsigned  Opcode,
bool  nuw,
bool  nsw,
bool  exact 
) [static]

AddBinaryNodeIDCustom - Add BinarySDNodes special infos.

Definition at line 395 of file SelectionDAG.cpp.

References AddBinaryNodeIDCustom(), and llvm::isBinOpWithFlags().

static void AddNodeIDCustom ( FoldingSetNodeID ID,
const SDNode N 
) [static]

AddNodeIDCustom - If this is an SDNode with special info, add this info to the NodeID data.

Definition at line 410 of file SelectionDAG.cpp.

References llvm::ISD::ADD, AddBinaryNodeIDCustom(), llvm::FoldingSetNodeID::AddBoolean(), llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), llvm::MachineConstantPoolValue::addSelectionDAGCSEId(), llvm::ISD::ATOMIC_CMP_SWAP, llvm::ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, llvm::ISD::ATOMIC_LOAD, llvm::ISD::ATOMIC_LOAD_ADD, llvm::ISD::ATOMIC_LOAD_AND, llvm::ISD::ATOMIC_LOAD_MAX, llvm::ISD::ATOMIC_LOAD_MIN, llvm::ISD::ATOMIC_LOAD_NAND, llvm::ISD::ATOMIC_LOAD_OR, llvm::ISD::ATOMIC_LOAD_SUB, llvm::ISD::ATOMIC_LOAD_UMAX, llvm::ISD::ATOMIC_LOAD_UMIN, llvm::ISD::ATOMIC_LOAD_XOR, llvm::ISD::ATOMIC_STORE, llvm::ISD::ATOMIC_SWAP, llvm::ISD::BasicBlock, llvm::ISD::BlockAddress, llvm::CallingConv::C, llvm::ISD::Constant, llvm::ISD::ConstantFP, llvm::ISD::ConstantPool, llvm::ISD::ExternalSymbol, llvm::ISD::FrameIndex, llvm::GlobalAddressSDNode::getAddressSpace(), llvm::MachinePointerInfo::getAddrSpace(), llvm::ConstantPoolSDNode::getAlignment(), llvm::SelectionDAG::getBasicBlock(), llvm::BlockAddressSDNode::getBlockAddress(), llvm::ConstantSDNode::getConstantIntValue(), llvm::ConstantPoolSDNode::getConstVal(), llvm::GlobalAddressSDNode::getGlobal(), llvm::TargetIndexSDNode::getIndex(), llvm::ConstantPoolSDNode::getMachineCPVal(), llvm::ShuffleVectorSDNode::getMaskElt(), llvm::MemSDNode::getMemoryVT(), llvm::GlobalAddressSDNode::getOffset(), llvm::ConstantPoolSDNode::getOffset(), llvm::TargetIndexSDNode::getOffset(), llvm::BlockAddressSDNode::getOffset(), llvm::SDNode::getOpcode(), llvm::MemSDNode::getPointerInfo(), llvm::EVT::getRawBits(), llvm::MemSDNode::getRawSubclassData(), getReg(), llvm::GlobalAddressSDNode::getTargetFlags(), llvm::ConstantPoolSDNode::getTargetFlags(), llvm::TargetIndexSDNode::getTargetFlags(), llvm::BlockAddressSDNode::getTargetFlags(), llvm::SDNode::getValueType(), llvm::EVT::getVectorNumElements(), llvm::ISD::GlobalAddress, llvm::ISD::GlobalTLSAddress, llvm::BinaryWithFlagsSDNode::hasNoSignedWrap(), llvm::BinaryWithFlagsSDNode::hasNoUnsignedWrap(), llvm::BinaryWithFlagsSDNode::isExact(), llvm::ConstantPoolSDNode::isMachineConstantPoolEntry(), llvm::ConstantSDNode::isOpaque(), llvm::SDNode::isTargetMemoryOpcode(), llvm::ISD::JumpTable, llvm::AArch64DB::LD, llvm_unreachable, llvm::ISD::LOAD, llvm::ISD::MUL, llvm::ISD::PREFETCH, llvm::ISD::Register, llvm::ISD::RegisterMask, llvm::ISD::SDIV, llvm::ISD::SHL, llvm::ISD::SRA, llvm::ISD::SRCVALUE, llvm::ISD::SRL, llvm::AArch64DB::ST, llvm::ISD::STORE, llvm::ISD::SUB, llvm::ISD::TargetBlockAddress, llvm::ISD::TargetConstant, llvm::ISD::TargetConstantFP, llvm::ISD::TargetConstantPool, llvm::ISD::TargetExternalSymbol, llvm::ISD::TargetFrameIndex, llvm::ISD::TargetGlobalAddress, llvm::ISD::TargetGlobalTLSAddress, llvm::ISD::TargetIndex, llvm::ISD::TargetJumpTable, llvm::ISD::UDIV, and llvm::ISD::VECTOR_SHUFFLE.

Referenced by AddNodeIDNode().

static void AddNodeIDNode ( FoldingSetNodeID ID,
unsigned short  OpC,
SDVTList  VTList,
ArrayRef< SDValue OpList 
) [static]
static void AddNodeIDNode ( FoldingSetNodeID ID,
const SDNode N 
) [static]

AddNodeIDNode - Generic routine for adding a nodes info to the NodeID data.

Definition at line 556 of file SelectionDAG.cpp.

References AddNodeIDCustom(), AddNodeIDOpcode(), AddNodeIDOperands(), AddNodeIDValueTypes(), llvm::SDNode::getOpcode(), llvm::SDNode::getVTList(), and llvm::SDNode::ops().

static void AddNodeIDOpcode ( FoldingSetNodeID ID,
unsigned  OpC 
) [static]

AddNodeIDOpcode - Add the node opcode to the NodeID data.

Definition at line 357 of file SelectionDAG.cpp.

References llvm::FoldingSetNodeID::AddInteger().

Referenced by AddNodeIDNode().

static void AddNodeIDOperands ( FoldingSetNodeID ID,
ArrayRef< SDValue Ops 
) [static]

AddNodeIDOperands - Various routines for adding operands to the NodeID data.

Definition at line 369 of file SelectionDAG.cpp.

References llvm::FoldingSetNodeID::AddInteger(), and llvm::FoldingSetNodeID::AddPointer().

Referenced by AddNodeIDNode().

static void AddNodeIDOperands ( FoldingSetNodeID ID,
ArrayRef< SDUse Ops 
) [static]

AddNodeIDOperands - Various routines for adding operands to the NodeID data.

Definition at line 379 of file SelectionDAG.cpp.

References llvm::FoldingSetNodeID::AddInteger(), and llvm::FoldingSetNodeID::AddPointer().

static void AddNodeIDValueTypes ( FoldingSetNodeID ID,
SDVTList  VTList 
) [static]

AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointer.

Definition at line 363 of file SelectionDAG.cpp.

References llvm::FoldingSetNodeID::AddPointer(), and llvm::SDVTList::VTs.

Referenced by AddNodeIDNode().

static void checkForCyclesHelper ( const SDNode N,
SmallPtrSetImpl< const SDNode * > &  Visited,
SmallPtrSetImpl< const SDNode * > &  Checked,
const llvm::SelectionDAG DAG 
) [static]
static void commuteShuffle ( SDValue N1,
SDValue N2,
SmallVectorImpl< int > &  M 
) [static]
static bool doNotCSE ( SDNode N) [static]

doNotCSE - Return true if CSE should not be performed for this node.

Definition at line 590 of file SelectionDAG.cpp.

References llvm::ISD::EH_LABEL, llvm::SDNode::getNumValues(), llvm::SDNode::getOpcode(), llvm::SDNode::getValueType(), llvm::MVT::Glue, and llvm::ISD::HANDLENODE.

static unsigned encodeMemSDNodeFlags ( int  ConvType,
ISD::MemIndexedMode  AM,
bool  isVolatile,
bool  isNonTemporal,
bool  isInvariant 
) [inline, static]

encodeMemSDNodeFlags - Generic routine for computing a value for use in the CSE map that carries volatility, temporalness, indexing mode, and extension/truncation information.

Definition at line 572 of file SelectionDAG.cpp.

Referenced by llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTruncStore(), and llvm::MemSDNode::MemSDNode().

static bool FindOptimalMemOpLowering ( std::vector< EVT > &  MemOps,
unsigned  Limit,
uint64_t  Size,
unsigned  DstAlign,
unsigned  SrcAlign,
bool  IsMemset,
bool  ZeroMemset,
bool  MemcpyStrSrc,
bool  AllowOverlap,
SelectionDAG DAG,
const TargetLowering TLI 
) [static]
static SDValue getMemBasePlusOffset ( SDValue  Base,
unsigned  Offset,
SDLoc  dl,
SelectionDAG DAG 
) [static]

getMemBasePlusOffset - Returns base and offset node for the

Definition at line 3776 of file SelectionDAG.cpp.

References llvm::ISD::ADD, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), and llvm::SDValue::getValueType().

Referenced by getMemcpyLoadsAndStores(), getMemmoveLoadsAndStores(), and getMemsetStores().

static SDValue getMemcpyLoadsAndStores ( SelectionDAG DAG,
SDLoc  dl,
SDValue  Chain,
SDValue  Dst,
SDValue  Src,
uint64_t  Size,
unsigned  Align,
bool  isVol,
bool  AlwaysInline,
MachinePointerInfo  DstPtrInfo,
MachinePointerInfo  SrcPtrInfo 
) [static]

Definition at line 3909 of file SelectionDAG.cpp.

References Align(), llvm::EVT::bitsGE(), llvm::dyn_cast(), llvm::StringRef::empty(), llvm::DataLayout::exceedsNaturalStackAlignment(), llvm::ISD::EXTLOAD, FindOptimalMemOpLowering(), llvm::AttributeSet::FunctionIndex, llvm::DataLayout::getABITypeAlignment(), llvm::Function::getAttributes(), llvm::SelectionDAG::getContext(), llvm::TargetLoweringBase::getDataLayout(), llvm::SelectionDAG::getExtLoad(), llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getFunction(), llvm::FrameIndexSDNode::getIndex(), llvm::SelectionDAG::getMachineFunction(), llvm::TargetLoweringBase::getMaxStoresPerMemcpy(), getMemBasePlusOffset(), getMemsetStringVal(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::SDValue::getOpcode(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getStore(), llvm::MachineFunction::getSubtarget(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SelectionDAG::getTruncStore(), llvm::TargetLoweringBase::getTypeToTransformTo(), llvm::MachinePointerInfo::getWithOffset(), llvm::SelectionDAG::InferPtrAlignment(), llvm::MachineFrameInfo::isFixedObjectIndex(), llvm::EVT::isInteger(), isMemSrcFromString(), llvm::EVT::isVector(), llvm::MinAlign(), llvm::TargetRegisterInfo::needsStackRealignment(), llvm::Attribute::OptimizeForSize, llvm::MVT::Other, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::MachineFrameInfo::setObjectAlignment(), llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::SPII::Store, llvm::StringRef::substr(), llvm::ISD::TokenFactor, and llvm::ISD::UNDEF.

Referenced by llvm::SelectionDAG::getMemcpy().

static SDValue getMemmoveLoadsAndStores ( SelectionDAG DAG,
SDLoc  dl,
SDValue  Chain,
SDValue  Dst,
SDValue  Src,
uint64_t  Size,
unsigned  Align,
bool  isVol,
bool  AlwaysInline,
MachinePointerInfo  DstPtrInfo,
MachinePointerInfo  SrcPtrInfo 
) [static]
static SDValue getMemsetStores ( SelectionDAG DAG,
SDLoc  dl,
SDValue  Chain,
SDValue  Dst,
SDValue  Src,
uint64_t  Size,
unsigned  Align,
bool  isVol,
MachinePointerInfo  DstPtrInfo 
) [static]

Lower the call to 'memset' intrinsic function into a series of store operations.

Parameters:
DAGSelection DAG where lowered code is placed.
dlLink to corresponding IR location.
ChainControl flow dependency.
DstPointer to destination memory location.
SrcValue of byte to write into the memory.
SizeNumber of bytes to write.
AlignAlignment of the destination in bytes.
isVolTrue if destination is volatile.
DstPtrInfoIR information on the memory pointer.
Returns:
New head in the control flow, if lowering was successful, empty SDValue otherwise.

The function tries to replace 'llvm.memset' intrinsic with several store operations and value calculation code. This is usually profitable for small memory size.

Definition at line 4123 of file SelectionDAG.cpp.

References Align(), llvm::EVT::bitsLT(), llvm::dyn_cast(), FindOptimalMemOpLowering(), llvm::AttributeSet::FunctionIndex, llvm::DataLayout::getABITypeAlignment(), llvm::Function::getAttributes(), llvm::SelectionDAG::getContext(), llvm::TargetLoweringBase::getDataLayout(), llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getFunction(), llvm::FrameIndexSDNode::getIndex(), llvm::SelectionDAG::getMachineFunction(), llvm::TargetLoweringBase::getMaxStoresPerMemset(), getMemBasePlusOffset(), getMemsetValue(), llvm::SelectionDAG::getNode(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::SDValue::getOpcode(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValueType(), llvm::MachinePointerInfo::getWithOffset(), llvm::MachineFrameInfo::isFixedObjectIndex(), llvm::TargetLoweringBase::isTruncateFree(), llvm::EVT::isVector(), llvm::Attribute::OptimizeForSize, llvm::MVT::Other, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::MachineFrameInfo::setObjectAlignment(), llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::SPII::Store, llvm::ISD::TokenFactor, llvm::ISD::TRUNCATE, and llvm::ISD::UNDEF.

Referenced by llvm::SelectionDAG::getMemset().

static SDValue getMemsetStringVal ( EVT  VT,
SDLoc  dl,
SelectionDAG DAG,
const TargetLowering TLI,
StringRef  Str 
) [static]
static SDValue getMemsetValue ( SDValue  Value,
EVT  VT,
SelectionDAG DAG,
SDLoc  dl 
) [static]
static MachinePointerInfo InferPointerInfo ( SDValue  Ptr,
int64_t  Offset = 0 
) [static]

InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record from it. This is particularly useful because the code generator has many cases where it doesn't bother passing in a MachinePointerInfo to getLoad or getStore when it has "FI+Cst".

Definition at line 4622 of file SelectionDAG.cpp.

References llvm::ISD::ADD, llvm::MachinePointerInfo::getFixedStack(), llvm::SDValue::getOpcode(), and llvm::SDValue::getOperand().

Referenced by llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTruncStore(), and InferPointerInfo().

static MachinePointerInfo InferPointerInfo ( SDValue  Ptr,
SDValue  OffsetOp 
) [static]

InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record from it. This is particularly useful because the code generator has many cases where it doesn't bother passing in a MachinePointerInfo to getLoad or getStore when it has "FI+Cst".

Definition at line 4642 of file SelectionDAG.cpp.

References llvm::SDValue::getOpcode(), InferPointerInfo(), and llvm::ISD::UNDEF.

static bool isMemSrcFromString ( SDValue  Src,
StringRef Str 
) [static]

isMemSrcFromString - Returns true if memcpy source is a string constant.

Definition at line 3785 of file SelectionDAG.cpp.

References llvm::ISD::ADD, llvm::ISD::Constant, G, llvm::getConstantStringInfo(), llvm::GlobalAddressSDNode::getGlobal(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), and llvm::ISD::GlobalAddress.

Referenced by getMemcpyLoadsAndStores().

static int isSignedOp ( ISD::CondCode  Opcode) [static]

isSignedOp - For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an unsigned comparison. Return zero if the operation does not depend on the sign of the input (setne and seteq).

Definition at line 283 of file SelectionDAG.cpp.

References llvm_unreachable, llvm::ISD::SETEQ, llvm::ISD::SETGE, llvm::ISD::SETGT, llvm::ISD::SETLE, llvm::ISD::SETLT, llvm::ISD::SETNE, llvm::ISD::SETUGE, llvm::ISD::SETUGT, llvm::ISD::SETULE, and llvm::ISD::SETULT.

Referenced by llvm::ISD::getSetCCAndOperation(), and llvm::ISD::getSetCCOrOperation().

static SDVTList makeVTList ( const EVT VTs,
unsigned  NumVTs 
) [static]

makeVTList - Return an instance of the SDVTList struct initialized with the specified members.

Definition at line 57 of file SelectionDAG.cpp.

Referenced by llvm::SelectionDAG::getVTList().

static void VerifySDNode ( SDNode N) [static]

Variable Documentation

ManagedStatic<std::set<EVT, EVT::compareRawBits> > EVTs [static]

Definition at line 6267 of file SelectionDAG.cpp.

ManagedStatic<EVTArray> SimpleVTArray [static]

Definition at line 6268 of file SelectionDAG.cpp.

Definition at line 6269 of file SelectionDAG.cpp.