Don't forget to reset 'first operand' flag when we're setting the MDNodeOperand value.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155599 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2012-04-26 00:38:42 +00:00
parent 6962106496
commit 4866363304

View File

@ -66,7 +66,11 @@ public:
MDNodeOperand(Value *V) : CallbackVH(V) {} MDNodeOperand(Value *V) : CallbackVH(V) {}
~MDNodeOperand() {} ~MDNodeOperand() {}
void set(Value *V) { this->setValPtr(V); } void set(Value *V) {
unsigned IsFirst = this->getValPtrInt();
this->setValPtr(V);
this->setAsFirstOperand(IsFirst);
}
/// setAsFirstOperand - Accessor method to mark the operand as the first in /// setAsFirstOperand - Accessor method to mark the operand as the first in
/// the list. /// the list.
@ -95,7 +99,7 @@ void MDNodeOperand::allUsesReplacedWith(Value *NV) {
static MDNodeOperand *getOperandPtr(MDNode *N, unsigned Op) { static MDNodeOperand *getOperandPtr(MDNode *N, unsigned Op) {
// Use <= instead of < to permit a one-past-the-end address. // Use <= instead of < to permit a one-past-the-end address.
assert(Op <= N->getNumOperands() && "Invalid operand number"); assert(Op <= N->getNumOperands() && "Invalid operand number");
return reinterpret_cast<MDNodeOperand*>(N+1)+Op; return reinterpret_cast<MDNodeOperand*>(N + 1) + Op;
} }
void MDNode::replaceOperandWith(unsigned i, Value *Val) { void MDNode::replaceOperandWith(unsigned i, Value *Val) {
@ -122,7 +126,6 @@ MDNode::MDNode(LLVMContext &C, ArrayRef<Value*> Vals, bool isFunctionLocal)
} }
} }
/// ~MDNode - Destroy MDNode. /// ~MDNode - Destroy MDNode.
MDNode::~MDNode() { MDNode::~MDNode() {
assert((getSubclassDataFromValue() & DestroyFlag) != 0 && assert((getSubclassDataFromValue() & DestroyFlag) != 0 &&
@ -247,7 +250,7 @@ MDNode *MDNode::getMDNode(LLVMContext &Context, ArrayRef<Value*> Vals,
} }
// Coallocate space for the node and Operands together, then placement new. // Coallocate space for the node and Operands together, then placement new.
void *Ptr = malloc(sizeof(MDNode)+Vals.size()*sizeof(MDNodeOperand)); void *Ptr = malloc(sizeof(MDNode) + Vals.size() * sizeof(MDNodeOperand));
N = new (Ptr) MDNode(Context, Vals, isFunctionLocal); N = new (Ptr) MDNode(Context, Vals, isFunctionLocal);
// Cache the operand hash. // Cache the operand hash.
@ -275,7 +278,7 @@ MDNode *MDNode::getIfExists(LLVMContext &Context, ArrayRef<Value*> Vals) {
MDNode *MDNode::getTemporary(LLVMContext &Context, ArrayRef<Value*> Vals) { MDNode *MDNode::getTemporary(LLVMContext &Context, ArrayRef<Value*> Vals) {
MDNode *N = MDNode *N =
(MDNode *)malloc(sizeof(MDNode)+Vals.size()*sizeof(MDNodeOperand)); (MDNode *)malloc(sizeof(MDNode) + Vals.size() * sizeof(MDNodeOperand));
N = new (N) MDNode(Context, Vals, FL_No); N = new (N) MDNode(Context, Vals, FL_No);
N->setValueSubclassData(N->getSubclassDataFromValue() | N->setValueSubclassData(N->getSubclassDataFromValue() |
NotUniquedBit); NotUniquedBit);