LLVM
8.0.1
|
#include "llvm/CodeGen/SelectionDAG.h"
#include "SDNodeDbgValue.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Triple.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/ISDOpcodes.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/RuntimeLibcalls.h"
#include "llvm/CodeGen/SelectionDAGAddressAnalysis.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Support/MachineValueType.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/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <cstdlib>
#include <limits>
#include <set>
#include <string>
#include <utility>
#include <vector>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "selectiondag" |
Functions | |
static SDVTList | makeVTList (const EVT *VTs, unsigned NumVTs) |
makeVTList - Return an instance of the SDVTList struct initialized with the specified members. More... | |
static void | NewSDValueDbgMsg (SDValue V, StringRef Msg, SelectionDAG *G) |
static int | isSignedOp (ISD::CondCode Opcode) |
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an unsigned comparison. More... | |
static void | AddNodeIDOpcode (FoldingSetNodeID &ID, unsigned OpC) |
AddNodeIDOpcode - Add the node opcode to the NodeID data. More... | |
static void | AddNodeIDValueTypes (FoldingSetNodeID &ID, SDVTList VTList) |
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointer. More... | |
static void | AddNodeIDOperands (FoldingSetNodeID &ID, ArrayRef< SDValue > Ops) |
AddNodeIDOperands - Various routines for adding operands to the NodeID data. More... | |
static void | AddNodeIDOperands (FoldingSetNodeID &ID, ArrayRef< SDUse > Ops) |
AddNodeIDOperands - Various routines for adding operands to the NodeID data. More... | |
static void | AddNodeIDNode (FoldingSetNodeID &ID, unsigned short OpC, SDVTList VTList, ArrayRef< SDValue > OpList) |
static void | AddNodeIDCustom (FoldingSetNodeID &ID, const SDNode *N) |
If this is an SDNode with special info, add this info to the NodeID data. More... | |
static void | AddNodeIDNode (FoldingSetNodeID &ID, const SDNode *N) |
AddNodeIDNode - Generic routine for adding a nodes info to the NodeID data. More... | |
static bool | doNotCSE (SDNode *N) |
doNotCSE - Return true if CSE should not be performed for this node. More... | |
static void | VerifySDNode (SDNode *N) |
VerifySDNode - Sanity check the given SDNode. Aborts if it is invalid. More... | |
static void | commuteShuffle (SDValue &N1, SDValue &N2, MutableArrayRef< int > M) |
Swaps the values of N1 and N2. More... | |
static ConstantSDNode * | isConstOrDemandedConstSplat (SDValue N, const APInt &DemandedElts) |
Helper function that checks to see if a node is a constant or a build vector of splat constants at least within the demanded elts. More... | |
static const APInt * | getValidShiftAmountConstant (SDValue V) |
If a SHL/SRA/SRL node has a constant or splat constant shift amount that is less than the element bit-width of the shift node, return it. More... | |
static SDValue | FoldBUILD_VECTOR (const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG) |
static SDValue | FoldCONCAT_VECTORS (const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG) |
static std::pair< APInt, bool > | FoldValue (unsigned Opcode, const APInt &C1, const APInt &C2) |
static SDValue | getMemsetValue (SDValue Value, EVT VT, SelectionDAG &DAG, const SDLoc &dl) |
getMemsetValue - Vectorized representation of the memset value operand. More... | |
static SDValue | getMemsetStringVal (EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice) |
getMemsetStringVal - Similar to getMemsetValue. More... | |
static bool | isMemSrcFromConstant (SDValue Src, ConstantDataArraySlice &Slice) |
Returns true if memcpy source is constant data. More... | |
static bool | FindOptimalMemOpLowering (std::vector< EVT > &MemOps, unsigned Limit, uint64_t Size, unsigned DstAlign, unsigned SrcAlign, bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc, bool AllowOverlap, unsigned DstAS, unsigned SrcAS, SelectionDAG &DAG, const TargetLowering &TLI) |
Determines the optimal series of memory ops to replace the memset / memcpy. More... | |
static bool | shouldLowerMemFuncForSize (const MachineFunction &MF) |
static void | chainLoadsAndStoresForMemcpy (SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains) |
static SDValue | getMemcpyLoadsAndStores (SelectionDAG &DAG, const 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, const 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, const 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. More... | |
static void | checkAddrSpaceIsValidForLibcall (const TargetLowering *TLI, unsigned AS) |
static MachinePointerInfo | InferPointerInfo (const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0) |
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record from it. More... | |
static MachinePointerInfo | InferPointerInfo (const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, SDValue OffsetOp) |
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record from it. More... | |
static void | checkForCyclesHelper (const SDNode *N, SmallPtrSetImpl< const SDNode *> &Visited, SmallPtrSetImpl< const SDNode *> &Checked, const llvm::SelectionDAG *DAG) |
Variables | |
static cl::opt< bool > | EnableMemCpyDAGOpt ("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy")) |
static cl::opt< int > | MaxLdStGlue ("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0)) |
static ManagedStatic< std::set< EVT, EVT::compareRawBits > > | EVTs |
static ManagedStatic< EVTArray > | SimpleVTArray |
static ManagedStatic< sys::SmartMutex< true > > | VTMutex |
#define DEBUG_TYPE "selectiondag" |
Definition at line 92 of file SelectionDAG.cpp.
|
static |
If this is an SDNode with special info, add this info to the NodeID data.
Definition at line 477 of file SelectionDAG.cpp.
References 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_CLR, 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, C, llvm::ISD::Constant, llvm::ISD::ConstantFP, llvm::ISD::ConstantPool, llvm::HexagonISD::CP, llvm::ISD::ExternalSymbol, llvm::ISD::FrameIndex, 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::ConstantPoolSDNode::isMachineConstantPoolEntry(), llvm::ConstantSDNode::isOpaque(), llvm::SDNode::isTargetMemoryOpcode(), llvm::ISD::JumpTable, llvm::ARM_MB::LD, llvm_unreachable, llvm::ISD::LOAD, llvm::ISD::MCSymbol, llvm::ISD::MGATHER, llvm::ISD::MLOAD, llvm::ISD::MSCATTER, llvm::ISD::MSTORE, N, llvm::ISD::PREFETCH, llvm::ISD::Register, llvm::ISD::RegisterMask, llvm::ISD::SRCVALUE, llvm::ARM_MB::ST, llvm::ISD::STORE, 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, and llvm::ISD::VECTOR_SHUFFLE.
Referenced by AddNodeIDNode(), and VerifySDNode().
|
static |
Definition at line 469 of file SelectionDAG.cpp.
References AddNodeIDOpcode(), AddNodeIDOperands(), and AddNodeIDValueTypes().
Referenced by llvm::SelectionDAG::getAddrSpaceCast(), llvm::SelectionDAG::getAtomic(), llvm::SelectionDAG::getBasicBlock(), llvm::SelectionDAG::getBlockAddress(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getConstantFP(), llvm::SelectionDAG::getConstantPool(), llvm::SelectionDAG::getFrameIndex(), llvm::SelectionDAG::getGlobalAddress(), llvm::SelectionDAG::getIndexedStore(), llvm::SelectionDAG::getJumpTable(), llvm::SelectionDAG::getLabelNode(), llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getMachineNode(), llvm::SelectionDAG::getMaskedGather(), llvm::SelectionDAG::getMaskedLoad(), llvm::SelectionDAG::getMaskedScatter(), llvm::SelectionDAG::getMaskedStore(), llvm::SelectionDAG::getMDNode(), llvm::SelectionDAG::getMemIntrinsicNode(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getNodeIfExists(), llvm::SelectionDAG::getRegister(), llvm::SelectionDAG::getRegisterMask(), llvm::SelectionDAG::getSrcValue(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTargetIndex(), llvm::SelectionDAG::getTruncStore(), llvm::SelectionDAG::getVectorShuffle(), llvm::SelectionDAG::MorphNodeTo(), llvm::SDNode::Profile(), and VerifySDNode().
|
static |
AddNodeIDNode - Generic routine for adding a nodes info to the NodeID data.
Definition at line 638 of file SelectionDAG.cpp.
References AddNodeIDCustom(), AddNodeIDOpcode(), AddNodeIDOperands(), AddNodeIDValueTypes(), llvm::SDNode::getOpcode(), llvm::SDNode::getVTList(), and llvm::SDNode::ops().
|
static |
AddNodeIDOpcode - Add the node opcode to the NodeID data.
Definition at line 441 of file SelectionDAG.cpp.
References llvm::FoldingSetNodeID::AddInteger().
Referenced by AddNodeIDNode().
|
static |
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
Definition at line 452 of file SelectionDAG.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), llvm::SDValue::getNode(), and llvm::SDValue::getResNo().
Referenced by AddNodeIDNode().
|
static |
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
Definition at line 461 of file SelectionDAG.cpp.
References llvm::FoldingSetNodeID::AddInteger(), llvm::FoldingSetNodeID::AddPointer(), llvm::SDValue::getNode(), and llvm::SDValue::getResNo().
|
static |
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointer.
Definition at line 447 of file SelectionDAG.cpp.
References llvm::FoldingSetNodeID::AddPointer(), and llvm::SDVTList::VTs.
Referenced by AddNodeIDNode().
|
static |
Definition at line 5636 of file SelectionDAG.cpp.
References assert(), llvm::dyn_cast(), llvm::StoreSDNode::getBasePtr(), llvm::MemSDNode::getMemOperand(), llvm::MemSDNode::getMemoryVT(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getTruncStore(), llvm::StoreSDNode::getValue(), llvm::MVT::Other, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::SmallVectorBase::size(), llvm::ARM_MB::ST, and llvm::ISD::TokenFactor.
Referenced by getMemcpyLoadsAndStores().
|
static |
Definition at line 6037 of file SelectionDAG.cpp.
References llvm::TargetLoweringBase::isNoopAddrSpaceCast(), and llvm::report_fatal_error().
Referenced by llvm::SelectionDAG::getMemcpy(), llvm::SelectionDAG::getMemmove(), and llvm::SelectionDAG::getMemset().
|
static |
Definition at line 9291 of file SelectionDAG.cpp.
References llvm::SmallPtrSetImpl< PtrType >::count(), llvm::dbgs(), llvm::SDNode::dumprFull(), llvm::SmallPtrSetImpl< PtrType >::erase(), llvm::errs(), llvm::SDValue::getNode(), llvm::SmallPtrSetImpl< PtrType >::insert(), and llvm::SDNode::op_values().
Referenced by llvm::checkForCycles().
|
static |
Swaps the values of N1 and N2.
Swaps all indices in the shuffle mask M that point at N1 to point at N2 and indices that point at N2 to point at N1.
Definition at line 1541 of file SelectionDAG.cpp.
References llvm::ShuffleVectorSDNode::commuteMask(), and std::swap().
Referenced by llvm::SelectionDAG::getVectorShuffle().
doNotCSE - Return true if CSE should not be performed for this node.
Definition at line 654 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.
Referenced by VerifySDNode().
|
static |
Determines the optimal series of memory ops to replace the memset / memcpy.
Return true if the number of memory ops is below the threshold (Limit). It returns the types of the sequence of memory ops to perform memset / memcpy by reference.
Definition at line 5528 of file SelectionDAG.cpp.
References llvm::TargetLoweringBase::allowsMisalignedMemoryAccesses(), assert(), llvm::EVT::bitsGT(), llvm::MVT::f64, llvm::CallingConv::Fast, llvm::SelectionDAG::getMachineFunction(), llvm::TargetLoweringBase::getOptimalMemOpType(), llvm::EVT::getSimpleVT(), llvm::EVT::getSizeInBits(), llvm::MVT::i32, llvm::MVT::i64, llvm::MVT::i8, llvm::EVT::isFloatingPoint(), llvm::EVT::isInteger(), llvm::TargetLoweringBase::isOperationLegalOrCustom(), llvm::TargetLoweringBase::isSafeMemOpType(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), llvm::MVT::Other, llvm::MVT::SimpleTy, and llvm::ISD::STORE.
Referenced by getMemcpyLoadsAndStores(), getMemmoveLoadsAndStores(), and getMemsetStores().
|
static |
Definition at line 3984 of file SelectionDAG.cpp.
References llvm::all_of(), assert(), llvm::ISD::EXTRACT_VECTOR_ELT, getOpcode(), llvm::SelectionDAG::getUNDEF(), llvm::SelectionDAG::getValueType(), llvm::EVT::getVectorNumElements(), llvm::SDValue::isUndef(), and llvm::ArrayRef< T >::size().
Referenced by llvm::SelectionDAG::getNode().
|
static |
Definition at line 4016 of file SelectionDAG.cpp.
References llvm::all_of(), llvm::SmallVectorImpl< T >::append(), assert(), llvm::EVT::bitsGT(), llvm::EVT::bitsLT(), llvm::ISD::BUILD_VECTOR, llvm::ArrayRef< T >::empty(), llvm::SelectionDAG::getBuildVector(), llvm::SDValue::getOpcode(), llvm::EVT::getScalarType(), llvm::SelectionDAG::getSExtOrTrunc(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SelectionDAG::getUNDEF(), llvm::SDValue::getValueType(), llvm::EVT::getVectorNumElements(), llvm::SelectionDAG::getZExtOrTrunc(), llvm::SDValue::isUndef(), llvm::TargetLoweringBase::isZExtFree(), NewSDValueDbgMsg(), llvm::SDNode::op_begin(), llvm::SDNode::op_end(), and llvm::ArrayRef< T >::size().
Referenced by llvm::SelectionDAG::getNode().
|
static |
Definition at line 4473 of file SelectionDAG.cpp.
References llvm::ISD::ADD, llvm::ISD::AND, llvm::APInt::ashr(), llvm::APInt::lshr(), llvm::ISD::MUL, llvm::ISD::OR, llvm::ISD::ROTL, llvm::APInt::rotl(), llvm::ISD::ROTR, llvm::APInt::rotr(), llvm::APInt::sadd_sat(), llvm::ISD::SADDSAT, llvm::ISD::SDIV, llvm::APInt::sdiv(), llvm::APInt::sge(), llvm::ISD::SHL, llvm::APInt::sle(), llvm::ISD::SMAX, llvm::ISD::SMIN, llvm::ISD::SRA, llvm::ISD::SREM, llvm::APInt::srem(), llvm::ISD::SRL, llvm::APInt::ssub_sat(), llvm::ISD::SSUBSAT, llvm::ISD::SUB, llvm::APInt::uadd_sat(), llvm::ISD::UADDSAT, llvm::ISD::UDIV, llvm::APInt::udiv(), llvm::APInt::uge(), llvm::APInt::ule(), llvm::ISD::UMAX, llvm::ISD::UMIN, llvm::ISD::UREM, llvm::APInt::urem(), llvm::APInt::usub_sat(), llvm::ISD::USUBSAT, and llvm::ISD::XOR.
Referenced by llvm::SelectionDAG::FoldConstantArithmetic().
|
static |
Definition at line 5661 of file SelectionDAG.cpp.
References llvm::AMDGPU::HSAMD::Kernel::Arg::Key::Align, llvm::ConstantDataArraySlice::Array, assert(), llvm::EVT::bitsGE(), C, chainLoadsAndStoresForMemcpy(), llvm::dyn_cast(), EnableMemCpyDAGOpt, llvm::DataLayout::exceedsNaturalStackAlignment(), llvm::ISD::EXTLOAD, FindOptimalMemOpLowering(), llvm::DataLayout::getABITypeAlignment(), llvm::MachinePointerInfo::getAddrSpace(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getDataLayout(), llvm::SelectionDAG::getExtLoad(), llvm::MachineFunction::getFrameInfo(), llvm::FrameIndexSDNode::getIndex(), llvm::SelectionDAG::getMachineFunction(), llvm::TargetLoweringBase::getMaxGluedStoresPerMemcpy(), llvm::TargetLoweringBase::getMaxStoresPerMemcpy(), llvm::SelectionDAG::getMemBasePlusOffset(), getMemsetStringVal(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getStore(), llvm::MachineFunction::getSubtarget(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SelectionDAG::getTruncStore(), llvm::TargetLoweringBase::getTypeToTransformTo(), llvm::SDValue::getValue(), llvm::MachinePointerInfo::getWithOffset(), llvm::SelectionDAG::InferPtrAlignment(), llvm::MachinePointerInfo::isDereferenceable(), llvm::MachineFrameInfo::isFixedObjectIndex(), llvm::EVT::isInteger(), isMemSrcFromConstant(), llvm::SDValue::isUndef(), llvm::EVT::isVector(), llvm::ConstantDataArraySlice::Length, MaxLdStGlue, llvm::MinAlign(), llvm::MachineMemOperand::MODereferenceable, llvm::MachineMemOperand::MONone, llvm::ConstantDataArraySlice::move(), llvm::MachineMemOperand::MOVolatile, llvm::TargetRegisterInfo::needsStackRealignment(), llvm::ConstantDataArraySlice::Offset, llvm::MVT::Other, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::MachineFrameInfo::setObjectAlignment(), shouldLowerMemFuncForSize(), Size, llvm::SmallVectorBase::size(), llvm::SPII::Store, llvm::ISD::TokenFactor, and TRI.
Referenced by llvm::SelectionDAG::getMemcpy().
|
static |
Definition at line 5847 of file SelectionDAG.cpp.
References llvm::AMDGPU::HSAMD::Kernel::Arg::Key::Align, C, llvm::SmallVectorImpl< T >::clear(), llvm::dyn_cast(), FindOptimalMemOpLowering(), llvm::DataLayout::getABITypeAlignment(), llvm::MachinePointerInfo::getAddrSpace(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getDataLayout(), llvm::MachineFunction::getFrameInfo(), llvm::FrameIndexSDNode::getIndex(), llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getMachineFunction(), llvm::TargetLoweringBase::getMaxStoresPerMemmove(), llvm::SelectionDAG::getMemBasePlusOffset(), llvm::SelectionDAG::getNode(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValue(), llvm::MachinePointerInfo::getWithOffset(), llvm::SelectionDAG::InferPtrAlignment(), llvm::MachinePointerInfo::isDereferenceable(), llvm::MachineFrameInfo::isFixedObjectIndex(), llvm::SDValue::isUndef(), llvm::MachineMemOperand::MODereferenceable, llvm::MachineMemOperand::MONone, llvm::MachineMemOperand::MOVolatile, llvm::MVT::Other, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::MachineFrameInfo::setObjectAlignment(), shouldLowerMemFuncForSize(), llvm::SmallVectorBase::size(), llvm::SPII::Store, and llvm::ISD::TokenFactor.
Referenced by llvm::SelectionDAG::getMemmove().
|
static |
Lower the call to 'memset' intrinsic function into a series of store operations.
DAG | Selection DAG where lowered code is placed. |
dl | Link to corresponding IR location. |
Chain | Control flow dependency. |
Dst | Pointer to destination memory location. |
Src | Value of byte to write into the memory. |
Size | Number of bytes to write. |
Align | Alignment of the destination in bytes. |
isVol | True if destination is volatile. |
DstPtrInfo | IR information on the memory pointer. |
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 5954 of file SelectionDAG.cpp.
References llvm::AMDGPU::HSAMD::Kernel::Arg::Key::Align, assert(), llvm::EVT::bitsLT(), llvm::dyn_cast(), FindOptimalMemOpLowering(), llvm::MachinePointerInfo::getAddrSpace(), llvm::MachineFunction::getFrameInfo(), llvm::FrameIndexSDNode::getIndex(), llvm::SelectionDAG::getMachineFunction(), llvm::TargetLoweringBase::getMaxStoresPerMemset(), getMemsetValue(), llvm::SDValue::getNode(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValueType(), llvm::MachinePointerInfo::getWithOffset(), llvm::MachineFrameInfo::isFixedObjectIndex(), llvm::TargetLoweringBase::isTruncateFree(), llvm::SDValue::isUndef(), llvm::EVT::isVector(), llvm::MachineMemOperand::MONone, llvm::MachineMemOperand::MOVolatile, llvm::MVT::Other, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::MachineFrameInfo::setObjectAlignment(), shouldLowerMemFuncForSize(), Size, llvm::SmallVectorBase::size(), llvm::SPII::Store, llvm::ISD::TokenFactor, and llvm::ISD::TRUNCATE.
Referenced by llvm::SelectionDAG::getMemset().
|
static |
getMemsetStringVal - Similar to getMemsetValue.
Except this is only used when a memcpy is turned into a memset when the source is a constant string ptr.
Definition at line 5457 of file SelectionDAG.cpp.
References llvm::ConstantDataArraySlice::Array, assert(), llvm::ISD::BITCAST, llvm::MVT::f128, llvm::MVT::f32, llvm::MVT::f64, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getConstantFP(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getDataLayout(), llvm::SelectionDAG::getNode(), llvm::EVT::getSizeInBits(), llvm::EVT::getTypeForEVT(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), llvm::EVT::getVectorVT(), llvm::MVT::i32, llvm::MVT::i64, llvm::EVT::isInteger(), llvm::DataLayout::isLittleEndian(), llvm::EVT::isVector(), llvm::ConstantDataArraySlice::Length, llvm_unreachable, and llvm::TargetLoweringBase::shouldConvertConstantLoadToIntImm().
Referenced by getMemcpyLoadsAndStores().
|
static |
getMemsetValue - Vectorized representation of the memset value operand.
Definition at line 5415 of file SelectionDAG.cpp.
References llvm::lltok::APFloat, assert(), C, llvm::SelectionDAG::EVTToAPFloatSemantics(), llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getConstantFP(), llvm::SelectionDAG::getContext(), llvm::EVT::getIntegerVT(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarSizeInBits(), llvm::EVT::getScalarType(), llvm::EVT::getSizeInBits(), llvm::APInt::getSplat(), llvm::SelectionDAG::getSplatBuildVector(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValueType(), llvm::MVT::i8, llvm::EVT::isInteger(), llvm::TargetLoweringBase::isLegalStoreImmediate(), llvm::SDValue::isUndef(), Magic, llvm::ISD::MUL, and llvm::ISD::ZERO_EXTEND.
Referenced by getMemsetStores().
If a SHL/SRA/SRL node has a constant or splat constant shift amount that is less than the element bit-width of the shift node, return it.
Definition at line 2273 of file SelectionDAG.cpp.
References llvm::SDValue::getOperand(), llvm::SDValue::getScalarValueSizeInBits(), llvm::isConstOrConstSplat(), and llvm::APInt::ult().
Referenced by llvm::SelectionDAG::computeKnownBits().
|
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 6564 of file SelectionDAG.cpp.
References llvm::ISD::ADD, llvm::MachinePointerInfo::getFixedStack(), llvm::SelectionDAG::getMachineFunction(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), and Info.
Referenced by llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTruncStore(), and InferPointerInfo().
|
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 6588 of file SelectionDAG.cpp.
References InferPointerInfo(), Info, and llvm::SDValue::isUndef().
|
static |
Helper function that checks to see if a node is a constant or a build vector of splat constants at least within the demanded elts.
Definition at line 2249 of file SelectionDAG.cpp.
References assert(), llvm::ISD::BUILD_VECTOR, C, llvm::dyn_cast(), llvm::ConstantSDNode::getAPIntValue(), llvm::APInt::getBitWidth(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::EVT::getScalarType(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), and llvm::EVT::getVectorNumElements().
Referenced by llvm::SelectionDAG::computeKnownBits(), and llvm::SelectionDAG::ComputeNumSignBits().
|
static |
Returns true if memcpy source is constant data.
Definition at line 5506 of file SelectionDAG.cpp.
References llvm::ISD::ADD, llvm::ISD::Constant, G, llvm::getConstantDataArrayInfo(), llvm::GlobalAddressSDNode::getGlobal(), llvm::GlobalAddressSDNode::getOffset(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), and llvm::ISD::GlobalAddress.
Referenced by getMemcpyLoadsAndStores().
|
static |
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 376 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().
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
Definition at line 81 of file SelectionDAG.cpp.
Referenced by llvm::SelectionDAG::getVTList().
|
static |
Definition at line 102 of file SelectionDAG.cpp.
References llvm::dbgs(), llvm::SDNode::dump(), llvm::SDValue::getNode(), and LLVM_DEBUG.
Referenced by FoldCONCAT_VECTORS(), llvm::SelectionDAG::FoldConstantVectorArithmetic(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getConstantFP(), llvm::SelectionDAG::getIndexedStore(), llvm::SelectionDAG::getLoad(), llvm::SelectionDAG::getMaskedGather(), llvm::SelectionDAG::getMaskedLoad(), llvm::SelectionDAG::getMaskedScatter(), llvm::SelectionDAG::getMaskedStore(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getStore(), llvm::SelectionDAG::getTruncStore(), and llvm::SelectionDAG::getVectorShuffle().
|
static |
Definition at line 5628 of file SelectionDAG.cpp.
References llvm::MachineFunction::getFunction(), llvm::MachineFunction::getTarget(), llvm::TargetMachine::getTargetTriple(), llvm::Triple::isOSDarwin(), llvm::Function::optForMinSize(), and llvm::Function::optForSize().
Referenced by getMemcpyLoadsAndStores(), getMemmoveLoadsAndStores(), and getMemsetStores().
|
static |
VerifySDNode - Sanity check the given SDNode. Aborts if it is invalid.
Definition at line 789 of file SelectionDAG.cpp.
References AddNodeIDCustom(), AddNodeIDNode(), assert(), llvm::ISD::BUILD_PAIR, llvm::ISD::BUILD_VECTOR, llvm::ISD::CONDCODE, llvm::SelectionDAG::DAGUpdateListener::DAGUpdateListener(), llvm::dbgs(), llvm::ISD::DELETED_NODE, doNotCSE(), llvm::SDNode::dump(), E, llvm::ISD::EntryToken, llvm::ISD::ExternalSymbol, llvm::SDNode::getNumOperands(), llvm::SDNode::getNumValues(), llvm::SDNode::getOpcode(), llvm::SDNode::getOperand(), llvm::EVT::getSimpleVT(), llvm::EVT::getSizeInBits(), llvm::object::getSymbol(), llvm::ExternalSymbolSDNode::getSymbol(), llvm::ExternalSymbolSDNode::getTargetFlags(), llvm::SDValue::getValueSizeInBits(), llvm::SDValue::getValueType(), llvm::SDNode::getValueType(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), llvm::SDNode::getVTList(), llvm::MVT::Glue, llvm::ISD::HANDLENODE, I, llvm::EVT::isExtended(), llvm::EVT::isFloatingPoint(), llvm::EVT::isInteger(), llvm::SDNode::isMachineOpcode(), llvm::EVT::isVector(), llvm_unreachable, llvm::ISD::MCSymbol, N, llvm::SDNode::op_begin(), llvm::SDNode::op_end(), llvm::SDNode::PersistentId, llvm::SelectionDAG::ReplaceAllUsesWith(), llvm::MVT::SimpleTy, llvm::ISD::TargetExternalSymbol, and llvm::ISD::VALUETYPE.
|
static |
Referenced by getMemcpyLoadsAndStores().
|
static |
Definition at line 8697 of file SelectionDAG.cpp.
|
static |
Referenced by getMemcpyLoadsAndStores().
|
static |
Definition at line 8698 of file SelectionDAG.cpp.
|
static |
Definition at line 8699 of file SelectionDAG.cpp.