private:
void handleChangedOperand(void *Ref, Metadata *New);
- bool hasUnresolvedOperands() const { return SubclassData32; }
- void incrementUnresolvedOperands() { ++SubclassData32; }
- void decrementUnresolvedOperands() { --SubclassData32; }
void resolve();
};
continue;
if (OwnerMD->isResolved())
continue;
- OwnerMD->decrementUnresolvedOperands();
- if (!OwnerMD->hasUnresolvedOperands())
+ if (!--OwnerMD->SubclassData32)
OwnerMD->resolve();
}
}
return;
// Check whether any operands are unresolved, requiring re-uniquing.
+ unsigned NumUnresolved = 0;
for (const auto &Op : operands())
- if (isOperandUnresolved(Op))
- incrementUnresolvedOperands();
+ NumUnresolved += unsigned(isOperandUnresolved(Op));
- if (hasUnresolvedOperands())
- ReplaceableUses.reset(new ReplaceableMetadataImpl);
+ if (!NumUnresolved)
+ return;
+
+ ReplaceableUses.reset(new ReplaceableMetadataImpl);
+ SubclassData32 = NumUnresolved;
}
GenericMDNode::~GenericMDNode() {
Store.insert(this);
if (!isResolved()) {
+ assert(SubclassData32 != 0 && "Expected unresolved operands");
+
// Check if the last unresolved operand has just been resolved; if so,
// resolve this as well.
if (isOperandUnresolved(Old)) {
if (!isOperandUnresolved(New)) {
- decrementUnresolvedOperands();
- if (!hasUnresolvedOperands())
+ if (!--SubclassData32)
resolve();
}
} else {