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 |
|---|