LLVM: lib/Target/X86/X86ISelDAGToDAG.cpp File Reference (original) (raw)

Go to the source code of this file.

Macros
#define DEBUG_TYPE "x86-isel"
#define PASS_NAME "X86 DAG->DAG Instruction Selection"
#define GET_ND_IF_ENABLED(OPC)
#define CASE_ND(OP)
#define FROM_TO(A, B)
#define CASE(A)
#define FROM_TO(A, B)
#define GET_EGPR_IF_ENABLED(OPC)
#define VPTESTM_CASE(VT, SUFFIX)
#define VPTESTM_BROADCAST_CASES(SUFFIX)
#define VPTESTM_FULL_CASES(SUFFIX)
Functions
STATISTIC (NumLoadMoved, "Number of loads moved below TokenFactor")
static bool isLegalMaskCompare (SDNode *N, const X86Subtarget *Subtarget)
static void moveBelowOrigChain (SelectionDAG *CurDAG, SDValue Load, SDValue Call, SDValue OrigChain)
Replace the original chain operand of the call with load's chain operand and move load below the call's chain operand.
static bool isCalleeLoad (SDValue Callee, SDValue &Chain, bool HasCallSeq)
Return true if call address is a load and it can be moved below CALLSEQ_START and the chains leading up to the call.
static bool isEndbrImm64 (uint64_t Imm)
static bool needBWI (MVT VT)
static bool isDispSafeForFrameIndexOrRegBase (int64_t Val)
static void insertDAGNode (SelectionDAG &DAG, SDValue Pos, SDValue N)
static bool foldMaskAndShiftToExtract (SelectionDAG &DAG, SDValue N, uint64_t Mask, SDValue Shift, SDValue X, X86ISelAddressMode &AM)
static bool foldMaskedShiftToScaledMask (SelectionDAG &DAG, SDValue N, X86ISelAddressMode &AM)
static bool foldMaskAndShiftToScale (SelectionDAG &DAG, SDValue N, uint64_t Mask, SDValue Shift, SDValue X, X86ISelAddressMode &AM)
static bool foldMaskedShiftToBEXTR (SelectionDAG &DAG, SDValue N, uint64_t Mask, SDValue Shift, SDValue X, X86ISelAddressMode &AM, const X86Subtarget &Subtarget)
static bool mayUseCarryFlag (X86::CondCode CC)
static bool isFusableLoadOpStorePattern (StoreSDNode *StoreNode, SDValue StoredVal, SelectionDAG *CurDAG, unsigned LoadOpNo, LoadSDNode *&LoadNode, SDValue &InputChain)
Check whether or not the chain ending in StoreNode is suitable for doing the {load; op; store} to modify transformation.
static unsigned getVPTESTMOpc (MVT TestVT, bool IsTestN, bool FoldedLoad, bool FoldedBCast, bool Masked)

CASE

CASE_ND

Value:

case X86::OP: \

case X86::OP##_ND:

DEBUG_TYPE

#define DEBUG_TYPE "x86-isel"

FROM_TO [1/2]

Value:

CASE_ND(A) NewOpc = IsCTESTCC ? X86::C##B : X86::B; \

break;

static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")

static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")

FROM_TO [2/2]

Value:

case X86::A: \

NewOpc = X86::B; \

break;

GET_EGPR_IF_ENABLED

#define GET_EGPR_IF_ENABLED ( OPC )

Value:

