[llvm-commits] [llvm] r53422 - /llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
Evan Cheng
evan.cheng at apple.com
Thu Jul 10 17:07:56 PDT 2008
Cool. Can this be achieved with union + bitfields?
Evan
On Jul 10, 2008, at 2:44 PM, Dan Gohman wrote:
> Author: djg
> Date: Thu Jul 10 16:44:59 2008
> New Revision: 53422
>
> URL: http://llvm.org/viewvc/llvm-project?rev=53422&view=rev
> Log:
> Add a SubclassData field to SDNode, similar to what's done
> in Value, to make use of some otherwise unused space. Use this
> field to shrink LoadSDNode and StoreSDNode by moving the
> addressing mode and ext/trunc fields there.
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
>
> Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h?rev=53422&r1=53421&r2=53422&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h Thu Jul 10
> 16:44:59 2008
> @@ -1032,8 +1032,15 @@
>
> /// OperandsNeedDelete - This is true if OperandList was new[]'d.
> If true,
> /// then they will be delete[]'d when the node is destroyed.
> - bool OperandsNeedDelete : 1;
> + unsigned short OperandsNeedDelete : 1;
>
> +protected:
> + /// SubclassData - This member is defined by this class, but is
> not used for
> + /// anything. Subclasses can use it to hold whatever state they
> find useful.
> + /// This field is initialized to zero by the ctor.
> + unsigned short SubclassData : 15;
> +
> +private:
> /// NodeId - Unique id per SDNode in the DAG.
> int NodeId;
>
> @@ -1248,8 +1255,8 @@
> }
>
> SDNode(unsigned Opc, SDVTList VTs, const SDOperand *Ops, unsigned
> NumOps)
> - : NodeType(Opc), NodeId(-1), Uses(NULL) {
> - OperandsNeedDelete = true;
> + : NodeType(Opc), OperandsNeedDelete(true), SubclassData(0),
> + NodeId(-1), Uses(NULL) {
> NumOperands = NumOps;
> OperandList = NumOps ? new SDUse[NumOperands] : 0;
>
> @@ -1264,7 +1271,8 @@
> }
>
> SDNode(unsigned Opc, SDVTList VTs, const SDUse *Ops, unsigned
> NumOps)
> - : NodeType(Opc), NodeId(-1), Uses(NULL) {
> + : NodeType(Opc), OperandsNeedDelete(true), SubclassData(0),
> + NodeId(-1), Uses(NULL) {
> OperandsNeedDelete = true;
> NumOperands = NumOps;
> OperandList = NumOps ? new SDUse[NumOperands] : 0;
> @@ -1279,9 +1287,11 @@
> NumValues = VTs.NumVTs;
> }
>
> + /// This constructor adds no operands itself; operands can be
> + /// set later with InitOperands.
> SDNode(unsigned Opc, SDVTList VTs)
> - : NodeType(Opc), NodeId(-1), Uses(NULL) {
> - OperandsNeedDelete = false; // Operands set with InitOperands.
> + : NodeType(Opc), OperandsNeedDelete(false), SubclassData(0),
> + NodeId(-1), Uses(NULL) {
> NumOperands = 0;
> OperandList = 0;
> ValueList = VTs.VTs;
> @@ -2047,10 +2057,6 @@
> /// LSBaseSDNode - Base class for LoadSDNode and StoreSDNode
> ///
> class LSBaseSDNode : public MemSDNode {
> -private:
> - // AddrMode - unindexed, pre-indexed, post-indexed.
> - ISD::MemIndexedMode AddrMode;
> -
> protected:
> //! Operand array for load and store
> /*!
> @@ -2063,7 +2069,8 @@
> LSBaseSDNode(ISD::NodeType NodeTy, SDOperand *Operands, unsigned
> numOperands,
> SDVTList VTs, ISD::MemIndexedMode AM, MVT VT,
> const Value *SV, int SVO, unsigned Align, bool Vol)
> - : MemSDNode(NodeTy, VTs, VT, SV, SVO, Align, Vol), AddrMode(AM) {
> + : MemSDNode(NodeTy, VTs, VT, SV, SVO, Align, Vol) {
> + SubclassData = AM;
> for (unsigned i = 0; i != numOperands; ++i)
> Ops[i] = Operands[i];
> InitOperands(Ops, numOperands);
> @@ -2076,13 +2083,17 @@
> return getOperand(getOpcode() == ISD::LOAD ? 2 : 3);
> }
>
> - ISD::MemIndexedMode getAddressingMode() const { return AddrMode; }
> + /// getAddressingMode - Return the addressing mode for this load
> or store:
> + /// unindexed, pre-inc, pre-dec, post-inc, or post-dec.
> + ISD::MemIndexedMode getAddressingMode() const {
> + return ISD::MemIndexedMode(SubclassData & 7);
> + }
>
> /// isIndexed - Return true if this is a pre/post inc/dec load/
> store.
> - bool isIndexed() const { return AddrMode != ISD::UNINDEXED; }
> + bool isIndexed() const { return getAddressingMode() !=
> ISD::UNINDEXED; }
>
> /// isUnindexed - Return true if this is NOT a pre/post inc/dec
> load/store.
> - bool isUnindexed() const { return AddrMode == ISD::UNINDEXED; }
> + bool isUnindexed() const { return getAddressingMode() ==
> ISD::UNINDEXED; }
>
> static bool classof(const LSBaseSDNode *) { return true; }
> static bool classof(const SDNode *N) {
> @@ -2095,21 +2106,23 @@
> ///
> class LoadSDNode : public LSBaseSDNode {
> virtual void ANCHOR(); // Out-of-line virtual method to give
> class a home.
> -
> - // ExtType - non-ext, anyext, sext, zext.
> - ISD::LoadExtType ExtType;
> -
> protected:
> friend class SelectionDAG;
> LoadSDNode(SDOperand *ChainPtrOff, SDVTList VTs,
> ISD::MemIndexedMode AM, ISD::LoadExtType ETy, MVT LVT,
> const Value *SV, int O=0, unsigned Align=0, bool
> Vol=false)
> : LSBaseSDNode(ISD::LOAD, ChainPtrOff, 3,
> - VTs, AM, LVT, SV, O, Align, Vol),
> - ExtType(ETy) {}
> + VTs, AM, LVT, SV, O, Align, Vol) {
> + SubclassData |= (unsigned short)ETy << 3;
> + }
> public:
>
> - ISD::LoadExtType getExtensionType() const { return ExtType; }
> + /// getExtensionType - Return whether this is a plain node,
> + /// or one of the varieties of value-extending loads.
> + ISD::LoadExtType getExtensionType() const {
> + return ISD::LoadExtType((SubclassData >> 3) & 3);
> + }
> +
> const SDOperand &getBasePtr() const { return getOperand(1); }
> const SDOperand &getOffset() const { return getOperand(2); }
>
> @@ -2123,22 +2136,22 @@
> ///
> class StoreSDNode : public LSBaseSDNode {
> virtual void ANCHOR(); // Out-of-line virtual method to give
> class a home.
> -
> - // IsTruncStore - True if the op does a truncation before store.
> For
> - // integers this is the same as doing a TRUNCATE and storing the
> result.
> - // For floats, it is the same as doing an FP_ROUND and storing
> the result.
> - bool IsTruncStore;
> protected:
> friend class SelectionDAG;
> StoreSDNode(SDOperand *ChainValuePtrOff, SDVTList VTs,
> ISD::MemIndexedMode AM, bool isTrunc, MVT SVT,
> const Value *SV, int O=0, unsigned Align=0, bool
> Vol=false)
> : LSBaseSDNode(ISD::STORE, ChainValuePtrOff, 4,
> - VTs, AM, SVT, SV, O, Align, Vol),
> - IsTruncStore(isTrunc) {}
> + VTs, AM, SVT, SV, O, Align, Vol) {
> + SubclassData |= (unsigned short)isTrunc << 3;
> + }
> public:
>
> - bool isTruncatingStore() const { return IsTruncStore; }
> + /// isTruncatingStore - Return true if the op does a truncation
> before store.
> + /// For integers this is the same as doing a TRUNCATE and storing
> the result.
> + /// For floats, it is the same as doing an FP_ROUND and storing
> the result.
> + bool isTruncatingStore() const { return (SubclassData >> 3) & 1; }
> +
> const SDOperand &getValue() const { return getOperand(1); }
> const SDOperand &getBasePtr() const { return getOperand(2); }
> const SDOperand &getOffset() const { return getOperand(3); }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list