// The address of the GOT
GLOBAL_OFFSET_TABLE,
+
+ // FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and
+ // llvm.returnaddress on the DAG. These nodes take one operand, the index
+ // of the frame or return address to return. An index of zero corresponds
+ // to the current function's frame or return address, an index of one to the
+ // parent's frame or return address, and so on.
+ FRAMEADDR, RETURNADDR,
// TargetConstant* - Like Constant*, but the DAG does not do any folding or
// simplification of the constant.
// UNDEF - An undefined node
UNDEF,
- /// FORMAL_ARGUMENTS(CHAIN, CC#, ISVARARG) - This node represents the formal
- /// arguments for a function. CC# is a Constant value indicating the
- /// calling convention of the function, and ISVARARG is a flag that
- /// indicates whether the function is varargs or not. This node has one
- /// result value for each incoming argument, plus one for the output chain.
- /// It must be custom legalized.
+ /// FORMAL_ARGUMENTS(CHAIN, CC#, ISVARARG, FLAG0, ..., FLAGn) - This node
+ /// represents the formal arguments for a function. CC# is a Constant value
+ /// indicating the calling convention of the function, and ISVARARG is a
+ /// flag that indicates whether the function is varargs or not. This node
+ /// has one result value for each incoming argument, plus one for the output
+ /// chain. It must be custom legalized. See description of CALL node for
+ /// FLAG argument contents explanation.
///
FORMAL_ARGUMENTS,
/// RV1, RV2...RVn, CHAIN = CALL(CHAIN, CC#, ISVARARG, ISTAILCALL, CALLEE,
- /// ARG0, SIGN0, ARG1, SIGN1, ... ARGn, SIGNn)
+ /// ARG0, FLAG0, ARG1, FLAG1, ... ARGn, FLAGn)
/// This node represents a fully general function call, before the legalizer
- /// runs. This has one result value for each argument / signness pair, plus
- /// a chain result. It must be custom legalized.
+ /// runs. This has one result value for each argument / flag pair, plus
+ /// a chain result. It must be custom legalized. Flag argument indicates
+ /// misc. argument attributes. Currently:
+ /// Bit 0 - signness
+ /// Bit 1 - 'inreg' attribute
+ /// Bit 2 - 'sret' attribute
CALL,
// EXTRACT_ELEMENT - This is used to get the first or second (determined by
// Operand #2n+3: A TargetConstant, indicating if the reg is a use/def
// Operand #last: Optional, an incoming flag.
INLINEASM,
+
+ // LABEL - Represents a label in mid basic block used to track
+ // locations needed for debug and exception handling tables. This node
+ // returns a chain.
+ // Operand #0 : input chain.
+ // Operand #1 : module unique number use to identify the label.
+ LABEL,
// STACKSAVE - STACKSAVE has one operand, an input chain. It produces a
// value, the same type as the pointer type for the system, and an output
// DEBUG_LOC - This node is used to represent source line information
// embedded in the code. It takes a token chain as input, then a line
- // number, then a column then a file id (provided by MachineDebugInfo.) It
+ // number, then a column then a file id (provided by MachineModuleInfo.) It
// produces a token chain as output.
DEBUG_LOC,
- // DEBUG_LABEL - This node is used to mark a location in the code where a
- // label should be generated for use by the debug information. It takes a
- // token chain as input and then a unique id (provided by MachineDebugInfo.)
- // It produces a token chain as output.
- DEBUG_LABEL,
-
// BUILTIN_OP_END - This must be the last enum value in this list.
BUILTIN_OP_END
};
bool isBuildVectorAllZeros(const SDNode *N);
//===--------------------------------------------------------------------===//
- /// MemOpAddrMode enum - This enum defines the three load / store addressing
- /// modes.
+ /// MemIndexedMode enum - This enum defines the load / store indexed
+ /// addressing modes.
///
/// UNINDEXED "Normal" load / store. The effective address is already
/// computed and is available in the base pointer. The offset
/// computation); a post-indexed store produces one value (the
/// the result of the base +/- offset computation).
///
- enum MemOpAddrMode {
+ enum MemIndexedMode {
UNINDEXED = 0,
PRE_INC,
PRE_DEC,
POST_INC,
- POST_DEC
+ POST_DEC,
+ LAST_INDEXED_MODE
};
//===--------------------------------------------------------------------===//
/// operation.
bool hasNUsesOfValue(unsigned NUses, unsigned Value) const;
- // isOnlyUse - Return true if this node is the only use of N.
+ /// isOnlyUse - Return true if this node is the only use of N.
+ ///
bool isOnlyUse(SDNode *N) const;
- // isOperand - Return true if this node is an operand of N.
+ /// isOperand - Return true if this node is an operand of N.
+ ///
bool isOperand(SDNode *N) const;
+ /// isPredecessor - Return true if this node is a predecessor of N. This node
+ /// is either an operand of N or it can be reached by recursively traversing
+ /// up the operands.
+ /// NOTE: this is an expensive method. Use it carefully.
+ bool isPredecessor(SDNode *N) const;
+
/// getNumOperands - Return the number of values used by this operation.
///
unsigned getNumOperands() const { return NumOperands; }
/// getOperationName - Return the opcode of this operation for printing.
///
const char* getOperationName(const SelectionDAG *G = 0) const;
- static const char* getAddressingModeName(ISD::MemOpAddrMode AM);
+ static const char* getIndexedModeName(ISD::MemIndexedMode AM);
void dump() const;
void dump(const SelectionDAG *G) const;
///
class LoadSDNode : public SDNode {
// AddrMode - unindexed, pre-indexed, post-indexed.
- ISD::MemOpAddrMode AddrMode;
+ ISD::MemIndexedMode AddrMode;
// ExtType - non-ext, anyext, sext, zext.
ISD::LoadExtType ExtType;
protected:
friend class SelectionDAG;
LoadSDNode(SDOperand Chain, SDOperand Ptr, SDOperand Off,
- ISD::MemOpAddrMode AM, ISD::LoadExtType ETy, MVT::ValueType LVT,
+ ISD::MemIndexedMode AM, ISD::LoadExtType ETy, MVT::ValueType LVT,
const Value *SV, int O=0, unsigned Align=1, bool Vol=false)
: SDNode(ISD::LOAD, Chain, Ptr, Off),
AddrMode(AM), ExtType(ETy), LoadedVT(LVT), SrcValue(SV), SVOffset(O),
const SDOperand getChain() const { return getOperand(0); }
const SDOperand getBasePtr() const { return getOperand(1); }
const SDOperand getOffset() const { return getOperand(2); }
- ISD::MemOpAddrMode getAddressingMode() const { return AddrMode; }
+ ISD::MemIndexedMode getAddressingMode() const { return AddrMode; }
ISD::LoadExtType getExtensionType() const { return ExtType; }
MVT::ValueType getLoadedVT() const { return LoadedVT; }
const Value *getSrcValue() const { return SrcValue; }
///
class StoreSDNode : public SDNode {
// AddrMode - unindexed, pre-indexed, post-indexed.
- ISD::MemOpAddrMode AddrMode;
+ ISD::MemIndexedMode AddrMode;
// IsTruncStore - True is the op does a truncation before store.
bool IsTruncStore;
protected:
friend class SelectionDAG;
StoreSDNode(SDOperand Chain, SDOperand Value, SDOperand Ptr, SDOperand Off,
- ISD::MemOpAddrMode AM, bool isTrunc, MVT::ValueType SVT,
+ ISD::MemIndexedMode AM, bool isTrunc, MVT::ValueType SVT,
const Value *SV, int O=0, unsigned Align=0, bool Vol=false)
: SDNode(ISD::STORE, Chain, Value, Ptr, Off),
AddrMode(AM), IsTruncStore(isTrunc), StoredVT(SVT), SrcValue(SV),
const SDOperand getValue() const { return getOperand(1); }
const SDOperand getBasePtr() const { return getOperand(2); }
const SDOperand getOffset() const { return getOperand(3); }
- ISD::MemOpAddrMode getAddressingMode() const { return AddrMode; }
+ ISD::MemIndexedMode getAddressingMode() const { return AddrMode; }
bool isTruncatingStore() const { return IsTruncStore; }
MVT::ValueType getStoredVT() const { return StoredVT; }
const Value *getSrcValue() const { return SrcValue; }
unsigned getAlignment() const { return Alignment; }
bool isVolatile() const { return IsVolatile; }
- static bool classof(const LoadSDNode *) { return true; }
+ static bool classof(const StoreSDNode *) { return true; }
static bool classof(const SDNode *N) {
return N->getOpcode() == ISD::STORE;
}