(Subtarget->hasEGPR() ? OPC##_EVEX : OPC)

GET_ND_IF_ENABLED

#define GET_ND_IF_ENABLED ( OPC )

Value:

(Subtarget->hasNDD() ? OPC##_ND : OPC)

PASS_NAME

VPTESTM_BROADCAST_CASES

#define VPTESTM_BROADCAST_CASES ( SUFFIX )

Value:

VPTESTM_CASE(v4i32, DZ128##SUFFIX) \

VPTESTM_CASE(v2i64, QZ128##SUFFIX) \

VPTESTM_CASE(v8i32, DZ256##SUFFIX) \

VPTESTM_CASE(v4i64, QZ256##SUFFIX) \

VPTESTM_CASE(v16i32, DZ##SUFFIX) \

VPTESTM_CASE(v8i64, QZ##SUFFIX)

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

Referenced by getVPTESTMOpc().

VPTESTM_CASE

#define VPTESTM_CASE ( VT,
SUFFIX )

Value:

case MVT::VT: \

return IsTestN ? X86::VPTESTNM##SUFFIX##k: X86::VPTESTM##SUFFIX##k; \

return IsTestN ? X86::VPTESTNM##SUFFIX : X86::VPTESTM##SUFFIX;

VPTESTM_FULL_CASES

#define VPTESTM_FULL_CASES ( SUFFIX )

Value:

VPTESTM_BROADCAST_CASES(SUFFIX) \

VPTESTM_CASE(v16i8, BZ128##SUFFIX) \

VPTESTM_CASE(v8i16, WZ128##SUFFIX) \

VPTESTM_CASE(v32i8, BZ256##SUFFIX) \

VPTESTM_CASE(v16i16, WZ256##SUFFIX) \

VPTESTM_CASE(v64i8, BZ##SUFFIX) \

VPTESTM_CASE(v32i16, WZ##SUFFIX)

#define VPTESTM_BROADCAST_CASES(SUFFIX)

Referenced by getVPTESTMOpc().

foldMaskAndShiftToExtract()

Definition at line 2086 of file X86ISelDAGToDAG.cpp.

References llvm::ISD::AND, DL, llvm::SelectionDAG::getConstant(), llvm::SDValue::getConstantOperandVal(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getZExtOrTrunc(), llvm::SDValue::hasOneUse(), insertDAGNode(), llvm::isa(), N, llvm::SelectionDAG::RemoveDeadNode(), llvm::SelectionDAG::ReplaceAllUsesWith(), llvm::ISD::SHL, llvm::ISD::SRL, and X.

foldMaskAndShiftToScale()

Definition at line 2225 of file X86ISelDAGToDAG.cpp.

References llvm::ISD::ANY_EXTEND, assert(), DL, llvm::SelectionDAG::getConstant(), llvm::SDValue::getConstantOperandVal(), llvm::APInt::getHighBitsSet(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getZExtOrTrunc(), llvm::SDValue::hasOneUse(), insertDAGNode(), llvm::isa(), llvm::isShiftedMask_64(), llvm::SelectionDAG::MaskedValueIsZero(), N, llvm::SelectionDAG::RemoveDeadNode(), llvm::SelectionDAG::ReplaceAllUsesWith(), llvm::ISD::SHL, llvm::ISD::SRL, X, and llvm::ISD::ZERO_EXTEND.

foldMaskedShiftToBEXTR()

Definition at line 2317 of file X86ISelDAGToDAG.cpp.

References llvm::ISD::AND, DL, llvm::SelectionDAG::getConstant(), llvm::SDValue::getConstantOperandVal(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getZExtOrTrunc(), llvm::SDValue::hasOneUse(), insertDAGNode(), llvm::isa(), llvm::isShiftedMask_64(), N, llvm::SelectionDAG::RemoveDeadNode(), llvm::SelectionDAG::ReplaceAllUsesWith(), llvm::ISD::SHL, llvm::ISD::SRL, and X.

foldMaskedShiftToScaledMask()

Definition at line 2133 of file X86ISelDAGToDAG.cpp.

References llvm::ISD::AND, llvm::ISD::ANY_EXTEND, llvm::cast(), DL, llvm::SDValue::getConstantOperandVal(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getSignedConstant(), llvm::SDValue::getSimpleValueType(), llvm::SDValue::hasOneUse(), insertDAGNode(), llvm::isa(), llvm::isUInt(), N, llvm::SelectionDAG::RemoveDeadNode(), llvm::SelectionDAG::ReplaceAllUsesWith(), llvm::ISD::SHL, and X.

getVPTESTMOpc()

insertDAGNode()

isCalleeLoad()

Return true if call address is a load and it can be moved below CALLSEQ_START and the chains leading up to the call.

Return the CALLSEQ_START by reference as a second output. In the case of a tail call, there isn't a callseq node between the call chain and the load.

Definition at line 864 of file X86ISelDAGToDAG.cpp.

References llvm::cast(), llvm::dyn_cast(), llvm::SDValue::getNode(), llvm::SDValue::getNumOperands(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SDValue::hasOneUse(), llvm::isa(), llvm::ISD::NON_EXTLOAD, llvm::ISD::TokenFactor, and llvm::ISD::UNINDEXED.

isDispSafeForFrameIndexOrRegBase()

bool isDispSafeForFrameIndexOrRegBase ( int64_t Val) static

isEndbrImm64()

isFusableLoadOpStorePattern()

Check whether or not the chain ending in StoreNode is suitable for doing the {load; op; store} to modify transformation.

Definition at line 3479 of file X86ISelDAGToDAG.cpp.

References llvm::cast(), llvm::LoadSDNode::getBasePtr(), llvm::StoreSDNode::getBasePtr(), llvm::MemSDNode::getChain(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getNumOperands(), llvm::LoadSDNode::getOffset(), llvm::StoreSDNode::getOffset(), llvm::SDValue::getOpcode(), llvm::SDNode::getOperand(), llvm::SDValue::getOperand(), llvm::SDValue::getResNo(), llvm::SDNode::hasNUsesOfValue(), llvm::SDNode::hasPredecessorHelper(), llvm::MemSDNode::isNonTemporal(), llvm::ISD::isNormalLoad(), llvm::ISD::isNormalStore(), llvm::SDNode::ops(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::ISD::TokenFactor.

isLegalMaskCompare()

Definition at line 624 of file X86ISelDAGToDAG.cpp.

References llvm::X86ISD::CMPM, llvm::X86ISD::CMPMM, llvm::X86ISD::CMPMM_SAE, const, llvm::X86ISD::FSETCCM, llvm::X86ISD::FSETCCM_SAE, llvm::EVT::is128BitVector(), llvm::EVT::is256BitVector(), isLegalMaskCompare(), N, llvm::ISD::SETCC, llvm::X86ISD::STRICT_CMPM, llvm::X86ISD::VFPCLASS, and llvm::X86ISD::VFPCLASSS.

Referenced by isLegalMaskCompare().

mayUseCarryFlag()

Definition at line 3406 of file X86ISelDAGToDAG.cpp.

References llvm::X86::COND_E, llvm::X86::COND_G, llvm::X86::COND_GE, llvm::X86::COND_L, llvm::X86::COND_LE, llvm::X86::COND_NE, llvm::X86::COND_NO, llvm::X86::COND_NP, llvm::X86::COND_NS, llvm::X86::COND_O, llvm::X86::COND_P, and llvm::X86::COND_S.

moveBelowOrigChain()

Replace the original chain operand of the call with load's chain operand and move load below the call's chain operand.

Definition at line 829 of file X86ISelDAGToDAG.cpp.

References AbstractManglingParser< Derived, Alloc >::Ops, assert(), Call, llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getNumOperands(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SDNode::op_begin(), llvm::SDNode::op_end(), SDValue(), llvm::ISD::TokenFactor, and llvm::SelectionDAG::UpdateNodeOperands().

needBWI()

STATISTIC()

STATISTIC ( NumLoadMoved ,
"Number of loads moved below TokenFactor" )

AndImmShrink

cl::opt< bool > AndImmShrink("x86-and-imm-shrink", cl::init(true), cl::desc("Enable setting constant bits to reduce size of mask immediates"), cl::Hidden) ( "x86-and-imm-shrink" , cl::init(true) , cl::desc("Enable setting constant bits to reduce size of mask immediates") , cl::Hidden ) static

EnablePromoteAnyextLoad

cl::opt< bool > EnablePromoteAnyextLoad("x86-promote-anyext-load", cl::init(true), cl::desc("Enable promoting aligned anyext load to wider load"), cl::Hidden) ( "x86-promote-anyext-load" , cl::init(true) , cl::desc("Enable promoting aligned anyext load to wider load") , cl::Hidden ) static

IndirectBranchTracking