[llvm] [IR] Store Metadata attachments in vector (PR #189551)
Alexis Engelke via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 31 06:10:10 PDT 2026
================
@@ -1606,56 +1566,58 @@ MDNode *Value::getMetadata(StringRef Kind) const {
MDNode *Value::getMetadataImpl(unsigned KindID) const {
const LLVMContext &Ctx = getContext();
- const MDAttachments &Attachements = Ctx.pImpl->ValueMetadata.at(this);
- return Attachements.lookup(KindID);
+ unsigned Idx = getMetadataIndex();
+ while (Idx) {
+ const MDAttachment &A = Ctx.pImpl->Metadatas[Idx];
+ if (A.MDKind == KindID)
+ return A.Node;
+ Idx = A.Next;
+ }
+ return nullptr;
}
void Value::getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const {
- if (hasMetadata())
- getContext().pImpl->ValueMetadata.at(this).get(KindID, MDs);
+ const LLVMContext &Ctx = getContext();
+ unsigned Idx = getMetadataIndex();
+ while (Idx) {
+ const MDAttachment &A = Ctx.pImpl->Metadatas[Idx];
+ if (A.MDKind == KindID)
+ MDs.push_back(A.Node);
+ Idx = A.Next;
+ }
+ // We store metadata in reverse order, so reverse for output.
+ std::reverse(MDs.begin(), MDs.end());
}
void Value::getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const {
- if (hasMetadata())
- getMetadata(getContext().getMDKindID(Kind), MDs);
+ getMetadata(getContext().getMDKindID(Kind), MDs);
}
void Value::getAllMetadata(
SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
- if (hasMetadata()) {
- assert(getContext().pImpl->ValueMetadata.count(this) &&
- "bit out of sync with hash table");
- const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
- Info.getAll(MDs);
+ const LLVMContext &Ctx = getContext();
+ unsigned Idx = getMetadataIndex();
+ while (Idx) {
+ const MDAttachment &A = Ctx.pImpl->Metadatas[Idx];
+ MDs.emplace_back(A.MDKind, A.Node);
+ Idx = A.Next;
+ }
+ // We store metadata in reverse order, so reverse for output in insertion
+ // order. Sort by metadata ID for stable output.
+ if (MDs.size() > 1) {
+ std::reverse(MDs.begin(), MDs.end());
+ llvm::stable_sort(MDs, less_first());
}
}
void Value::setMetadata(unsigned KindID, MDNode *Node) {
assert(isa<Instruction>(this) || isa<GlobalObject>(this));
- // Handle the case when we're adding/updating metadata on a value.
- if (Node) {
- MDAttachments &Info = getContext().pImpl->ValueMetadata[this];
- assert(!Info.empty() == HasMetadata && "bit out of sync with hash table");
- if (Info.empty())
- HasMetadata = true;
- Info.set(KindID, Node);
- return;
- }
-
- // Otherwise, we're removing metadata from an instruction.
- assert((HasMetadata == (getContext().pImpl->ValueMetadata.count(this) > 0)) &&
- "bit out of sync with hash table");
- if (!HasMetadata)
- return; // Nothing to remove!
- MDAttachments &Info = getContext().pImpl->ValueMetadata.find(this)->second;
-
- // Handle removal of an existing value.
- Info.erase(KindID);
- if (!Info.empty())
- return;
- getContext().pImpl->ValueMetadata.erase(this);
- HasMetadata = false;
+ eraseMetadata(KindID);
+ if (Node)
+ addMetadata(KindID, *Node);
+ if (Node)
----------------
aengelke wrote:
Removed duplicate update of HasMetadata, addMetadata does this already.
https://github.com/llvm/llvm-project/pull/189551
More information about the llvm-commits
mailing list