return Ret;
}
- SDNode(unsigned Opc, const SDOperand *Ops, unsigned NumOps)
+ SDNode(unsigned Opc, SDVTList VTs, const SDOperand *Ops, unsigned NumOps)
: NodeType(Opc), NodeId(-1) {
OperandsNeedDelete = true;
NumOperands = NumOps;
SDNode *N = OperandList[i].Val;
N->Uses.push_back(this);
}
- ValueList = 0;
- NumValues = 0;
+ ValueList = VTs.VTs;
+ NumValues = VTs.NumVTs;
Prev = 0; Next = 0;
}
void MorphNodeTo(unsigned Opc, SDVTList L,
const SDOperand *Ops, unsigned NumOps);
- void setValueTypes(SDVTList L) {
- assert(NumValues == 0 && "Should not have values yet!");
- ValueList = L.VTs;
- NumValues = L.NumVTs;
- }
-
void addUser(SDNode *User) {
Uses.push_back(User);
}
class HandleSDNode : public SDNode {
virtual void ANCHOR(); // Out-of-line virtual method to give class a home.
public:
- HandleSDNode(SDOperand X) : SDNode(ISD::HANDLENODE, &X, 1) {}
+ HandleSDNode(SDOperand X) : SDNode(ISD::HANDLENODE, getSDVTList(MVT::Other),
+ &X, 1) {}
~HandleSDNode();
SDOperand getValue() const { return getOperand(0); }
};
protected:
friend class SelectionDAG;
StringSDNode(const std::string &val)
- : SDNode(ISD::STRING, 0, 0), Value(val) {
- setValueTypes(getSDVTList(MVT::Other));
+ : SDNode(ISD::STRING, getSDVTList(MVT::Other), 0, 0), Value(val) {
}
public:
const std::string &getValue() const { return Value; }
protected:
friend class SelectionDAG;
ConstantSDNode(bool isTarget, uint64_t val, MVT::ValueType VT)
- : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant, 0, 0), Value(val) {
- setValueTypes(getSDVTList(VT));
+ : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant, getSDVTList(VT),
+ 0, 0), Value(val) {
}
public:
protected:
friend class SelectionDAG;
ConstantFPSDNode(bool isTarget, double val, MVT::ValueType VT)
- : SDNode(isTarget ? ISD::TargetConstantFP : ISD::ConstantFP, 0, 0),
+ : SDNode(isTarget ? ISD::TargetConstantFP : ISD::ConstantFP,
+ getSDVTList(VT), 0, 0),
Value(val) {
- setValueTypes(getSDVTList(VT));
}
public:
friend class SelectionDAG;
GlobalAddressSDNode(bool isTarget, const GlobalValue *GA, MVT::ValueType VT,
int o=0)
- : SDNode(isTarget ? ISD::TargetGlobalAddress : ISD::GlobalAddress, 0, 0),
+ : SDNode(isTarget ? ISD::TargetGlobalAddress : ISD::GlobalAddress,
+ getSDVTList(VT), 0, 0),
Offset(o) {
- setValueTypes(getSDVTList(VT));
TheGlobal = const_cast<GlobalValue*>(GA);
}
public:
protected:
friend class SelectionDAG;
FrameIndexSDNode(int fi, MVT::ValueType VT, bool isTarg)
- : SDNode(isTarg ? ISD::TargetFrameIndex : ISD::FrameIndex, 0, 0), FI(fi) {
- setValueTypes(getSDVTList(VT));
+ : SDNode(isTarg ? ISD::TargetFrameIndex : ISD::FrameIndex, getSDVTList(VT),
+ 0, 0), FI(fi) {
}
public:
protected:
friend class SelectionDAG;
JumpTableSDNode(int jti, MVT::ValueType VT, bool isTarg)
- : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable, 0, 0), JTI(jti) {
- setValueTypes(getSDVTList(VT));
+ : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable, getSDVTList(VT),
+ 0, 0), JTI(jti) {
}
public:
friend class SelectionDAG;
ConstantPoolSDNode(bool isTarget, Constant *c, MVT::ValueType VT,
int o=0)
- : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, 0, 0),
- Offset(o), Alignment(0) {
+ : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
+ getSDVTList(VT), 0, 0), Offset(o), Alignment(0) {
assert((int)Offset >= 0 && "Offset is too large");
- setValueTypes(getSDVTList(VT));
Val.ConstVal = c;
}
ConstantPoolSDNode(bool isTarget, Constant *c, MVT::ValueType VT, int o,
unsigned Align)
- : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, 0, 0),
+ : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
+ getSDVTList(VT), 0, 0),
Offset(o), Alignment(Align) {
assert((int)Offset >= 0 && "Offset is too large");
- setValueTypes(getSDVTList(VT));
Val.ConstVal = c;
}
ConstantPoolSDNode(bool isTarget, MachineConstantPoolValue *v,
MVT::ValueType VT, int o=0)
- : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, 0, 0),
- Offset(o), Alignment(0) {
+ : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
+ getSDVTList(VT), 0, 0), Offset(o), Alignment(0) {
assert((int)Offset >= 0 && "Offset is too large");
- setValueTypes(getSDVTList(VT));
Val.MachineCPVal = v;
Offset |= 1 << (sizeof(unsigned)*8-1);
}
ConstantPoolSDNode(bool isTarget, MachineConstantPoolValue *v,
MVT::ValueType VT, int o, unsigned Align)
- : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, 0, 0),
- Offset(o), Alignment(Align) {
+ : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool,
+ getSDVTList(VT), 0, 0), Offset(o), Alignment(Align) {
assert((int)Offset >= 0 && "Offset is too large");
- setValueTypes(getSDVTList(VT));
Val.MachineCPVal = v;
Offset |= 1 << (sizeof(unsigned)*8-1);
}
protected:
friend class SelectionDAG;
BasicBlockSDNode(MachineBasicBlock *mbb)
- : SDNode(ISD::BasicBlock, 0, 0), MBB(mbb) {
- setValueTypes(getSDVTList(MVT::Other));
+ : SDNode(ISD::BasicBlock, getSDVTList(MVT::Other), 0, 0), MBB(mbb) {
}
public:
protected:
friend class SelectionDAG;
SrcValueSDNode(const Value* v, int o)
- : SDNode(ISD::SRCVALUE, 0, 0), V(v), offset(o) {
- setValueTypes(getSDVTList(MVT::Other));
+ : SDNode(ISD::SRCVALUE, getSDVTList(MVT::Other), 0, 0), V(v), offset(o) {
}
public:
protected:
friend class SelectionDAG;
RegisterSDNode(unsigned reg, MVT::ValueType VT)
- : SDNode(ISD::Register, 0, 0), Reg(reg) {
- setValueTypes(getSDVTList(VT));
+ : SDNode(ISD::Register, getSDVTList(VT), 0, 0), Reg(reg) {
}
public:
protected:
friend class SelectionDAG;
ExternalSymbolSDNode(bool isTarget, const char *Sym, MVT::ValueType VT)
- : SDNode(isTarget ? ISD::TargetExternalSymbol : ISD::ExternalSymbol, 0, 0),
- Symbol(Sym) {
- setValueTypes(getSDVTList(VT));
+ : SDNode(isTarget ? ISD::TargetExternalSymbol : ISD::ExternalSymbol,
+ getSDVTList(VT), 0, 0), Symbol(Sym) {
}
public:
protected:
friend class SelectionDAG;
CondCodeSDNode(ISD::CondCode Cond)
- : SDNode(ISD::CONDCODE, 0, 0), Condition(Cond) {
- setValueTypes(getSDVTList(MVT::Other));
+ : SDNode(ISD::CONDCODE, getSDVTList(MVT::Other), 0, 0), Condition(Cond) {
}
public:
virtual void ANCHOR(); // Out-of-line virtual method to give class a home.
protected:
friend class SelectionDAG;
- VTSDNode(MVT::ValueType VT) : SDNode(ISD::VALUETYPE, 0, 0), ValueType(VT) {
- setValueTypes(getSDVTList(MVT::Other));
+ VTSDNode(MVT::ValueType VT) : SDNode(ISD::VALUETYPE, getSDVTList(MVT::Other),
+ 0, 0), ValueType(VT) {
}
public:
bool IsVolatile;
protected:
friend class SelectionDAG;
- LoadSDNode(SDOperand *ChainPtrOff,
+ LoadSDNode(SDOperand *ChainPtrOff, SDVTList VTs,
ISD::MemIndexedMode AM, ISD::LoadExtType ETy, MVT::ValueType LVT,
const Value *SV, int O=0, unsigned Align=1, bool Vol=false)
- : SDNode(ISD::LOAD, ChainPtrOff, 3),
+ : SDNode(ISD::LOAD, VTs, ChainPtrOff, 3),
AddrMode(AM), ExtType(ETy), LoadedVT(LVT), SrcValue(SV), SVOffset(O),
Alignment(Align), IsVolatile(Vol) {
assert((getOffset().getOpcode() == ISD::UNDEF ||
bool IsVolatile;
protected:
friend class SelectionDAG;
- StoreSDNode(SDOperand *ChainValuePtrOff,
+ StoreSDNode(SDOperand *ChainValuePtrOff, SDVTList VTs,
ISD::MemIndexedMode AM, bool isTrunc, MVT::ValueType SVT,
const Value *SV, int O=0, unsigned Align=0, bool Vol=false)
- : SDNode(ISD::STORE, ChainValuePtrOff, 4),
+ : SDNode(ISD::STORE, VTs, ChainValuePtrOff, 4),
AddrMode(AM), IsTruncStore(isTrunc), StoredVT(SVT), SrcValue(SV),
SVOffset(O), Alignment(Align), IsVolatile(Vol) {
assert((getOffset().getOpcode() == ISD::UNDEF ||
static void setNext(SDNode *N, SDNode *Next) { N->Next = Next; }
static SDNode *createSentinel() {
- SDNode *N = new SDNode(ISD::EntryToken, 0, 0);
- N->setValueTypes(SDNode::getSDVTList(MVT::Other));
- return N;
+ return new SDNode(ISD::EntryToken, SDNode::getSDVTList(MVT::Other), 0, 0);
}
static void destroySentinel(SDNode *N) { delete N; }
//static SDNode *createNode(const SDNode &V) { return new SDNode(V); }
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new SDNode(Opcode, 0, 0);
- N->setValueTypes(SDNode::getSDVTList(VT));
+ SDNode *N = new SDNode(Opcode, SDNode::getSDVTList(VT), 0, 0);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new SDNode(Opcode, Ops, 1);
- N->setValueTypes(VTs);
+ N = new SDNode(Opcode, VTs, Ops, 1);
CSEMap.InsertNode(N, IP);
} else {
- N = new SDNode(Opcode, Ops, 1);
- N->setValueTypes(VTs);
+ N = new SDNode(Opcode, VTs, Ops, 1);
}
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new SDNode(Opcode, Ops, 2);
- N->setValueTypes(VTs);
+ N = new SDNode(Opcode, VTs, Ops, 2);
CSEMap.InsertNode(N, IP);
} else {
- N = new SDNode(Opcode, Ops, 2);
- N->setValueTypes(VTs);
+ N = new SDNode(Opcode, VTs, Ops, 2);
}
AllNodes.push_back(N);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new SDNode(Opcode, Ops, 3);
- N->setValueTypes(VTs);
+ N = new SDNode(Opcode, VTs, Ops, 3);
CSEMap.InsertNode(N, IP);
} else {
- N = new SDNode(Opcode, Ops, 3);
- N->setValueTypes(VTs);
+ N = new SDNode(Opcode, VTs, Ops, 3);
}
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new LoadSDNode(Ops, ISD::UNINDEXED,
+ SDNode *N = new LoadSDNode(Ops, VTs, ISD::UNINDEXED,
ISD::NON_EXTLOAD, VT, SV, SVOffset, Alignment,
isVolatile);
- N->setValueTypes(VTs);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new LoadSDNode(Ops, ISD::UNINDEXED, ExtType, EVT,
+ SDNode *N = new LoadSDNode(Ops, VTs, ISD::UNINDEXED, ExtType, EVT,
SV, SVOffset, Alignment, isVolatile);
- N->setValueTypes(VTs);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new LoadSDNode(Ops, AM,
+ SDNode *N = new LoadSDNode(Ops, VTs, AM,
LD->getExtensionType(), LD->getLoadedVT(),
LD->getSrcValue(), LD->getSrcValueOffset(),
LD->getAlignment(), LD->isVolatile());
- N->setValueTypes(VTs);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new StoreSDNode(Ops, ISD::UNINDEXED, false,
+ SDNode *N = new StoreSDNode(Ops, VTs, ISD::UNINDEXED, false,
VT, SV, SVOffset, Alignment, isVolatile);
- N->setValueTypes(VTs);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new StoreSDNode(Ops, ISD::UNINDEXED, isTrunc,
+ SDNode *N = new StoreSDNode(Ops, VTs, ISD::UNINDEXED, isTrunc,
SVT, SV, SVOffset, Alignment, isVolatile);
- N->setValueTypes(VTs);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- SDNode *N = new StoreSDNode(Ops, AM,
+ SDNode *N = new StoreSDNode(Ops, VTs, AM,
ST->isTruncatingStore(), ST->getStoredVT(),
ST->getSrcValue(), ST->getSrcValueOffset(),
ST->getAlignment(), ST->isVolatile());
- N->setValueTypes(VTs);
CSEMap.InsertNode(N, IP);
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new SDNode(Opcode, Ops, NumOps);
- N->setValueTypes(VTs);
+ N = new SDNode(Opcode, VTs, Ops, NumOps);
CSEMap.InsertNode(N, IP);
} else {
- N = new SDNode(Opcode, Ops, NumOps);
- N->setValueTypes(VTs);
+ N = new SDNode(Opcode, VTs, Ops, NumOps);
}
AllNodes.push_back(N);
return SDOperand(N, 0);
void *IP = 0;
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
return SDOperand(E, 0);
- N = new SDNode(Opcode, Ops, NumOps);
- N->setValueTypes(VTList);
+ N = new SDNode(Opcode, VTList, Ops, NumOps);
CSEMap.InsertNode(N, IP);
} else {
- N = new SDNode(Opcode, Ops, NumOps);
- N->setValueTypes(VTList);
+ N = new SDNode(Opcode, VTList, Ops, NumOps);
}
AllNodes.push_back(N);
return SDOperand(N, 0);