Changed the fundemental architecture of Operands for Instructions. Now

Operands are maintained as a vector<Use> in the User class, and operator
iterators are provided as before.  Getting an operand no longer requires
a virtual function call.

WARNING: getOperand(x) where x >= getNumOperands() will now assert instead
of returning null!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2001-07-07 08:36:50 +00:00
parent f0d0e9c262
commit c8b25d40cb
25 changed files with 308 additions and 647 deletions

View File

@@ -10,72 +10,24 @@
#include "llvm/Type.h"
#endif
SwitchInst::SwitchInst(Value *V, BasicBlock *DefV)
: TerminatorInst(Instruction::Switch),
DefaultDest(DefV, this), Val(V, this) {
assert(Val && DefV);
SwitchInst::SwitchInst(Value *V, BasicBlock *DefDest)
: TerminatorInst(Instruction::Switch) {
assert(V && DefDest);
Operands.push_back(Use(V, this));
Operands.push_back(Use(DefDest, this));
}
SwitchInst::SwitchInst(const SwitchInst &SI)
: TerminatorInst(Instruction::Switch), DefaultDest(SI.DefaultDest),
Val(SI.Val) {
: TerminatorInst(Instruction::Switch) {
Operands.reserve(SI.Operands.size());
for (dest_const_iterator I = SI.Destinations.begin(),
end = SI.Destinations.end(); I != end; ++I)
Destinations.push_back(dest_value(ConstPoolUse(I->first, this),
BasicBlockUse(I->second, this)));
for (unsigned i = 0, E = SI.Operands.size(); i != E; i+=2) {
Operands.push_back(Use(SI.Operands[i], this));
Operands.push_back(Use(SI.Operands[i+1], this));
}
}
void SwitchInst::dest_push_back(ConstPoolVal *OnVal, BasicBlock *Dest) {
Destinations.push_back(dest_value(ConstPoolUse(OnVal, this),
BasicBlockUse(Dest, this)));
}
void SwitchInst::dropAllReferences() {
Val = 0;
DefaultDest = 0;
Destinations.clear();
}
const BasicBlock *SwitchInst::getSuccessor(unsigned idx) const {
if (idx == 0) return DefaultDest;
if (idx > Destinations.size()) return 0;
return Destinations[idx-1].second;
}
unsigned SwitchInst::getNumOperands() const {
return 2+Destinations.size();
}
const Value *SwitchInst::getOperand(unsigned i) const {
if (i == 0) return Val;
else if (i == 1) return DefaultDest;
unsigned slot = (i-2) >> 1;
if (slot >= Destinations.size()) return 0;
if (i & 1) return Destinations[slot].second;
return Destinations[slot].first;
}
bool SwitchInst::setOperand(unsigned i, Value *V) {
if (i == 0) { Val = V; return true; }
else if (i == 1) {
assert(V->getType() == Type::LabelTy);
DefaultDest = (BasicBlock*)V;
return true;
}
unsigned slot = (i-2) >> 1;
if (slot >= Destinations.size()) return 0;
if (i & 1) {
assert(V->getType() == Type::LabelTy);
Destinations[slot].second = (BasicBlock*)V;
} else {
// TODO: assert constant
Destinations[slot].first = (ConstPoolVal*)V;
}
return true;
Operands.push_back(Use(OnVal, this));
Operands.push_back(Use(Dest, this));
}