xref: /freebsd/contrib/llvm-project/llvm/lib/IR/Metadata.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric //===- Metadata.cpp - Implement Metadata classes --------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the Metadata classes.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
13e8d8bef9SDimitry Andric #include "llvm/IR/Metadata.h"
140b57cec5SDimitry Andric #include "LLVMContextImpl.h"
150b57cec5SDimitry Andric #include "MetadataImpl.h"
160b57cec5SDimitry Andric #include "llvm/ADT/APFloat.h"
170b57cec5SDimitry Andric #include "llvm/ADT/APInt.h"
180b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h"
190b57cec5SDimitry Andric #include "llvm/ADT/DenseSet.h"
200b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
210b57cec5SDimitry Andric #include "llvm/ADT/SetVector.h"
220b57cec5SDimitry Andric #include "llvm/ADT/SmallPtrSet.h"
230b57cec5SDimitry Andric #include "llvm/ADT/SmallSet.h"
240b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h"
250b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h"
260b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
270b57cec5SDimitry Andric #include "llvm/ADT/Twine.h"
280b57cec5SDimitry Andric #include "llvm/IR/Argument.h"
290b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h"
300b57cec5SDimitry Andric #include "llvm/IR/Constant.h"
310b57cec5SDimitry Andric #include "llvm/IR/ConstantRange.h"
320b57cec5SDimitry Andric #include "llvm/IR/Constants.h"
330b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h"
340b57cec5SDimitry Andric #include "llvm/IR/DebugLoc.h"
350b57cec5SDimitry Andric #include "llvm/IR/Function.h"
360b57cec5SDimitry Andric #include "llvm/IR/GlobalObject.h"
370b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h"
380b57cec5SDimitry Andric #include "llvm/IR/Instruction.h"
390b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h"
40e8d8bef9SDimitry Andric #include "llvm/IR/MDBuilder.h"
410b57cec5SDimitry Andric #include "llvm/IR/Module.h"
42*bdd1243dSDimitry Andric #include "llvm/IR/ProfDataUtils.h"
430b57cec5SDimitry Andric #include "llvm/IR/TrackingMDRef.h"
440b57cec5SDimitry Andric #include "llvm/IR/Type.h"
450b57cec5SDimitry Andric #include "llvm/IR/Value.h"
460b57cec5SDimitry Andric #include "llvm/Support/Casting.h"
470b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h"
480b57cec5SDimitry Andric #include "llvm/Support/MathExtras.h"
490b57cec5SDimitry Andric #include <algorithm>
500b57cec5SDimitry Andric #include <cassert>
510b57cec5SDimitry Andric #include <cstddef>
520b57cec5SDimitry Andric #include <cstdint>
530b57cec5SDimitry Andric #include <type_traits>
540b57cec5SDimitry Andric #include <utility>
550b57cec5SDimitry Andric #include <vector>
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric using namespace llvm;
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD)
600b57cec5SDimitry Andric     : Value(Ty, MetadataAsValueVal), MD(MD) {
610b57cec5SDimitry Andric   track();
620b57cec5SDimitry Andric }
630b57cec5SDimitry Andric 
640b57cec5SDimitry Andric MetadataAsValue::~MetadataAsValue() {
650b57cec5SDimitry Andric   getType()->getContext().pImpl->MetadataAsValues.erase(MD);
660b57cec5SDimitry Andric   untrack();
670b57cec5SDimitry Andric }
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric /// Canonicalize metadata arguments to intrinsics.
700b57cec5SDimitry Andric ///
710b57cec5SDimitry Andric /// To support bitcode upgrades (and assembly semantic sugar) for \a
720b57cec5SDimitry Andric /// MetadataAsValue, we need to canonicalize certain metadata.
730b57cec5SDimitry Andric ///
740b57cec5SDimitry Andric ///   - nullptr is replaced by an empty MDNode.
750b57cec5SDimitry Andric ///   - An MDNode with a single null operand is replaced by an empty MDNode.
760b57cec5SDimitry Andric ///   - An MDNode whose only operand is a \a ConstantAsMetadata gets skipped.
770b57cec5SDimitry Andric ///
780b57cec5SDimitry Andric /// This maintains readability of bitcode from when metadata was a type of
790b57cec5SDimitry Andric /// value, and these bridges were unnecessary.
800b57cec5SDimitry Andric static Metadata *canonicalizeMetadataForValue(LLVMContext &Context,
810b57cec5SDimitry Andric                                               Metadata *MD) {
820b57cec5SDimitry Andric   if (!MD)
830b57cec5SDimitry Andric     // !{}
84*bdd1243dSDimitry Andric     return MDNode::get(Context, std::nullopt);
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric   // Return early if this isn't a single-operand MDNode.
870b57cec5SDimitry Andric   auto *N = dyn_cast<MDNode>(MD);
880b57cec5SDimitry Andric   if (!N || N->getNumOperands() != 1)
890b57cec5SDimitry Andric     return MD;
900b57cec5SDimitry Andric 
910b57cec5SDimitry Andric   if (!N->getOperand(0))
920b57cec5SDimitry Andric     // !{}
93*bdd1243dSDimitry Andric     return MDNode::get(Context, std::nullopt);
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   if (auto *C = dyn_cast<ConstantAsMetadata>(N->getOperand(0)))
960b57cec5SDimitry Andric     // Look through the MDNode.
970b57cec5SDimitry Andric     return C;
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric   return MD;
1000b57cec5SDimitry Andric }
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric MetadataAsValue *MetadataAsValue::get(LLVMContext &Context, Metadata *MD) {
1030b57cec5SDimitry Andric   MD = canonicalizeMetadataForValue(Context, MD);
1040b57cec5SDimitry Andric   auto *&Entry = Context.pImpl->MetadataAsValues[MD];
1050b57cec5SDimitry Andric   if (!Entry)
1060b57cec5SDimitry Andric     Entry = new MetadataAsValue(Type::getMetadataTy(Context), MD);
1070b57cec5SDimitry Andric   return Entry;
1080b57cec5SDimitry Andric }
1090b57cec5SDimitry Andric 
1100b57cec5SDimitry Andric MetadataAsValue *MetadataAsValue::getIfExists(LLVMContext &Context,
1110b57cec5SDimitry Andric                                               Metadata *MD) {
1120b57cec5SDimitry Andric   MD = canonicalizeMetadataForValue(Context, MD);
1130b57cec5SDimitry Andric   auto &Store = Context.pImpl->MetadataAsValues;
1140b57cec5SDimitry Andric   return Store.lookup(MD);
1150b57cec5SDimitry Andric }
1160b57cec5SDimitry Andric 
1170b57cec5SDimitry Andric void MetadataAsValue::handleChangedMetadata(Metadata *MD) {
1180b57cec5SDimitry Andric   LLVMContext &Context = getContext();
1190b57cec5SDimitry Andric   MD = canonicalizeMetadataForValue(Context, MD);
1200b57cec5SDimitry Andric   auto &Store = Context.pImpl->MetadataAsValues;
1210b57cec5SDimitry Andric 
1220b57cec5SDimitry Andric   // Stop tracking the old metadata.
1230b57cec5SDimitry Andric   Store.erase(this->MD);
1240b57cec5SDimitry Andric   untrack();
1250b57cec5SDimitry Andric   this->MD = nullptr;
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric   // Start tracking MD, or RAUW if necessary.
1280b57cec5SDimitry Andric   auto *&Entry = Store[MD];
1290b57cec5SDimitry Andric   if (Entry) {
1300b57cec5SDimitry Andric     replaceAllUsesWith(Entry);
1310b57cec5SDimitry Andric     delete this;
1320b57cec5SDimitry Andric     return;
1330b57cec5SDimitry Andric   }
1340b57cec5SDimitry Andric 
1350b57cec5SDimitry Andric   this->MD = MD;
1360b57cec5SDimitry Andric   track();
1370b57cec5SDimitry Andric   Entry = this;
1380b57cec5SDimitry Andric }
1390b57cec5SDimitry Andric 
1400b57cec5SDimitry Andric void MetadataAsValue::track() {
1410b57cec5SDimitry Andric   if (MD)
1420b57cec5SDimitry Andric     MetadataTracking::track(&MD, *MD, *this);
1430b57cec5SDimitry Andric }
1440b57cec5SDimitry Andric 
1450b57cec5SDimitry Andric void MetadataAsValue::untrack() {
1460b57cec5SDimitry Andric   if (MD)
1470b57cec5SDimitry Andric     MetadataTracking::untrack(MD);
1480b57cec5SDimitry Andric }
1490b57cec5SDimitry Andric 
1500b57cec5SDimitry Andric bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) {
1510b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
1520b57cec5SDimitry Andric   assert((Owner || *static_cast<Metadata **>(Ref) == &MD) &&
1530b57cec5SDimitry Andric          "Reference without owner must be direct");
1540b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) {
1550b57cec5SDimitry Andric     R->addRef(Ref, Owner);
1560b57cec5SDimitry Andric     return true;
1570b57cec5SDimitry Andric   }
1580b57cec5SDimitry Andric   if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) {
1590b57cec5SDimitry Andric     assert(!PH->Use && "Placeholders can only be used once");
1600b57cec5SDimitry Andric     assert(!Owner && "Unexpected callback to owner");
1610b57cec5SDimitry Andric     PH->Use = static_cast<Metadata **>(Ref);
1620b57cec5SDimitry Andric     return true;
1630b57cec5SDimitry Andric   }
1640b57cec5SDimitry Andric   return false;
1650b57cec5SDimitry Andric }
1660b57cec5SDimitry Andric 
1670b57cec5SDimitry Andric void MetadataTracking::untrack(void *Ref, Metadata &MD) {
1680b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
1690b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getIfExists(MD))
1700b57cec5SDimitry Andric     R->dropRef(Ref);
1710b57cec5SDimitry Andric   else if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD))
1720b57cec5SDimitry Andric     PH->Use = nullptr;
1730b57cec5SDimitry Andric }
1740b57cec5SDimitry Andric 
1750b57cec5SDimitry Andric bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) {
1760b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
1770b57cec5SDimitry Andric   assert(New && "Expected live reference");
1780b57cec5SDimitry Andric   assert(Ref != New && "Expected change");
1790b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) {
1800b57cec5SDimitry Andric     R->moveRef(Ref, New, MD);
1810b57cec5SDimitry Andric     return true;
1820b57cec5SDimitry Andric   }
1830b57cec5SDimitry Andric   assert(!isa<DistinctMDOperandPlaceholder>(MD) &&
1840b57cec5SDimitry Andric          "Unexpected move of an MDOperand");
1850b57cec5SDimitry Andric   assert(!isReplaceable(MD) &&
1860b57cec5SDimitry Andric          "Expected un-replaceable metadata, since we didn't move a reference");
1870b57cec5SDimitry Andric   return false;
1880b57cec5SDimitry Andric }
1890b57cec5SDimitry Andric 
1900b57cec5SDimitry Andric bool MetadataTracking::isReplaceable(const Metadata &MD) {
1910b57cec5SDimitry Andric   return ReplaceableMetadataImpl::isReplaceable(MD);
1920b57cec5SDimitry Andric }
1930b57cec5SDimitry Andric 
194fe6060f1SDimitry Andric SmallVector<Metadata *> ReplaceableMetadataImpl::getAllArgListUsers() {
195fe6060f1SDimitry Andric   SmallVector<std::pair<OwnerTy, uint64_t> *> MDUsersWithID;
196fe6060f1SDimitry Andric   for (auto Pair : UseMap) {
197fe6060f1SDimitry Andric     OwnerTy Owner = Pair.second.first;
198fe6060f1SDimitry Andric     if (!Owner.is<Metadata *>())
199fe6060f1SDimitry Andric       continue;
200fe6060f1SDimitry Andric     Metadata *OwnerMD = Owner.get<Metadata *>();
201fe6060f1SDimitry Andric     if (OwnerMD->getMetadataID() == Metadata::DIArgListKind)
202fe6060f1SDimitry Andric       MDUsersWithID.push_back(&UseMap[Pair.first]);
203fe6060f1SDimitry Andric   }
204fe6060f1SDimitry Andric   llvm::sort(MDUsersWithID, [](auto UserA, auto UserB) {
205fe6060f1SDimitry Andric     return UserA->second < UserB->second;
206fe6060f1SDimitry Andric   });
207fe6060f1SDimitry Andric   SmallVector<Metadata *> MDUsers;
208*bdd1243dSDimitry Andric   for (auto *UserWithID : MDUsersWithID)
209fe6060f1SDimitry Andric     MDUsers.push_back(UserWithID->first.get<Metadata *>());
210fe6060f1SDimitry Andric   return MDUsers;
211fe6060f1SDimitry Andric }
212fe6060f1SDimitry Andric 
2130b57cec5SDimitry Andric void ReplaceableMetadataImpl::addRef(void *Ref, OwnerTy Owner) {
2140b57cec5SDimitry Andric   bool WasInserted =
2150b57cec5SDimitry Andric       UseMap.insert(std::make_pair(Ref, std::make_pair(Owner, NextIndex)))
2160b57cec5SDimitry Andric           .second;
2170b57cec5SDimitry Andric   (void)WasInserted;
2180b57cec5SDimitry Andric   assert(WasInserted && "Expected to add a reference");
2190b57cec5SDimitry Andric 
2200b57cec5SDimitry Andric   ++NextIndex;
2210b57cec5SDimitry Andric   assert(NextIndex != 0 && "Unexpected overflow");
2220b57cec5SDimitry Andric }
2230b57cec5SDimitry Andric 
2240b57cec5SDimitry Andric void ReplaceableMetadataImpl::dropRef(void *Ref) {
2250b57cec5SDimitry Andric   bool WasErased = UseMap.erase(Ref);
2260b57cec5SDimitry Andric   (void)WasErased;
2270b57cec5SDimitry Andric   assert(WasErased && "Expected to drop a reference");
2280b57cec5SDimitry Andric }
2290b57cec5SDimitry Andric 
2300b57cec5SDimitry Andric void ReplaceableMetadataImpl::moveRef(void *Ref, void *New,
2310b57cec5SDimitry Andric                                       const Metadata &MD) {
2320b57cec5SDimitry Andric   auto I = UseMap.find(Ref);
2330b57cec5SDimitry Andric   assert(I != UseMap.end() && "Expected to move a reference");
2340b57cec5SDimitry Andric   auto OwnerAndIndex = I->second;
2350b57cec5SDimitry Andric   UseMap.erase(I);
2360b57cec5SDimitry Andric   bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second;
2370b57cec5SDimitry Andric   (void)WasInserted;
2380b57cec5SDimitry Andric   assert(WasInserted && "Expected to add a reference");
2390b57cec5SDimitry Andric 
2400b57cec5SDimitry Andric   // Check that the references are direct if there's no owner.
2410b57cec5SDimitry Andric   (void)MD;
2420b57cec5SDimitry Andric   assert((OwnerAndIndex.first || *static_cast<Metadata **>(Ref) == &MD) &&
2430b57cec5SDimitry Andric          "Reference without owner must be direct");
2440b57cec5SDimitry Andric   assert((OwnerAndIndex.first || *static_cast<Metadata **>(New) == &MD) &&
2450b57cec5SDimitry Andric          "Reference without owner must be direct");
2460b57cec5SDimitry Andric }
2470b57cec5SDimitry Andric 
24881ad6265SDimitry Andric void ReplaceableMetadataImpl::SalvageDebugInfo(const Constant &C) {
24981ad6265SDimitry Andric   if (!C.isUsedByMetadata()) {
25081ad6265SDimitry Andric     return;
25181ad6265SDimitry Andric   }
25281ad6265SDimitry Andric 
25381ad6265SDimitry Andric   LLVMContext &Context = C.getType()->getContext();
25481ad6265SDimitry Andric   auto &Store = Context.pImpl->ValuesAsMetadata;
25581ad6265SDimitry Andric   auto I = Store.find(&C);
25681ad6265SDimitry Andric   ValueAsMetadata *MD = I->second;
25781ad6265SDimitry Andric   using UseTy =
25881ad6265SDimitry Andric       std::pair<void *, std::pair<MetadataTracking::OwnerTy, uint64_t>>;
25981ad6265SDimitry Andric   // Copy out uses and update value of Constant used by debug info metadata with undef below
26081ad6265SDimitry Andric   SmallVector<UseTy, 8> Uses(MD->UseMap.begin(), MD->UseMap.end());
26181ad6265SDimitry Andric 
26281ad6265SDimitry Andric   for (const auto &Pair : Uses) {
26381ad6265SDimitry Andric     MetadataTracking::OwnerTy Owner = Pair.second.first;
26481ad6265SDimitry Andric     if (!Owner)
26581ad6265SDimitry Andric       continue;
26681ad6265SDimitry Andric     if (!Owner.is<Metadata *>())
26781ad6265SDimitry Andric       continue;
26881ad6265SDimitry Andric     auto *OwnerMD = dyn_cast<MDNode>(Owner.get<Metadata *>());
26981ad6265SDimitry Andric     if (!OwnerMD)
27081ad6265SDimitry Andric       continue;
27181ad6265SDimitry Andric     if (isa<DINode>(OwnerMD)) {
27281ad6265SDimitry Andric       OwnerMD->handleChangedOperand(
27381ad6265SDimitry Andric           Pair.first, ValueAsMetadata::get(UndefValue::get(C.getType())));
27481ad6265SDimitry Andric     }
27581ad6265SDimitry Andric   }
27681ad6265SDimitry Andric }
27781ad6265SDimitry Andric 
2780b57cec5SDimitry Andric void ReplaceableMetadataImpl::replaceAllUsesWith(Metadata *MD) {
2790b57cec5SDimitry Andric   if (UseMap.empty())
2800b57cec5SDimitry Andric     return;
2810b57cec5SDimitry Andric 
2820b57cec5SDimitry Andric   // Copy out uses since UseMap will get touched below.
2830b57cec5SDimitry Andric   using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
2840b57cec5SDimitry Andric   SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
28581ad6265SDimitry Andric   llvm::sort(Uses, llvm::less_second());
2860b57cec5SDimitry Andric   for (const auto &Pair : Uses) {
2870b57cec5SDimitry Andric     // Check that this Ref hasn't disappeared after RAUW (when updating a
2880b57cec5SDimitry Andric     // previous Ref).
2890b57cec5SDimitry Andric     if (!UseMap.count(Pair.first))
2900b57cec5SDimitry Andric       continue;
2910b57cec5SDimitry Andric 
2920b57cec5SDimitry Andric     OwnerTy Owner = Pair.second.first;
2930b57cec5SDimitry Andric     if (!Owner) {
2940b57cec5SDimitry Andric       // Update unowned tracking references directly.
2950b57cec5SDimitry Andric       Metadata *&Ref = *static_cast<Metadata **>(Pair.first);
2960b57cec5SDimitry Andric       Ref = MD;
2970b57cec5SDimitry Andric       if (MD)
2980b57cec5SDimitry Andric         MetadataTracking::track(Ref);
2990b57cec5SDimitry Andric       UseMap.erase(Pair.first);
3000b57cec5SDimitry Andric       continue;
3010b57cec5SDimitry Andric     }
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric     // Check for MetadataAsValue.
3040b57cec5SDimitry Andric     if (Owner.is<MetadataAsValue *>()) {
3050b57cec5SDimitry Andric       Owner.get<MetadataAsValue *>()->handleChangedMetadata(MD);
3060b57cec5SDimitry Andric       continue;
3070b57cec5SDimitry Andric     }
3080b57cec5SDimitry Andric 
3090b57cec5SDimitry Andric     // There's a Metadata owner -- dispatch.
3100b57cec5SDimitry Andric     Metadata *OwnerMD = Owner.get<Metadata *>();
3110b57cec5SDimitry Andric     switch (OwnerMD->getMetadataID()) {
3120b57cec5SDimitry Andric #define HANDLE_METADATA_LEAF(CLASS)                                            \
3130b57cec5SDimitry Andric   case Metadata::CLASS##Kind:                                                  \
3140b57cec5SDimitry Andric     cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD);                \
3150b57cec5SDimitry Andric     continue;
3160b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
3170b57cec5SDimitry Andric     default:
3180b57cec5SDimitry Andric       llvm_unreachable("Invalid metadata subclass");
3190b57cec5SDimitry Andric     }
3200b57cec5SDimitry Andric   }
3210b57cec5SDimitry Andric   assert(UseMap.empty() && "Expected all uses to be replaced");
3220b57cec5SDimitry Andric }
3230b57cec5SDimitry Andric 
3240b57cec5SDimitry Andric void ReplaceableMetadataImpl::resolveAllUses(bool ResolveUsers) {
3250b57cec5SDimitry Andric   if (UseMap.empty())
3260b57cec5SDimitry Andric     return;
3270b57cec5SDimitry Andric 
3280b57cec5SDimitry Andric   if (!ResolveUsers) {
3290b57cec5SDimitry Andric     UseMap.clear();
3300b57cec5SDimitry Andric     return;
3310b57cec5SDimitry Andric   }
3320b57cec5SDimitry Andric 
3330b57cec5SDimitry Andric   // Copy out uses since UseMap could get touched below.
3340b57cec5SDimitry Andric   using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
3350b57cec5SDimitry Andric   SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
3360b57cec5SDimitry Andric   llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
3370b57cec5SDimitry Andric     return L.second.second < R.second.second;
3380b57cec5SDimitry Andric   });
3390b57cec5SDimitry Andric   UseMap.clear();
3400b57cec5SDimitry Andric   for (const auto &Pair : Uses) {
3410b57cec5SDimitry Andric     auto Owner = Pair.second.first;
3420b57cec5SDimitry Andric     if (!Owner)
3430b57cec5SDimitry Andric       continue;
3440b57cec5SDimitry Andric     if (Owner.is<MetadataAsValue *>())
3450b57cec5SDimitry Andric       continue;
3460b57cec5SDimitry Andric 
3470b57cec5SDimitry Andric     // Resolve MDNodes that point at this.
3480b57cec5SDimitry Andric     auto *OwnerMD = dyn_cast<MDNode>(Owner.get<Metadata *>());
3490b57cec5SDimitry Andric     if (!OwnerMD)
3500b57cec5SDimitry Andric       continue;
3510b57cec5SDimitry Andric     if (OwnerMD->isResolved())
3520b57cec5SDimitry Andric       continue;
3530b57cec5SDimitry Andric     OwnerMD->decrementUnresolvedOperandCount();
3540b57cec5SDimitry Andric   }
3550b57cec5SDimitry Andric }
3560b57cec5SDimitry Andric 
3570b57cec5SDimitry Andric ReplaceableMetadataImpl *ReplaceableMetadataImpl::getOrCreate(Metadata &MD) {
3580b57cec5SDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD))
3590b57cec5SDimitry Andric     return N->isResolved() ? nullptr : N->Context.getOrCreateReplaceableUses();
3600b57cec5SDimitry Andric   return dyn_cast<ValueAsMetadata>(&MD);
3610b57cec5SDimitry Andric }
3620b57cec5SDimitry Andric 
3630b57cec5SDimitry Andric ReplaceableMetadataImpl *ReplaceableMetadataImpl::getIfExists(Metadata &MD) {
3640b57cec5SDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD))
3650b57cec5SDimitry Andric     return N->isResolved() ? nullptr : N->Context.getReplaceableUses();
3660b57cec5SDimitry Andric   return dyn_cast<ValueAsMetadata>(&MD);
3670b57cec5SDimitry Andric }
3680b57cec5SDimitry Andric 
3690b57cec5SDimitry Andric bool ReplaceableMetadataImpl::isReplaceable(const Metadata &MD) {
3700b57cec5SDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD))
3710b57cec5SDimitry Andric     return !N->isResolved();
372349cc55cSDimitry Andric   return isa<ValueAsMetadata>(&MD);
3730b57cec5SDimitry Andric }
3740b57cec5SDimitry Andric 
3750b57cec5SDimitry Andric static DISubprogram *getLocalFunctionMetadata(Value *V) {
3760b57cec5SDimitry Andric   assert(V && "Expected value");
3770b57cec5SDimitry Andric   if (auto *A = dyn_cast<Argument>(V)) {
3780b57cec5SDimitry Andric     if (auto *Fn = A->getParent())
3790b57cec5SDimitry Andric       return Fn->getSubprogram();
3800b57cec5SDimitry Andric     return nullptr;
3810b57cec5SDimitry Andric   }
3820b57cec5SDimitry Andric 
3830b57cec5SDimitry Andric   if (BasicBlock *BB = cast<Instruction>(V)->getParent()) {
3840b57cec5SDimitry Andric     if (auto *Fn = BB->getParent())
3850b57cec5SDimitry Andric       return Fn->getSubprogram();
3860b57cec5SDimitry Andric     return nullptr;
3870b57cec5SDimitry Andric   }
3880b57cec5SDimitry Andric 
3890b57cec5SDimitry Andric   return nullptr;
3900b57cec5SDimitry Andric }
3910b57cec5SDimitry Andric 
3920b57cec5SDimitry Andric ValueAsMetadata *ValueAsMetadata::get(Value *V) {
3930b57cec5SDimitry Andric   assert(V && "Unexpected null Value");
3940b57cec5SDimitry Andric 
3950b57cec5SDimitry Andric   auto &Context = V->getContext();
3960b57cec5SDimitry Andric   auto *&Entry = Context.pImpl->ValuesAsMetadata[V];
3970b57cec5SDimitry Andric   if (!Entry) {
3980b57cec5SDimitry Andric     assert((isa<Constant>(V) || isa<Argument>(V) || isa<Instruction>(V)) &&
3990b57cec5SDimitry Andric            "Expected constant or function-local value");
4000b57cec5SDimitry Andric     assert(!V->IsUsedByMD && "Expected this to be the only metadata use");
4010b57cec5SDimitry Andric     V->IsUsedByMD = true;
4020b57cec5SDimitry Andric     if (auto *C = dyn_cast<Constant>(V))
4030b57cec5SDimitry Andric       Entry = new ConstantAsMetadata(C);
4040b57cec5SDimitry Andric     else
4050b57cec5SDimitry Andric       Entry = new LocalAsMetadata(V);
4060b57cec5SDimitry Andric   }
4070b57cec5SDimitry Andric 
4080b57cec5SDimitry Andric   return Entry;
4090b57cec5SDimitry Andric }
4100b57cec5SDimitry Andric 
4110b57cec5SDimitry Andric ValueAsMetadata *ValueAsMetadata::getIfExists(Value *V) {
4120b57cec5SDimitry Andric   assert(V && "Unexpected null Value");
4130b57cec5SDimitry Andric   return V->getContext().pImpl->ValuesAsMetadata.lookup(V);
4140b57cec5SDimitry Andric }
4150b57cec5SDimitry Andric 
4160b57cec5SDimitry Andric void ValueAsMetadata::handleDeletion(Value *V) {
4170b57cec5SDimitry Andric   assert(V && "Expected valid value");
4180b57cec5SDimitry Andric 
4190b57cec5SDimitry Andric   auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata;
4200b57cec5SDimitry Andric   auto I = Store.find(V);
4210b57cec5SDimitry Andric   if (I == Store.end())
4220b57cec5SDimitry Andric     return;
4230b57cec5SDimitry Andric 
4240b57cec5SDimitry Andric   // Remove old entry from the map.
4250b57cec5SDimitry Andric   ValueAsMetadata *MD = I->second;
4260b57cec5SDimitry Andric   assert(MD && "Expected valid metadata");
4270b57cec5SDimitry Andric   assert(MD->getValue() == V && "Expected valid mapping");
4280b57cec5SDimitry Andric   Store.erase(I);
4290b57cec5SDimitry Andric 
4300b57cec5SDimitry Andric   // Delete the metadata.
4310b57cec5SDimitry Andric   MD->replaceAllUsesWith(nullptr);
4320b57cec5SDimitry Andric   delete MD;
4330b57cec5SDimitry Andric }
4340b57cec5SDimitry Andric 
4350b57cec5SDimitry Andric void ValueAsMetadata::handleRAUW(Value *From, Value *To) {
4360b57cec5SDimitry Andric   assert(From && "Expected valid value");
4370b57cec5SDimitry Andric   assert(To && "Expected valid value");
4380b57cec5SDimitry Andric   assert(From != To && "Expected changed value");
4390b57cec5SDimitry Andric   assert(From->getType() == To->getType() && "Unexpected type change");
4400b57cec5SDimitry Andric 
4410b57cec5SDimitry Andric   LLVMContext &Context = From->getType()->getContext();
4420b57cec5SDimitry Andric   auto &Store = Context.pImpl->ValuesAsMetadata;
4430b57cec5SDimitry Andric   auto I = Store.find(From);
4440b57cec5SDimitry Andric   if (I == Store.end()) {
4450b57cec5SDimitry Andric     assert(!From->IsUsedByMD && "Expected From not to be used by metadata");
4460b57cec5SDimitry Andric     return;
4470b57cec5SDimitry Andric   }
4480b57cec5SDimitry Andric 
4490b57cec5SDimitry Andric   // Remove old entry from the map.
4500b57cec5SDimitry Andric   assert(From->IsUsedByMD && "Expected From to be used by metadata");
4510b57cec5SDimitry Andric   From->IsUsedByMD = false;
4520b57cec5SDimitry Andric   ValueAsMetadata *MD = I->second;
4530b57cec5SDimitry Andric   assert(MD && "Expected valid metadata");
4540b57cec5SDimitry Andric   assert(MD->getValue() == From && "Expected valid mapping");
4550b57cec5SDimitry Andric   Store.erase(I);
4560b57cec5SDimitry Andric 
4570b57cec5SDimitry Andric   if (isa<LocalAsMetadata>(MD)) {
4580b57cec5SDimitry Andric     if (auto *C = dyn_cast<Constant>(To)) {
4590b57cec5SDimitry Andric       // Local became a constant.
4600b57cec5SDimitry Andric       MD->replaceAllUsesWith(ConstantAsMetadata::get(C));
4610b57cec5SDimitry Andric       delete MD;
4620b57cec5SDimitry Andric       return;
4630b57cec5SDimitry Andric     }
4640b57cec5SDimitry Andric     if (getLocalFunctionMetadata(From) && getLocalFunctionMetadata(To) &&
4650b57cec5SDimitry Andric         getLocalFunctionMetadata(From) != getLocalFunctionMetadata(To)) {
4660b57cec5SDimitry Andric       // DISubprogram changed.
4670b57cec5SDimitry Andric       MD->replaceAllUsesWith(nullptr);
4680b57cec5SDimitry Andric       delete MD;
4690b57cec5SDimitry Andric       return;
4700b57cec5SDimitry Andric     }
4710b57cec5SDimitry Andric   } else if (!isa<Constant>(To)) {
4720b57cec5SDimitry Andric     // Changed to function-local value.
4730b57cec5SDimitry Andric     MD->replaceAllUsesWith(nullptr);
4740b57cec5SDimitry Andric     delete MD;
4750b57cec5SDimitry Andric     return;
4760b57cec5SDimitry Andric   }
4770b57cec5SDimitry Andric 
4780b57cec5SDimitry Andric   auto *&Entry = Store[To];
4790b57cec5SDimitry Andric   if (Entry) {
4800b57cec5SDimitry Andric     // The target already exists.
4810b57cec5SDimitry Andric     MD->replaceAllUsesWith(Entry);
4820b57cec5SDimitry Andric     delete MD;
4830b57cec5SDimitry Andric     return;
4840b57cec5SDimitry Andric   }
4850b57cec5SDimitry Andric 
4860b57cec5SDimitry Andric   // Update MD in place (and update the map entry).
4870b57cec5SDimitry Andric   assert(!To->IsUsedByMD && "Expected this to be the only metadata use");
4880b57cec5SDimitry Andric   To->IsUsedByMD = true;
4890b57cec5SDimitry Andric   MD->V = To;
4900b57cec5SDimitry Andric   Entry = MD;
4910b57cec5SDimitry Andric }
4920b57cec5SDimitry Andric 
4930b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
4940b57cec5SDimitry Andric // MDString implementation.
4950b57cec5SDimitry Andric //
4960b57cec5SDimitry Andric 
4970b57cec5SDimitry Andric MDString *MDString::get(LLVMContext &Context, StringRef Str) {
4980b57cec5SDimitry Andric   auto &Store = Context.pImpl->MDStringCache;
4990b57cec5SDimitry Andric   auto I = Store.try_emplace(Str);
5000b57cec5SDimitry Andric   auto &MapEntry = I.first->getValue();
5010b57cec5SDimitry Andric   if (!I.second)
5020b57cec5SDimitry Andric     return &MapEntry;
5030b57cec5SDimitry Andric   MapEntry.Entry = &*I.first;
5040b57cec5SDimitry Andric   return &MapEntry;
5050b57cec5SDimitry Andric }
5060b57cec5SDimitry Andric 
5070b57cec5SDimitry Andric StringRef MDString::getString() const {
5080b57cec5SDimitry Andric   assert(Entry && "Expected to find string map entry");
5090b57cec5SDimitry Andric   return Entry->first();
5100b57cec5SDimitry Andric }
5110b57cec5SDimitry Andric 
5120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5130b57cec5SDimitry Andric // MDNode implementation.
5140b57cec5SDimitry Andric //
5150b57cec5SDimitry Andric 
5160b57cec5SDimitry Andric // Assert that the MDNode types will not be unaligned by the objects
5170b57cec5SDimitry Andric // prepended to them.
5180b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
5190b57cec5SDimitry Andric   static_assert(                                                               \
5200b57cec5SDimitry Andric       alignof(uint64_t) >= alignof(CLASS),                                     \
5210b57cec5SDimitry Andric       "Alignment is insufficient after objects prepended to " #CLASS);
5220b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
5230b57cec5SDimitry Andric 
52481ad6265SDimitry Andric void *MDNode::operator new(size_t Size, size_t NumOps, StorageType Storage) {
5250b57cec5SDimitry Andric   // uint64_t is the most aligned type we need support (ensured by static_assert
5260b57cec5SDimitry Andric   // above)
52781ad6265SDimitry Andric   size_t AllocSize =
52881ad6265SDimitry Andric       alignTo(Header::getAllocSize(Storage, NumOps), alignof(uint64_t));
52981ad6265SDimitry Andric   char *Mem = reinterpret_cast<char *>(::operator new(AllocSize + Size));
53081ad6265SDimitry Andric   Header *H = new (Mem + AllocSize - sizeof(Header)) Header(NumOps, Storage);
53181ad6265SDimitry Andric   return reinterpret_cast<void *>(H + 1);
5320b57cec5SDimitry Andric }
5330b57cec5SDimitry Andric 
53481ad6265SDimitry Andric void MDNode::operator delete(void *N) {
53581ad6265SDimitry Andric   Header *H = reinterpret_cast<Header *>(N) - 1;
53681ad6265SDimitry Andric   void *Mem = H->getAllocation();
53781ad6265SDimitry Andric   H->~Header();
53881ad6265SDimitry Andric   ::operator delete(Mem);
5390b57cec5SDimitry Andric }
5400b57cec5SDimitry Andric 
5410b57cec5SDimitry Andric MDNode::MDNode(LLVMContext &Context, unsigned ID, StorageType Storage,
5420b57cec5SDimitry Andric                ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2)
54381ad6265SDimitry Andric     : Metadata(ID, Storage), Context(Context) {
5440b57cec5SDimitry Andric   unsigned Op = 0;
5450b57cec5SDimitry Andric   for (Metadata *MD : Ops1)
5460b57cec5SDimitry Andric     setOperand(Op++, MD);
5470b57cec5SDimitry Andric   for (Metadata *MD : Ops2)
5480b57cec5SDimitry Andric     setOperand(Op++, MD);
5490b57cec5SDimitry Andric 
5500b57cec5SDimitry Andric   if (!isUniqued())
5510b57cec5SDimitry Andric     return;
5520b57cec5SDimitry Andric 
5530b57cec5SDimitry Andric   // Count the unresolved operands.  If there are any, RAUW support will be
5540b57cec5SDimitry Andric   // added lazily on first reference.
5550b57cec5SDimitry Andric   countUnresolvedOperands();
5560b57cec5SDimitry Andric }
5570b57cec5SDimitry Andric 
5580b57cec5SDimitry Andric TempMDNode MDNode::clone() const {
5590b57cec5SDimitry Andric   switch (getMetadataID()) {
5600b57cec5SDimitry Andric   default:
5610b57cec5SDimitry Andric     llvm_unreachable("Invalid MDNode subclass");
5620b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
5630b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
5640b57cec5SDimitry Andric     return cast<CLASS>(this)->cloneImpl();
5650b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
5660b57cec5SDimitry Andric   }
5670b57cec5SDimitry Andric }
5680b57cec5SDimitry Andric 
56981ad6265SDimitry Andric MDNode::Header::Header(size_t NumOps, StorageType Storage) {
57081ad6265SDimitry Andric   IsLarge = isLarge(NumOps);
57181ad6265SDimitry Andric   IsResizable = isResizable(Storage);
57281ad6265SDimitry Andric   SmallSize = getSmallSize(NumOps, IsResizable, IsLarge);
57381ad6265SDimitry Andric   if (IsLarge) {
57481ad6265SDimitry Andric     SmallNumOps = 0;
57581ad6265SDimitry Andric     new (getLargePtr()) LargeStorageVector();
57681ad6265SDimitry Andric     getLarge().resize(NumOps);
57781ad6265SDimitry Andric     return;
57881ad6265SDimitry Andric   }
57981ad6265SDimitry Andric   SmallNumOps = NumOps;
58081ad6265SDimitry Andric   MDOperand *O = reinterpret_cast<MDOperand *>(this) - SmallSize;
58181ad6265SDimitry Andric   for (MDOperand *E = O + SmallSize; O != E;)
58281ad6265SDimitry Andric     (void)new (O++) MDOperand();
58381ad6265SDimitry Andric }
58481ad6265SDimitry Andric 
58581ad6265SDimitry Andric MDNode::Header::~Header() {
58681ad6265SDimitry Andric   if (IsLarge) {
58781ad6265SDimitry Andric     getLarge().~LargeStorageVector();
58881ad6265SDimitry Andric     return;
58981ad6265SDimitry Andric   }
59081ad6265SDimitry Andric   MDOperand *O = reinterpret_cast<MDOperand *>(this);
59181ad6265SDimitry Andric   for (MDOperand *E = O - SmallSize; O != E; --O)
59281ad6265SDimitry Andric     (void)(O - 1)->~MDOperand();
59381ad6265SDimitry Andric }
59481ad6265SDimitry Andric 
59581ad6265SDimitry Andric void *MDNode::Header::getSmallPtr() {
59681ad6265SDimitry Andric   static_assert(alignof(MDOperand) <= alignof(Header),
59781ad6265SDimitry Andric                 "MDOperand too strongly aligned");
59881ad6265SDimitry Andric   return reinterpret_cast<char *>(const_cast<Header *>(this)) -
59981ad6265SDimitry Andric          sizeof(MDOperand) * SmallSize;
60081ad6265SDimitry Andric }
60181ad6265SDimitry Andric 
60281ad6265SDimitry Andric void MDNode::Header::resize(size_t NumOps) {
60381ad6265SDimitry Andric   assert(IsResizable && "Node is not resizable");
60481ad6265SDimitry Andric   if (operands().size() == NumOps)
60581ad6265SDimitry Andric     return;
60681ad6265SDimitry Andric 
60781ad6265SDimitry Andric   if (IsLarge)
60881ad6265SDimitry Andric     getLarge().resize(NumOps);
60981ad6265SDimitry Andric   else if (NumOps <= SmallSize)
61081ad6265SDimitry Andric     resizeSmall(NumOps);
61181ad6265SDimitry Andric   else
61281ad6265SDimitry Andric     resizeSmallToLarge(NumOps);
61381ad6265SDimitry Andric }
61481ad6265SDimitry Andric 
61581ad6265SDimitry Andric void MDNode::Header::resizeSmall(size_t NumOps) {
61681ad6265SDimitry Andric   assert(!IsLarge && "Expected a small MDNode");
61781ad6265SDimitry Andric   assert(NumOps <= SmallSize && "NumOps too large for small resize");
61881ad6265SDimitry Andric 
61981ad6265SDimitry Andric   MutableArrayRef<MDOperand> ExistingOps = operands();
62081ad6265SDimitry Andric   assert(NumOps != ExistingOps.size() && "Expected a different size");
62181ad6265SDimitry Andric 
62281ad6265SDimitry Andric   int NumNew = (int)NumOps - (int)ExistingOps.size();
62381ad6265SDimitry Andric   MDOperand *O = ExistingOps.end();
62481ad6265SDimitry Andric   for (int I = 0, E = NumNew; I < E; ++I)
62581ad6265SDimitry Andric     (O++)->reset();
62681ad6265SDimitry Andric   for (int I = 0, E = NumNew; I > E; --I)
62781ad6265SDimitry Andric     (--O)->reset();
62881ad6265SDimitry Andric   SmallNumOps = NumOps;
62981ad6265SDimitry Andric   assert(O == operands().end() && "Operands not (un)initialized until the end");
63081ad6265SDimitry Andric }
63181ad6265SDimitry Andric 
63281ad6265SDimitry Andric void MDNode::Header::resizeSmallToLarge(size_t NumOps) {
63381ad6265SDimitry Andric   assert(!IsLarge && "Expected a small MDNode");
63481ad6265SDimitry Andric   assert(NumOps > SmallSize && "Expected NumOps to be larger than allocation");
63581ad6265SDimitry Andric   LargeStorageVector NewOps;
63681ad6265SDimitry Andric   NewOps.resize(NumOps);
63781ad6265SDimitry Andric   llvm::move(operands(), NewOps.begin());
63881ad6265SDimitry Andric   resizeSmall(0);
63981ad6265SDimitry Andric   new (getLargePtr()) LargeStorageVector(std::move(NewOps));
64081ad6265SDimitry Andric   IsLarge = true;
64181ad6265SDimitry Andric }
64281ad6265SDimitry Andric 
6430b57cec5SDimitry Andric static bool isOperandUnresolved(Metadata *Op) {
6440b57cec5SDimitry Andric   if (auto *N = dyn_cast_or_null<MDNode>(Op))
6450b57cec5SDimitry Andric     return !N->isResolved();
6460b57cec5SDimitry Andric   return false;
6470b57cec5SDimitry Andric }
6480b57cec5SDimitry Andric 
6490b57cec5SDimitry Andric void MDNode::countUnresolvedOperands() {
65081ad6265SDimitry Andric   assert(getNumUnresolved() == 0 && "Expected unresolved ops to be uncounted");
6510b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
65281ad6265SDimitry Andric   setNumUnresolved(count_if(operands(), isOperandUnresolved));
6530b57cec5SDimitry Andric }
6540b57cec5SDimitry Andric 
6550b57cec5SDimitry Andric void MDNode::makeUniqued() {
6560b57cec5SDimitry Andric   assert(isTemporary() && "Expected this to be temporary");
6570b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
6580b57cec5SDimitry Andric 
6590b57cec5SDimitry Andric   // Enable uniquing callbacks.
6600b57cec5SDimitry Andric   for (auto &Op : mutable_operands())
6610b57cec5SDimitry Andric     Op.reset(Op.get(), this);
6620b57cec5SDimitry Andric 
6630b57cec5SDimitry Andric   // Make this 'uniqued'.
6640b57cec5SDimitry Andric   Storage = Uniqued;
6650b57cec5SDimitry Andric   countUnresolvedOperands();
66681ad6265SDimitry Andric   if (!getNumUnresolved()) {
6670b57cec5SDimitry Andric     dropReplaceableUses();
6680b57cec5SDimitry Andric     assert(isResolved() && "Expected this to be resolved");
6690b57cec5SDimitry Andric   }
6700b57cec5SDimitry Andric 
6710b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
6720b57cec5SDimitry Andric }
6730b57cec5SDimitry Andric 
6740b57cec5SDimitry Andric void MDNode::makeDistinct() {
6750b57cec5SDimitry Andric   assert(isTemporary() && "Expected this to be temporary");
6760b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
6770b57cec5SDimitry Andric 
6780b57cec5SDimitry Andric   // Drop RAUW support and store as a distinct node.
6790b57cec5SDimitry Andric   dropReplaceableUses();
6800b57cec5SDimitry Andric   storeDistinctInContext();
6810b57cec5SDimitry Andric 
6820b57cec5SDimitry Andric   assert(isDistinct() && "Expected this to be distinct");
6830b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
6840b57cec5SDimitry Andric }
6850b57cec5SDimitry Andric 
6860b57cec5SDimitry Andric void MDNode::resolve() {
6870b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
6880b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
6890b57cec5SDimitry Andric 
69081ad6265SDimitry Andric   setNumUnresolved(0);
6910b57cec5SDimitry Andric   dropReplaceableUses();
6920b57cec5SDimitry Andric 
6930b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
6940b57cec5SDimitry Andric }
6950b57cec5SDimitry Andric 
6960b57cec5SDimitry Andric void MDNode::dropReplaceableUses() {
69781ad6265SDimitry Andric   assert(!getNumUnresolved() && "Unexpected unresolved operand");
6980b57cec5SDimitry Andric 
6990b57cec5SDimitry Andric   // Drop any RAUW support.
7000b57cec5SDimitry Andric   if (Context.hasReplaceableUses())
7010b57cec5SDimitry Andric     Context.takeReplaceableUses()->resolveAllUses();
7020b57cec5SDimitry Andric }
7030b57cec5SDimitry Andric 
7040b57cec5SDimitry Andric void MDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) {
7050b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
70681ad6265SDimitry Andric   assert(getNumUnresolved() != 0 && "Expected unresolved operands");
7070b57cec5SDimitry Andric 
7080b57cec5SDimitry Andric   // Check if an operand was resolved.
7090b57cec5SDimitry Andric   if (!isOperandUnresolved(Old)) {
7100b57cec5SDimitry Andric     if (isOperandUnresolved(New))
7110b57cec5SDimitry Andric       // An operand was un-resolved!
71281ad6265SDimitry Andric       setNumUnresolved(getNumUnresolved() + 1);
7130b57cec5SDimitry Andric   } else if (!isOperandUnresolved(New))
7140b57cec5SDimitry Andric     decrementUnresolvedOperandCount();
7150b57cec5SDimitry Andric }
7160b57cec5SDimitry Andric 
7170b57cec5SDimitry Andric void MDNode::decrementUnresolvedOperandCount() {
7180b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
7190b57cec5SDimitry Andric   if (isTemporary())
7200b57cec5SDimitry Andric     return;
7210b57cec5SDimitry Andric 
7220b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
72381ad6265SDimitry Andric   setNumUnresolved(getNumUnresolved() - 1);
72481ad6265SDimitry Andric   if (getNumUnresolved())
7250b57cec5SDimitry Andric     return;
7260b57cec5SDimitry Andric 
7270b57cec5SDimitry Andric   // Last unresolved operand has just been resolved.
7280b57cec5SDimitry Andric   dropReplaceableUses();
7290b57cec5SDimitry Andric   assert(isResolved() && "Expected this to become resolved");
7300b57cec5SDimitry Andric }
7310b57cec5SDimitry Andric 
7320b57cec5SDimitry Andric void MDNode::resolveCycles() {
7330b57cec5SDimitry Andric   if (isResolved())
7340b57cec5SDimitry Andric     return;
7350b57cec5SDimitry Andric 
7360b57cec5SDimitry Andric   // Resolve this node immediately.
7370b57cec5SDimitry Andric   resolve();
7380b57cec5SDimitry Andric 
7390b57cec5SDimitry Andric   // Resolve all operands.
7400b57cec5SDimitry Andric   for (const auto &Op : operands()) {
7410b57cec5SDimitry Andric     auto *N = dyn_cast_or_null<MDNode>(Op);
7420b57cec5SDimitry Andric     if (!N)
7430b57cec5SDimitry Andric       continue;
7440b57cec5SDimitry Andric 
7450b57cec5SDimitry Andric     assert(!N->isTemporary() &&
7460b57cec5SDimitry Andric            "Expected all forward declarations to be resolved");
7470b57cec5SDimitry Andric     if (!N->isResolved())
7480b57cec5SDimitry Andric       N->resolveCycles();
7490b57cec5SDimitry Andric   }
7500b57cec5SDimitry Andric }
7510b57cec5SDimitry Andric 
7520b57cec5SDimitry Andric static bool hasSelfReference(MDNode *N) {
753e8d8bef9SDimitry Andric   return llvm::is_contained(N->operands(), N);
7540b57cec5SDimitry Andric }
7550b57cec5SDimitry Andric 
7560b57cec5SDimitry Andric MDNode *MDNode::replaceWithPermanentImpl() {
7570b57cec5SDimitry Andric   switch (getMetadataID()) {
7580b57cec5SDimitry Andric   default:
7590b57cec5SDimitry Andric     // If this type isn't uniquable, replace with a distinct node.
7600b57cec5SDimitry Andric     return replaceWithDistinctImpl();
7610b57cec5SDimitry Andric 
7620b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
7630b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
7640b57cec5SDimitry Andric     break;
7650b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
7660b57cec5SDimitry Andric   }
7670b57cec5SDimitry Andric 
7680b57cec5SDimitry Andric   // Even if this type is uniquable, self-references have to be distinct.
7690b57cec5SDimitry Andric   if (hasSelfReference(this))
7700b57cec5SDimitry Andric     return replaceWithDistinctImpl();
7710b57cec5SDimitry Andric   return replaceWithUniquedImpl();
7720b57cec5SDimitry Andric }
7730b57cec5SDimitry Andric 
7740b57cec5SDimitry Andric MDNode *MDNode::replaceWithUniquedImpl() {
7750b57cec5SDimitry Andric   // Try to uniquify in place.
7760b57cec5SDimitry Andric   MDNode *UniquedNode = uniquify();
7770b57cec5SDimitry Andric 
7780b57cec5SDimitry Andric   if (UniquedNode == this) {
7790b57cec5SDimitry Andric     makeUniqued();
7800b57cec5SDimitry Andric     return this;
7810b57cec5SDimitry Andric   }
7820b57cec5SDimitry Andric 
7830b57cec5SDimitry Andric   // Collision, so RAUW instead.
7840b57cec5SDimitry Andric   replaceAllUsesWith(UniquedNode);
7850b57cec5SDimitry Andric   deleteAsSubclass();
7860b57cec5SDimitry Andric   return UniquedNode;
7870b57cec5SDimitry Andric }
7880b57cec5SDimitry Andric 
7890b57cec5SDimitry Andric MDNode *MDNode::replaceWithDistinctImpl() {
7900b57cec5SDimitry Andric   makeDistinct();
7910b57cec5SDimitry Andric   return this;
7920b57cec5SDimitry Andric }
7930b57cec5SDimitry Andric 
7940b57cec5SDimitry Andric void MDTuple::recalculateHash() {
7950b57cec5SDimitry Andric   setHash(MDTupleInfo::KeyTy::calculateHash(this));
7960b57cec5SDimitry Andric }
7970b57cec5SDimitry Andric 
7980b57cec5SDimitry Andric void MDNode::dropAllReferences() {
79981ad6265SDimitry Andric   for (unsigned I = 0, E = getNumOperands(); I != E; ++I)
8000b57cec5SDimitry Andric     setOperand(I, nullptr);
8010b57cec5SDimitry Andric   if (Context.hasReplaceableUses()) {
8020b57cec5SDimitry Andric     Context.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false);
8030b57cec5SDimitry Andric     (void)Context.takeReplaceableUses();
8040b57cec5SDimitry Andric   }
8050b57cec5SDimitry Andric }
8060b57cec5SDimitry Andric 
8070b57cec5SDimitry Andric void MDNode::handleChangedOperand(void *Ref, Metadata *New) {
8080b57cec5SDimitry Andric   unsigned Op = static_cast<MDOperand *>(Ref) - op_begin();
8090b57cec5SDimitry Andric   assert(Op < getNumOperands() && "Expected valid operand");
8100b57cec5SDimitry Andric 
8110b57cec5SDimitry Andric   if (!isUniqued()) {
8120b57cec5SDimitry Andric     // This node is not uniqued.  Just set the operand and be done with it.
8130b57cec5SDimitry Andric     setOperand(Op, New);
8140b57cec5SDimitry Andric     return;
8150b57cec5SDimitry Andric   }
8160b57cec5SDimitry Andric 
8170b57cec5SDimitry Andric   // This node is uniqued.
8180b57cec5SDimitry Andric   eraseFromStore();
8190b57cec5SDimitry Andric 
8200b57cec5SDimitry Andric   Metadata *Old = getOperand(Op);
8210b57cec5SDimitry Andric   setOperand(Op, New);
8220b57cec5SDimitry Andric 
8230b57cec5SDimitry Andric   // Drop uniquing for self-reference cycles and deleted constants.
8240b57cec5SDimitry Andric   if (New == this || (!New && Old && isa<ConstantAsMetadata>(Old))) {
8250b57cec5SDimitry Andric     if (!isResolved())
8260b57cec5SDimitry Andric       resolve();
8270b57cec5SDimitry Andric     storeDistinctInContext();
8280b57cec5SDimitry Andric     return;
8290b57cec5SDimitry Andric   }
8300b57cec5SDimitry Andric 
8310b57cec5SDimitry Andric   // Re-unique the node.
8320b57cec5SDimitry Andric   auto *Uniqued = uniquify();
8330b57cec5SDimitry Andric   if (Uniqued == this) {
8340b57cec5SDimitry Andric     if (!isResolved())
8350b57cec5SDimitry Andric       resolveAfterOperandChange(Old, New);
8360b57cec5SDimitry Andric     return;
8370b57cec5SDimitry Andric   }
8380b57cec5SDimitry Andric 
8390b57cec5SDimitry Andric   // Collision.
8400b57cec5SDimitry Andric   if (!isResolved()) {
8410b57cec5SDimitry Andric     // Still unresolved, so RAUW.
8420b57cec5SDimitry Andric     //
8430b57cec5SDimitry Andric     // First, clear out all operands to prevent any recursion (similar to
8440b57cec5SDimitry Andric     // dropAllReferences(), but we still need the use-list).
8450b57cec5SDimitry Andric     for (unsigned O = 0, E = getNumOperands(); O != E; ++O)
8460b57cec5SDimitry Andric       setOperand(O, nullptr);
8470b57cec5SDimitry Andric     if (Context.hasReplaceableUses())
8480b57cec5SDimitry Andric       Context.getReplaceableUses()->replaceAllUsesWith(Uniqued);
8490b57cec5SDimitry Andric     deleteAsSubclass();
8500b57cec5SDimitry Andric     return;
8510b57cec5SDimitry Andric   }
8520b57cec5SDimitry Andric 
8530b57cec5SDimitry Andric   // Store in non-uniqued form if RAUW isn't possible.
8540b57cec5SDimitry Andric   storeDistinctInContext();
8550b57cec5SDimitry Andric }
8560b57cec5SDimitry Andric 
8570b57cec5SDimitry Andric void MDNode::deleteAsSubclass() {
8580b57cec5SDimitry Andric   switch (getMetadataID()) {
8590b57cec5SDimitry Andric   default:
8600b57cec5SDimitry Andric     llvm_unreachable("Invalid subclass of MDNode");
8610b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
8620b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
8630b57cec5SDimitry Andric     delete cast<CLASS>(this);                                                  \
8640b57cec5SDimitry Andric     break;
8650b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
8660b57cec5SDimitry Andric   }
8670b57cec5SDimitry Andric }
8680b57cec5SDimitry Andric 
8690b57cec5SDimitry Andric template <class T, class InfoT>
8700b57cec5SDimitry Andric static T *uniquifyImpl(T *N, DenseSet<T *, InfoT> &Store) {
8710b57cec5SDimitry Andric   if (T *U = getUniqued(Store, N))
8720b57cec5SDimitry Andric     return U;
8730b57cec5SDimitry Andric 
8740b57cec5SDimitry Andric   Store.insert(N);
8750b57cec5SDimitry Andric   return N;
8760b57cec5SDimitry Andric }
8770b57cec5SDimitry Andric 
8780b57cec5SDimitry Andric template <class NodeTy> struct MDNode::HasCachedHash {
8790b57cec5SDimitry Andric   using Yes = char[1];
8800b57cec5SDimitry Andric   using No = char[2];
8810b57cec5SDimitry Andric   template <class U, U Val> struct SFINAE {};
8820b57cec5SDimitry Andric 
8830b57cec5SDimitry Andric   template <class U>
8840b57cec5SDimitry Andric   static Yes &check(SFINAE<void (U::*)(unsigned), &U::setHash> *);
8850b57cec5SDimitry Andric   template <class U> static No &check(...);
8860b57cec5SDimitry Andric 
8870b57cec5SDimitry Andric   static const bool value = sizeof(check<NodeTy>(nullptr)) == sizeof(Yes);
8880b57cec5SDimitry Andric };
8890b57cec5SDimitry Andric 
8900b57cec5SDimitry Andric MDNode *MDNode::uniquify() {
8910b57cec5SDimitry Andric   assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node");
8920b57cec5SDimitry Andric 
8930b57cec5SDimitry Andric   // Try to insert into uniquing store.
8940b57cec5SDimitry Andric   switch (getMetadataID()) {
8950b57cec5SDimitry Andric   default:
8960b57cec5SDimitry Andric     llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
8970b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
8980b57cec5SDimitry Andric   case CLASS##Kind: {                                                          \
8990b57cec5SDimitry Andric     CLASS *SubclassThis = cast<CLASS>(this);                                   \
9000b57cec5SDimitry Andric     std::integral_constant<bool, HasCachedHash<CLASS>::value>                  \
9010b57cec5SDimitry Andric         ShouldRecalculateHash;                                                 \
9020b57cec5SDimitry Andric     dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash);              \
9030b57cec5SDimitry Andric     return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s);           \
9040b57cec5SDimitry Andric   }
9050b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
9060b57cec5SDimitry Andric   }
9070b57cec5SDimitry Andric }
9080b57cec5SDimitry Andric 
9090b57cec5SDimitry Andric void MDNode::eraseFromStore() {
9100b57cec5SDimitry Andric   switch (getMetadataID()) {
9110b57cec5SDimitry Andric   default:
9120b57cec5SDimitry Andric     llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
9130b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
9140b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
9150b57cec5SDimitry Andric     getContext().pImpl->CLASS##s.erase(cast<CLASS>(this));                     \
9160b57cec5SDimitry Andric     break;
9170b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
9180b57cec5SDimitry Andric   }
9190b57cec5SDimitry Andric }
9200b57cec5SDimitry Andric 
9210b57cec5SDimitry Andric MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
9220b57cec5SDimitry Andric                           StorageType Storage, bool ShouldCreate) {
9230b57cec5SDimitry Andric   unsigned Hash = 0;
9240b57cec5SDimitry Andric   if (Storage == Uniqued) {
9250b57cec5SDimitry Andric     MDTupleInfo::KeyTy Key(MDs);
9260b57cec5SDimitry Andric     if (auto *N = getUniqued(Context.pImpl->MDTuples, Key))
9270b57cec5SDimitry Andric       return N;
9280b57cec5SDimitry Andric     if (!ShouldCreate)
9290b57cec5SDimitry Andric       return nullptr;
9300b57cec5SDimitry Andric     Hash = Key.getHash();
9310b57cec5SDimitry Andric   } else {
9320b57cec5SDimitry Andric     assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
9330b57cec5SDimitry Andric   }
9340b57cec5SDimitry Andric 
93581ad6265SDimitry Andric   return storeImpl(new (MDs.size(), Storage)
93681ad6265SDimitry Andric                        MDTuple(Context, Storage, Hash, MDs),
9370b57cec5SDimitry Andric                    Storage, Context.pImpl->MDTuples);
9380b57cec5SDimitry Andric }
9390b57cec5SDimitry Andric 
9400b57cec5SDimitry Andric void MDNode::deleteTemporary(MDNode *N) {
9410b57cec5SDimitry Andric   assert(N->isTemporary() && "Expected temporary node");
9420b57cec5SDimitry Andric   N->replaceAllUsesWith(nullptr);
9430b57cec5SDimitry Andric   N->deleteAsSubclass();
9440b57cec5SDimitry Andric }
9450b57cec5SDimitry Andric 
9460b57cec5SDimitry Andric void MDNode::storeDistinctInContext() {
9470b57cec5SDimitry Andric   assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses");
94881ad6265SDimitry Andric   assert(!getNumUnresolved() && "Unexpected unresolved nodes");
9490b57cec5SDimitry Andric   Storage = Distinct;
9500b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
9510b57cec5SDimitry Andric 
9520b57cec5SDimitry Andric   // Reset the hash.
9530b57cec5SDimitry Andric   switch (getMetadataID()) {
9540b57cec5SDimitry Andric   default:
9550b57cec5SDimitry Andric     llvm_unreachable("Invalid subclass of MDNode");
9560b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
9570b57cec5SDimitry Andric   case CLASS##Kind: {                                                          \
9580b57cec5SDimitry Andric     std::integral_constant<bool, HasCachedHash<CLASS>::value> ShouldResetHash; \
9590b57cec5SDimitry Andric     dispatchResetHash(cast<CLASS>(this), ShouldResetHash);                     \
9600b57cec5SDimitry Andric     break;                                                                     \
9610b57cec5SDimitry Andric   }
9620b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
9630b57cec5SDimitry Andric   }
9640b57cec5SDimitry Andric 
9650b57cec5SDimitry Andric   getContext().pImpl->DistinctMDNodes.push_back(this);
9660b57cec5SDimitry Andric }
9670b57cec5SDimitry Andric 
9680b57cec5SDimitry Andric void MDNode::replaceOperandWith(unsigned I, Metadata *New) {
9690b57cec5SDimitry Andric   if (getOperand(I) == New)
9700b57cec5SDimitry Andric     return;
9710b57cec5SDimitry Andric 
9720b57cec5SDimitry Andric   if (!isUniqued()) {
9730b57cec5SDimitry Andric     setOperand(I, New);
9740b57cec5SDimitry Andric     return;
9750b57cec5SDimitry Andric   }
9760b57cec5SDimitry Andric 
9770b57cec5SDimitry Andric   handleChangedOperand(mutable_begin() + I, New);
9780b57cec5SDimitry Andric }
9790b57cec5SDimitry Andric 
9800b57cec5SDimitry Andric void MDNode::setOperand(unsigned I, Metadata *New) {
98181ad6265SDimitry Andric   assert(I < getNumOperands());
9820b57cec5SDimitry Andric   mutable_begin()[I].reset(New, isUniqued() ? this : nullptr);
9830b57cec5SDimitry Andric }
9840b57cec5SDimitry Andric 
9850b57cec5SDimitry Andric /// Get a node or a self-reference that looks like it.
9860b57cec5SDimitry Andric ///
9870b57cec5SDimitry Andric /// Special handling for finding self-references, for use by \a
9880b57cec5SDimitry Andric /// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from
9890b57cec5SDimitry Andric /// when self-referencing nodes were still uniqued.  If the first operand has
9900b57cec5SDimitry Andric /// the same operands as \c Ops, return the first operand instead.
9910b57cec5SDimitry Andric static MDNode *getOrSelfReference(LLVMContext &Context,
9920b57cec5SDimitry Andric                                   ArrayRef<Metadata *> Ops) {
9930b57cec5SDimitry Andric   if (!Ops.empty())
9940b57cec5SDimitry Andric     if (MDNode *N = dyn_cast_or_null<MDNode>(Ops[0]))
9950b57cec5SDimitry Andric       if (N->getNumOperands() == Ops.size() && N == N->getOperand(0)) {
9960b57cec5SDimitry Andric         for (unsigned I = 1, E = Ops.size(); I != E; ++I)
9970b57cec5SDimitry Andric           if (Ops[I] != N->getOperand(I))
9980b57cec5SDimitry Andric             return MDNode::get(Context, Ops);
9990b57cec5SDimitry Andric         return N;
10000b57cec5SDimitry Andric       }
10010b57cec5SDimitry Andric 
10020b57cec5SDimitry Andric   return MDNode::get(Context, Ops);
10030b57cec5SDimitry Andric }
10040b57cec5SDimitry Andric 
10050b57cec5SDimitry Andric MDNode *MDNode::concatenate(MDNode *A, MDNode *B) {
10060b57cec5SDimitry Andric   if (!A)
10070b57cec5SDimitry Andric     return B;
10080b57cec5SDimitry Andric   if (!B)
10090b57cec5SDimitry Andric     return A;
10100b57cec5SDimitry Andric 
10110b57cec5SDimitry Andric   SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
10120b57cec5SDimitry Andric   MDs.insert(B->op_begin(), B->op_end());
10130b57cec5SDimitry Andric 
10140b57cec5SDimitry Andric   // FIXME: This preserves long-standing behaviour, but is it really the right
10150b57cec5SDimitry Andric   // behaviour?  Or was that an unintended side-effect of node uniquing?
10160b57cec5SDimitry Andric   return getOrSelfReference(A->getContext(), MDs.getArrayRef());
10170b57cec5SDimitry Andric }
10180b57cec5SDimitry Andric 
10190b57cec5SDimitry Andric MDNode *MDNode::intersect(MDNode *A, MDNode *B) {
10200b57cec5SDimitry Andric   if (!A || !B)
10210b57cec5SDimitry Andric     return nullptr;
10220b57cec5SDimitry Andric 
10230b57cec5SDimitry Andric   SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
10240b57cec5SDimitry Andric   SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end());
10255ffd83dbSDimitry Andric   MDs.remove_if([&](Metadata *MD) { return !BSet.count(MD); });
10260b57cec5SDimitry Andric 
10270b57cec5SDimitry Andric   // FIXME: This preserves long-standing behaviour, but is it really the right
10280b57cec5SDimitry Andric   // behaviour?  Or was that an unintended side-effect of node uniquing?
10290b57cec5SDimitry Andric   return getOrSelfReference(A->getContext(), MDs.getArrayRef());
10300b57cec5SDimitry Andric }
10310b57cec5SDimitry Andric 
10320b57cec5SDimitry Andric MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) {
10330b57cec5SDimitry Andric   if (!A || !B)
10340b57cec5SDimitry Andric     return nullptr;
10350b57cec5SDimitry Andric 
1036e8d8bef9SDimitry Andric   // Take the intersection of domains then union the scopes
1037e8d8bef9SDimitry Andric   // within those domains
1038e8d8bef9SDimitry Andric   SmallPtrSet<const MDNode *, 16> ADomains;
1039e8d8bef9SDimitry Andric   SmallPtrSet<const MDNode *, 16> IntersectDomains;
1040e8d8bef9SDimitry Andric   SmallSetVector<Metadata *, 4> MDs;
1041e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : A->operands())
1042e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1043e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1044e8d8bef9SDimitry Andric         ADomains.insert(Domain);
1045e8d8bef9SDimitry Andric 
1046e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : B->operands())
1047e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1048e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1049e8d8bef9SDimitry Andric         if (ADomains.contains(Domain)) {
1050e8d8bef9SDimitry Andric           IntersectDomains.insert(Domain);
1051e8d8bef9SDimitry Andric           MDs.insert(MDOp);
1052e8d8bef9SDimitry Andric         }
1053e8d8bef9SDimitry Andric 
1054e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : A->operands())
1055e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1056e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1057e8d8bef9SDimitry Andric         if (IntersectDomains.contains(Domain))
1058e8d8bef9SDimitry Andric           MDs.insert(MDOp);
1059e8d8bef9SDimitry Andric 
1060e8d8bef9SDimitry Andric   return MDs.empty() ? nullptr
1061e8d8bef9SDimitry Andric                      : getOrSelfReference(A->getContext(), MDs.getArrayRef());
10620b57cec5SDimitry Andric }
10630b57cec5SDimitry Andric 
10640b57cec5SDimitry Andric MDNode *MDNode::getMostGenericFPMath(MDNode *A, MDNode *B) {
10650b57cec5SDimitry Andric   if (!A || !B)
10660b57cec5SDimitry Andric     return nullptr;
10670b57cec5SDimitry Andric 
10680b57cec5SDimitry Andric   APFloat AVal = mdconst::extract<ConstantFP>(A->getOperand(0))->getValueAPF();
10690b57cec5SDimitry Andric   APFloat BVal = mdconst::extract<ConstantFP>(B->getOperand(0))->getValueAPF();
10705ffd83dbSDimitry Andric   if (AVal < BVal)
10710b57cec5SDimitry Andric     return A;
10720b57cec5SDimitry Andric   return B;
10730b57cec5SDimitry Andric }
10740b57cec5SDimitry Andric 
10750b57cec5SDimitry Andric static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
10760b57cec5SDimitry Andric   return A.getUpper() == B.getLower() || A.getLower() == B.getUpper();
10770b57cec5SDimitry Andric }
10780b57cec5SDimitry Andric 
10790b57cec5SDimitry Andric static bool canBeMerged(const ConstantRange &A, const ConstantRange &B) {
10800b57cec5SDimitry Andric   return !A.intersectWith(B).isEmptySet() || isContiguous(A, B);
10810b57cec5SDimitry Andric }
10820b57cec5SDimitry Andric 
10830b57cec5SDimitry Andric static bool tryMergeRange(SmallVectorImpl<ConstantInt *> &EndPoints,
10840b57cec5SDimitry Andric                           ConstantInt *Low, ConstantInt *High) {
10850b57cec5SDimitry Andric   ConstantRange NewRange(Low->getValue(), High->getValue());
10860b57cec5SDimitry Andric   unsigned Size = EndPoints.size();
10870b57cec5SDimitry Andric   APInt LB = EndPoints[Size - 2]->getValue();
10880b57cec5SDimitry Andric   APInt LE = EndPoints[Size - 1]->getValue();
10890b57cec5SDimitry Andric   ConstantRange LastRange(LB, LE);
10900b57cec5SDimitry Andric   if (canBeMerged(NewRange, LastRange)) {
10910b57cec5SDimitry Andric     ConstantRange Union = LastRange.unionWith(NewRange);
10920b57cec5SDimitry Andric     Type *Ty = High->getType();
10930b57cec5SDimitry Andric     EndPoints[Size - 2] =
10940b57cec5SDimitry Andric         cast<ConstantInt>(ConstantInt::get(Ty, Union.getLower()));
10950b57cec5SDimitry Andric     EndPoints[Size - 1] =
10960b57cec5SDimitry Andric         cast<ConstantInt>(ConstantInt::get(Ty, Union.getUpper()));
10970b57cec5SDimitry Andric     return true;
10980b57cec5SDimitry Andric   }
10990b57cec5SDimitry Andric   return false;
11000b57cec5SDimitry Andric }
11010b57cec5SDimitry Andric 
11020b57cec5SDimitry Andric static void addRange(SmallVectorImpl<ConstantInt *> &EndPoints,
11030b57cec5SDimitry Andric                      ConstantInt *Low, ConstantInt *High) {
11040b57cec5SDimitry Andric   if (!EndPoints.empty())
11050b57cec5SDimitry Andric     if (tryMergeRange(EndPoints, Low, High))
11060b57cec5SDimitry Andric       return;
11070b57cec5SDimitry Andric 
11080b57cec5SDimitry Andric   EndPoints.push_back(Low);
11090b57cec5SDimitry Andric   EndPoints.push_back(High);
11100b57cec5SDimitry Andric }
11110b57cec5SDimitry Andric 
11120b57cec5SDimitry Andric MDNode *MDNode::getMostGenericRange(MDNode *A, MDNode *B) {
11130b57cec5SDimitry Andric   // Given two ranges, we want to compute the union of the ranges. This
11140b57cec5SDimitry Andric   // is slightly complicated by having to combine the intervals and merge
11150b57cec5SDimitry Andric   // the ones that overlap.
11160b57cec5SDimitry Andric 
11170b57cec5SDimitry Andric   if (!A || !B)
11180b57cec5SDimitry Andric     return nullptr;
11190b57cec5SDimitry Andric 
11200b57cec5SDimitry Andric   if (A == B)
11210b57cec5SDimitry Andric     return A;
11220b57cec5SDimitry Andric 
11230b57cec5SDimitry Andric   // First, walk both lists in order of the lower boundary of each interval.
11240b57cec5SDimitry Andric   // At each step, try to merge the new interval to the last one we adedd.
11250b57cec5SDimitry Andric   SmallVector<ConstantInt *, 4> EndPoints;
11260b57cec5SDimitry Andric   int AI = 0;
11270b57cec5SDimitry Andric   int BI = 0;
11280b57cec5SDimitry Andric   int AN = A->getNumOperands() / 2;
11290b57cec5SDimitry Andric   int BN = B->getNumOperands() / 2;
11300b57cec5SDimitry Andric   while (AI < AN && BI < BN) {
11310b57cec5SDimitry Andric     ConstantInt *ALow = mdconst::extract<ConstantInt>(A->getOperand(2 * AI));
11320b57cec5SDimitry Andric     ConstantInt *BLow = mdconst::extract<ConstantInt>(B->getOperand(2 * BI));
11330b57cec5SDimitry Andric 
11340b57cec5SDimitry Andric     if (ALow->getValue().slt(BLow->getValue())) {
11350b57cec5SDimitry Andric       addRange(EndPoints, ALow,
11360b57cec5SDimitry Andric                mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
11370b57cec5SDimitry Andric       ++AI;
11380b57cec5SDimitry Andric     } else {
11390b57cec5SDimitry Andric       addRange(EndPoints, BLow,
11400b57cec5SDimitry Andric                mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
11410b57cec5SDimitry Andric       ++BI;
11420b57cec5SDimitry Andric     }
11430b57cec5SDimitry Andric   }
11440b57cec5SDimitry Andric   while (AI < AN) {
11450b57cec5SDimitry Andric     addRange(EndPoints, mdconst::extract<ConstantInt>(A->getOperand(2 * AI)),
11460b57cec5SDimitry Andric              mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
11470b57cec5SDimitry Andric     ++AI;
11480b57cec5SDimitry Andric   }
11490b57cec5SDimitry Andric   while (BI < BN) {
11500b57cec5SDimitry Andric     addRange(EndPoints, mdconst::extract<ConstantInt>(B->getOperand(2 * BI)),
11510b57cec5SDimitry Andric              mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
11520b57cec5SDimitry Andric     ++BI;
11530b57cec5SDimitry Andric   }
11540b57cec5SDimitry Andric 
11550b57cec5SDimitry Andric   // If we have more than 2 ranges (4 endpoints) we have to try to merge
11560b57cec5SDimitry Andric   // the last and first ones.
11570b57cec5SDimitry Andric   unsigned Size = EndPoints.size();
11580b57cec5SDimitry Andric   if (Size > 4) {
11590b57cec5SDimitry Andric     ConstantInt *FB = EndPoints[0];
11600b57cec5SDimitry Andric     ConstantInt *FE = EndPoints[1];
11610b57cec5SDimitry Andric     if (tryMergeRange(EndPoints, FB, FE)) {
11620b57cec5SDimitry Andric       for (unsigned i = 0; i < Size - 2; ++i) {
11630b57cec5SDimitry Andric         EndPoints[i] = EndPoints[i + 2];
11640b57cec5SDimitry Andric       }
11650b57cec5SDimitry Andric       EndPoints.resize(Size - 2);
11660b57cec5SDimitry Andric     }
11670b57cec5SDimitry Andric   }
11680b57cec5SDimitry Andric 
11690b57cec5SDimitry Andric   // If in the end we have a single range, it is possible that it is now the
11700b57cec5SDimitry Andric   // full range. Just drop the metadata in that case.
11710b57cec5SDimitry Andric   if (EndPoints.size() == 2) {
11720b57cec5SDimitry Andric     ConstantRange Range(EndPoints[0]->getValue(), EndPoints[1]->getValue());
11730b57cec5SDimitry Andric     if (Range.isFullSet())
11740b57cec5SDimitry Andric       return nullptr;
11750b57cec5SDimitry Andric   }
11760b57cec5SDimitry Andric 
11770b57cec5SDimitry Andric   SmallVector<Metadata *, 4> MDs;
11780b57cec5SDimitry Andric   MDs.reserve(EndPoints.size());
11790b57cec5SDimitry Andric   for (auto *I : EndPoints)
11800b57cec5SDimitry Andric     MDs.push_back(ConstantAsMetadata::get(I));
11810b57cec5SDimitry Andric   return MDNode::get(A->getContext(), MDs);
11820b57cec5SDimitry Andric }
11830b57cec5SDimitry Andric 
11840b57cec5SDimitry Andric MDNode *MDNode::getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B) {
11850b57cec5SDimitry Andric   if (!A || !B)
11860b57cec5SDimitry Andric     return nullptr;
11870b57cec5SDimitry Andric 
11880b57cec5SDimitry Andric   ConstantInt *AVal = mdconst::extract<ConstantInt>(A->getOperand(0));
11890b57cec5SDimitry Andric   ConstantInt *BVal = mdconst::extract<ConstantInt>(B->getOperand(0));
11900b57cec5SDimitry Andric   if (AVal->getZExtValue() < BVal->getZExtValue())
11910b57cec5SDimitry Andric     return A;
11920b57cec5SDimitry Andric   return B;
11930b57cec5SDimitry Andric }
11940b57cec5SDimitry Andric 
11950b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
11960b57cec5SDimitry Andric // NamedMDNode implementation.
11970b57cec5SDimitry Andric //
11980b57cec5SDimitry Andric 
11990b57cec5SDimitry Andric static SmallVector<TrackingMDRef, 4> &getNMDOps(void *Operands) {
12000b57cec5SDimitry Andric   return *(SmallVector<TrackingMDRef, 4> *)Operands;
12010b57cec5SDimitry Andric }
12020b57cec5SDimitry Andric 
12030b57cec5SDimitry Andric NamedMDNode::NamedMDNode(const Twine &N)
12040b57cec5SDimitry Andric     : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {}
12050b57cec5SDimitry Andric 
12060b57cec5SDimitry Andric NamedMDNode::~NamedMDNode() {
12070b57cec5SDimitry Andric   dropAllReferences();
12080b57cec5SDimitry Andric   delete &getNMDOps(Operands);
12090b57cec5SDimitry Andric }
12100b57cec5SDimitry Andric 
12110b57cec5SDimitry Andric unsigned NamedMDNode::getNumOperands() const {
12120b57cec5SDimitry Andric   return (unsigned)getNMDOps(Operands).size();
12130b57cec5SDimitry Andric }
12140b57cec5SDimitry Andric 
12150b57cec5SDimitry Andric MDNode *NamedMDNode::getOperand(unsigned i) const {
12160b57cec5SDimitry Andric   assert(i < getNumOperands() && "Invalid Operand number!");
12170b57cec5SDimitry Andric   auto *N = getNMDOps(Operands)[i].get();
12180b57cec5SDimitry Andric   return cast_or_null<MDNode>(N);
12190b57cec5SDimitry Andric }
12200b57cec5SDimitry Andric 
12210b57cec5SDimitry Andric void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); }
12220b57cec5SDimitry Andric 
12230b57cec5SDimitry Andric void NamedMDNode::setOperand(unsigned I, MDNode *New) {
12240b57cec5SDimitry Andric   assert(I < getNumOperands() && "Invalid operand number");
12250b57cec5SDimitry Andric   getNMDOps(Operands)[I].reset(New);
12260b57cec5SDimitry Andric }
12270b57cec5SDimitry Andric 
12280b57cec5SDimitry Andric void NamedMDNode::eraseFromParent() { getParent()->eraseNamedMetadata(this); }
12290b57cec5SDimitry Andric 
12300b57cec5SDimitry Andric void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); }
12310b57cec5SDimitry Andric 
12320b57cec5SDimitry Andric StringRef NamedMDNode::getName() const { return StringRef(Name); }
12330b57cec5SDimitry Andric 
12340b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
12350b57cec5SDimitry Andric // Instruction Metadata method implementations.
12360b57cec5SDimitry Andric //
12370b57cec5SDimitry Andric 
1238e8d8bef9SDimitry Andric MDNode *MDAttachments::lookup(unsigned ID) const {
12390b57cec5SDimitry Andric   for (const auto &A : Attachments)
12400b57cec5SDimitry Andric     if (A.MDKind == ID)
12410b57cec5SDimitry Andric       return A.Node;
12420b57cec5SDimitry Andric   return nullptr;
12430b57cec5SDimitry Andric }
12440b57cec5SDimitry Andric 
1245e8d8bef9SDimitry Andric void MDAttachments::get(unsigned ID, SmallVectorImpl<MDNode *> &Result) const {
12460b57cec5SDimitry Andric   for (const auto &A : Attachments)
12470b57cec5SDimitry Andric     if (A.MDKind == ID)
12480b57cec5SDimitry Andric       Result.push_back(A.Node);
12490b57cec5SDimitry Andric }
12500b57cec5SDimitry Andric 
1251e8d8bef9SDimitry Andric void MDAttachments::getAll(
12520b57cec5SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
12530b57cec5SDimitry Andric   for (const auto &A : Attachments)
12540b57cec5SDimitry Andric     Result.emplace_back(A.MDKind, A.Node);
12550b57cec5SDimitry Andric 
12560b57cec5SDimitry Andric   // Sort the resulting array so it is stable with respect to metadata IDs. We
12570b57cec5SDimitry Andric   // need to preserve the original insertion order though.
1258e8d8bef9SDimitry Andric   if (Result.size() > 1)
12590b57cec5SDimitry Andric     llvm::stable_sort(Result, less_first());
12600b57cec5SDimitry Andric }
12610b57cec5SDimitry Andric 
1262e8d8bef9SDimitry Andric void MDAttachments::set(unsigned ID, MDNode *MD) {
1263e8d8bef9SDimitry Andric   erase(ID);
1264e8d8bef9SDimitry Andric   if (MD)
1265e8d8bef9SDimitry Andric     insert(ID, *MD);
1266e8d8bef9SDimitry Andric }
1267e8d8bef9SDimitry Andric 
1268e8d8bef9SDimitry Andric void MDAttachments::insert(unsigned ID, MDNode &MD) {
1269e8d8bef9SDimitry Andric   Attachments.push_back({ID, TrackingMDNodeRef(&MD)});
1270e8d8bef9SDimitry Andric }
1271e8d8bef9SDimitry Andric 
1272e8d8bef9SDimitry Andric bool MDAttachments::erase(unsigned ID) {
1273e8d8bef9SDimitry Andric   if (empty())
1274e8d8bef9SDimitry Andric     return false;
1275e8d8bef9SDimitry Andric 
1276e8d8bef9SDimitry Andric   // Common case is one value.
1277e8d8bef9SDimitry Andric   if (Attachments.size() == 1 && Attachments.back().MDKind == ID) {
1278e8d8bef9SDimitry Andric     Attachments.pop_back();
1279e8d8bef9SDimitry Andric     return true;
1280e8d8bef9SDimitry Andric   }
1281e8d8bef9SDimitry Andric 
1282e8d8bef9SDimitry Andric   auto OldSize = Attachments.size();
1283e8d8bef9SDimitry Andric   llvm::erase_if(Attachments,
1284e8d8bef9SDimitry Andric                  [ID](const Attachment &A) { return A.MDKind == ID; });
1285e8d8bef9SDimitry Andric   return OldSize != Attachments.size();
1286e8d8bef9SDimitry Andric }
1287e8d8bef9SDimitry Andric 
1288e8d8bef9SDimitry Andric MDNode *Value::getMetadata(unsigned KindID) const {
1289e8d8bef9SDimitry Andric   if (!hasMetadata())
1290e8d8bef9SDimitry Andric     return nullptr;
1291e8d8bef9SDimitry Andric   const auto &Info = getContext().pImpl->ValueMetadata[this];
1292e8d8bef9SDimitry Andric   assert(!Info.empty() && "bit out of sync with hash table");
1293e8d8bef9SDimitry Andric   return Info.lookup(KindID);
1294e8d8bef9SDimitry Andric }
1295e8d8bef9SDimitry Andric 
1296e8d8bef9SDimitry Andric MDNode *Value::getMetadata(StringRef Kind) const {
1297e8d8bef9SDimitry Andric   if (!hasMetadata())
1298e8d8bef9SDimitry Andric     return nullptr;
1299e8d8bef9SDimitry Andric   const auto &Info = getContext().pImpl->ValueMetadata[this];
1300e8d8bef9SDimitry Andric   assert(!Info.empty() && "bit out of sync with hash table");
1301e8d8bef9SDimitry Andric   return Info.lookup(getContext().getMDKindID(Kind));
1302e8d8bef9SDimitry Andric }
1303e8d8bef9SDimitry Andric 
1304e8d8bef9SDimitry Andric void Value::getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const {
1305e8d8bef9SDimitry Andric   if (hasMetadata())
1306e8d8bef9SDimitry Andric     getContext().pImpl->ValueMetadata[this].get(KindID, MDs);
1307e8d8bef9SDimitry Andric }
1308e8d8bef9SDimitry Andric 
1309e8d8bef9SDimitry Andric void Value::getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const {
1310e8d8bef9SDimitry Andric   if (hasMetadata())
1311e8d8bef9SDimitry Andric     getMetadata(getContext().getMDKindID(Kind), MDs);
1312e8d8bef9SDimitry Andric }
1313e8d8bef9SDimitry Andric 
1314e8d8bef9SDimitry Andric void Value::getAllMetadata(
1315e8d8bef9SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
1316e8d8bef9SDimitry Andric   if (hasMetadata()) {
1317e8d8bef9SDimitry Andric     assert(getContext().pImpl->ValueMetadata.count(this) &&
1318e8d8bef9SDimitry Andric            "bit out of sync with hash table");
1319e8d8bef9SDimitry Andric     const auto &Info = getContext().pImpl->ValueMetadata.find(this)->second;
1320e8d8bef9SDimitry Andric     assert(!Info.empty() && "Shouldn't have called this");
1321e8d8bef9SDimitry Andric     Info.getAll(MDs);
1322e8d8bef9SDimitry Andric   }
1323e8d8bef9SDimitry Andric }
1324e8d8bef9SDimitry Andric 
1325e8d8bef9SDimitry Andric void Value::setMetadata(unsigned KindID, MDNode *Node) {
1326e8d8bef9SDimitry Andric   assert(isa<Instruction>(this) || isa<GlobalObject>(this));
1327e8d8bef9SDimitry Andric 
1328e8d8bef9SDimitry Andric   // Handle the case when we're adding/updating metadata on a value.
1329e8d8bef9SDimitry Andric   if (Node) {
1330e8d8bef9SDimitry Andric     auto &Info = getContext().pImpl->ValueMetadata[this];
1331e8d8bef9SDimitry Andric     assert(!Info.empty() == HasMetadata && "bit out of sync with hash table");
1332e8d8bef9SDimitry Andric     if (Info.empty())
1333e8d8bef9SDimitry Andric       HasMetadata = true;
1334e8d8bef9SDimitry Andric     Info.set(KindID, Node);
1335e8d8bef9SDimitry Andric     return;
1336e8d8bef9SDimitry Andric   }
1337e8d8bef9SDimitry Andric 
1338e8d8bef9SDimitry Andric   // Otherwise, we're removing metadata from an instruction.
1339e8d8bef9SDimitry Andric   assert((HasMetadata == (getContext().pImpl->ValueMetadata.count(this) > 0)) &&
1340e8d8bef9SDimitry Andric          "bit out of sync with hash table");
1341e8d8bef9SDimitry Andric   if (!HasMetadata)
1342e8d8bef9SDimitry Andric     return; // Nothing to remove!
1343e8d8bef9SDimitry Andric   auto &Info = getContext().pImpl->ValueMetadata[this];
1344e8d8bef9SDimitry Andric 
1345e8d8bef9SDimitry Andric   // Handle removal of an existing value.
1346e8d8bef9SDimitry Andric   Info.erase(KindID);
1347e8d8bef9SDimitry Andric   if (!Info.empty())
1348e8d8bef9SDimitry Andric     return;
1349e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata.erase(this);
1350e8d8bef9SDimitry Andric   HasMetadata = false;
1351e8d8bef9SDimitry Andric }
1352e8d8bef9SDimitry Andric 
1353e8d8bef9SDimitry Andric void Value::setMetadata(StringRef Kind, MDNode *Node) {
1354e8d8bef9SDimitry Andric   if (!Node && !HasMetadata)
1355e8d8bef9SDimitry Andric     return;
1356e8d8bef9SDimitry Andric   setMetadata(getContext().getMDKindID(Kind), Node);
1357e8d8bef9SDimitry Andric }
1358e8d8bef9SDimitry Andric 
1359e8d8bef9SDimitry Andric void Value::addMetadata(unsigned KindID, MDNode &MD) {
1360e8d8bef9SDimitry Andric   assert(isa<Instruction>(this) || isa<GlobalObject>(this));
1361e8d8bef9SDimitry Andric   if (!HasMetadata)
1362e8d8bef9SDimitry Andric     HasMetadata = true;
1363e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata[this].insert(KindID, MD);
1364e8d8bef9SDimitry Andric }
1365e8d8bef9SDimitry Andric 
1366e8d8bef9SDimitry Andric void Value::addMetadata(StringRef Kind, MDNode &MD) {
1367e8d8bef9SDimitry Andric   addMetadata(getContext().getMDKindID(Kind), MD);
1368e8d8bef9SDimitry Andric }
1369e8d8bef9SDimitry Andric 
1370e8d8bef9SDimitry Andric bool Value::eraseMetadata(unsigned KindID) {
1371e8d8bef9SDimitry Andric   // Nothing to unset.
1372e8d8bef9SDimitry Andric   if (!HasMetadata)
1373e8d8bef9SDimitry Andric     return false;
1374e8d8bef9SDimitry Andric 
1375e8d8bef9SDimitry Andric   auto &Store = getContext().pImpl->ValueMetadata[this];
1376e8d8bef9SDimitry Andric   bool Changed = Store.erase(KindID);
1377e8d8bef9SDimitry Andric   if (Store.empty())
1378e8d8bef9SDimitry Andric     clearMetadata();
1379e8d8bef9SDimitry Andric   return Changed;
1380e8d8bef9SDimitry Andric }
1381e8d8bef9SDimitry Andric 
1382e8d8bef9SDimitry Andric void Value::clearMetadata() {
1383e8d8bef9SDimitry Andric   if (!HasMetadata)
1384e8d8bef9SDimitry Andric     return;
1385e8d8bef9SDimitry Andric   assert(getContext().pImpl->ValueMetadata.count(this) &&
1386e8d8bef9SDimitry Andric          "bit out of sync with hash table");
1387e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata.erase(this);
1388e8d8bef9SDimitry Andric   HasMetadata = false;
1389e8d8bef9SDimitry Andric }
1390e8d8bef9SDimitry Andric 
13910b57cec5SDimitry Andric void Instruction::setMetadata(StringRef Kind, MDNode *Node) {
13920b57cec5SDimitry Andric   if (!Node && !hasMetadata())
13930b57cec5SDimitry Andric     return;
13940b57cec5SDimitry Andric   setMetadata(getContext().getMDKindID(Kind), Node);
13950b57cec5SDimitry Andric }
13960b57cec5SDimitry Andric 
13970b57cec5SDimitry Andric MDNode *Instruction::getMetadataImpl(StringRef Kind) const {
13980b57cec5SDimitry Andric   return getMetadataImpl(getContext().getMDKindID(Kind));
13990b57cec5SDimitry Andric }
14000b57cec5SDimitry Andric 
14010b57cec5SDimitry Andric void Instruction::dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs) {
1402e8d8bef9SDimitry Andric   if (!Value::hasMetadata())
14030b57cec5SDimitry Andric     return; // Nothing to remove!
14040b57cec5SDimitry Andric 
1405e8d8bef9SDimitry Andric   SmallSet<unsigned, 4> KnownSet;
1406e8d8bef9SDimitry Andric   KnownSet.insert(KnownIDs.begin(), KnownIDs.end());
1407e8d8bef9SDimitry Andric 
1408*bdd1243dSDimitry Andric   // A DIAssignID attachment is debug metadata, don't drop it.
1409*bdd1243dSDimitry Andric   KnownSet.insert(LLVMContext::MD_DIAssignID);
1410*bdd1243dSDimitry Andric 
1411e8d8bef9SDimitry Andric   auto &MetadataStore = getContext().pImpl->ValueMetadata;
1412e8d8bef9SDimitry Andric   auto &Info = MetadataStore[this];
1413e8d8bef9SDimitry Andric   assert(!Info.empty() && "bit out of sync with hash table");
1414e8d8bef9SDimitry Andric   Info.remove_if([&KnownSet](const MDAttachments::Attachment &I) {
1415e8d8bef9SDimitry Andric     return !KnownSet.count(I.MDKind);
14160b57cec5SDimitry Andric   });
14170b57cec5SDimitry Andric 
14180b57cec5SDimitry Andric   if (Info.empty()) {
14190b57cec5SDimitry Andric     // Drop our entry at the store.
1420e8d8bef9SDimitry Andric     clearMetadata();
14210b57cec5SDimitry Andric   }
14220b57cec5SDimitry Andric }
14230b57cec5SDimitry Andric 
1424*bdd1243dSDimitry Andric void Instruction::updateDIAssignIDMapping(DIAssignID *ID) {
1425*bdd1243dSDimitry Andric   auto &IDToInstrs = getContext().pImpl->AssignmentIDToInstrs;
1426*bdd1243dSDimitry Andric   if (const DIAssignID *CurrentID =
1427*bdd1243dSDimitry Andric           cast_or_null<DIAssignID>(getMetadata(LLVMContext::MD_DIAssignID))) {
1428*bdd1243dSDimitry Andric     // Nothing to do if the ID isn't changing.
1429*bdd1243dSDimitry Andric     if (ID == CurrentID)
1430*bdd1243dSDimitry Andric       return;
1431*bdd1243dSDimitry Andric 
1432*bdd1243dSDimitry Andric     // Unmap this instruction from its current ID.
1433*bdd1243dSDimitry Andric     auto InstrsIt = IDToInstrs.find(CurrentID);
1434*bdd1243dSDimitry Andric     assert(InstrsIt != IDToInstrs.end() &&
1435*bdd1243dSDimitry Andric            "Expect existing attachment to be mapped");
1436*bdd1243dSDimitry Andric 
1437*bdd1243dSDimitry Andric     auto &InstVec = InstrsIt->second;
1438*bdd1243dSDimitry Andric     auto *InstIt = std::find(InstVec.begin(), InstVec.end(), this);
1439*bdd1243dSDimitry Andric     assert(InstIt != InstVec.end() &&
1440*bdd1243dSDimitry Andric            "Expect instruction to be mapped to attachment");
1441*bdd1243dSDimitry Andric     // The vector contains a ptr to this. If this is the only element in the
1442*bdd1243dSDimitry Andric     // vector, remove the ID:vector entry, otherwise just remove the
1443*bdd1243dSDimitry Andric     // instruction from the vector.
1444*bdd1243dSDimitry Andric     if (InstVec.size() == 1)
1445*bdd1243dSDimitry Andric       IDToInstrs.erase(InstrsIt);
1446*bdd1243dSDimitry Andric     else
1447*bdd1243dSDimitry Andric       InstVec.erase(InstIt);
1448*bdd1243dSDimitry Andric   }
1449*bdd1243dSDimitry Andric 
1450*bdd1243dSDimitry Andric   // Map this instruction to the new ID.
1451*bdd1243dSDimitry Andric   if (ID)
1452*bdd1243dSDimitry Andric     IDToInstrs[ID].push_back(this);
1453*bdd1243dSDimitry Andric }
1454*bdd1243dSDimitry Andric 
14550b57cec5SDimitry Andric void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
14560b57cec5SDimitry Andric   if (!Node && !hasMetadata())
14570b57cec5SDimitry Andric     return;
14580b57cec5SDimitry Andric 
14590b57cec5SDimitry Andric   // Handle 'dbg' as a special case since it is not stored in the hash table.
14600b57cec5SDimitry Andric   if (KindID == LLVMContext::MD_dbg) {
14610b57cec5SDimitry Andric     DbgLoc = DebugLoc(Node);
14620b57cec5SDimitry Andric     return;
14630b57cec5SDimitry Andric   }
14640b57cec5SDimitry Andric 
1465*bdd1243dSDimitry Andric   // Update DIAssignID to Instruction(s) mapping.
1466*bdd1243dSDimitry Andric   if (KindID == LLVMContext::MD_DIAssignID) {
1467*bdd1243dSDimitry Andric     // The DIAssignID tracking infrastructure doesn't support RAUWing temporary
1468*bdd1243dSDimitry Andric     // nodes with DIAssignIDs. The cast_or_null below would also catch this, but
1469*bdd1243dSDimitry Andric     // having a dedicated assert helps make this obvious.
1470*bdd1243dSDimitry Andric     assert((!Node || !Node->isTemporary()) &&
1471*bdd1243dSDimitry Andric            "Temporary DIAssignIDs are invalid");
1472*bdd1243dSDimitry Andric     updateDIAssignIDMapping(cast_or_null<DIAssignID>(Node));
1473*bdd1243dSDimitry Andric   }
1474*bdd1243dSDimitry Andric 
1475e8d8bef9SDimitry Andric   Value::setMetadata(KindID, Node);
14760b57cec5SDimitry Andric }
14770b57cec5SDimitry Andric 
1478e8d8bef9SDimitry Andric void Instruction::addAnnotationMetadata(StringRef Name) {
1479e8d8bef9SDimitry Andric   MDBuilder MDB(getContext());
14800b57cec5SDimitry Andric 
1481e8d8bef9SDimitry Andric   auto *Existing = getMetadata(LLVMContext::MD_annotation);
1482e8d8bef9SDimitry Andric   SmallVector<Metadata *, 4> Names;
1483e8d8bef9SDimitry Andric   bool AppendName = true;
1484e8d8bef9SDimitry Andric   if (Existing) {
1485e8d8bef9SDimitry Andric     auto *Tuple = cast<MDTuple>(Existing);
1486e8d8bef9SDimitry Andric     for (auto &N : Tuple->operands()) {
1487e8d8bef9SDimitry Andric       if (cast<MDString>(N.get())->getString() == Name)
1488e8d8bef9SDimitry Andric         AppendName = false;
1489e8d8bef9SDimitry Andric       Names.push_back(N.get());
1490e8d8bef9SDimitry Andric     }
1491e8d8bef9SDimitry Andric   }
1492e8d8bef9SDimitry Andric   if (AppendName)
1493e8d8bef9SDimitry Andric     Names.push_back(MDB.createString(Name));
14940b57cec5SDimitry Andric 
1495e8d8bef9SDimitry Andric   MDNode *MD = MDTuple::get(getContext(), Names);
1496e8d8bef9SDimitry Andric   setMetadata(LLVMContext::MD_annotation, MD);
14970b57cec5SDimitry Andric }
14980b57cec5SDimitry Andric 
1499349cc55cSDimitry Andric AAMDNodes Instruction::getAAMetadata() const {
1500349cc55cSDimitry Andric   AAMDNodes Result;
1501*bdd1243dSDimitry Andric   // Not using Instruction::hasMetadata() because we're not interested in
1502*bdd1243dSDimitry Andric   // DebugInfoMetadata.
1503*bdd1243dSDimitry Andric   if (Value::hasMetadata()) {
1504*bdd1243dSDimitry Andric     const auto &Info = getContext().pImpl->ValueMetadata[this];
1505*bdd1243dSDimitry Andric     Result.TBAA = Info.lookup(LLVMContext::MD_tbaa);
1506*bdd1243dSDimitry Andric     Result.TBAAStruct = Info.lookup(LLVMContext::MD_tbaa_struct);
1507*bdd1243dSDimitry Andric     Result.Scope = Info.lookup(LLVMContext::MD_alias_scope);
1508*bdd1243dSDimitry Andric     Result.NoAlias = Info.lookup(LLVMContext::MD_noalias);
1509*bdd1243dSDimitry Andric   }
1510349cc55cSDimitry Andric   return Result;
1511349cc55cSDimitry Andric }
1512349cc55cSDimitry Andric 
15130b57cec5SDimitry Andric void Instruction::setAAMetadata(const AAMDNodes &N) {
15140b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_tbaa, N.TBAA);
1515480093f4SDimitry Andric   setMetadata(LLVMContext::MD_tbaa_struct, N.TBAAStruct);
15160b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_alias_scope, N.Scope);
15170b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_noalias, N.NoAlias);
15180b57cec5SDimitry Andric }
15190b57cec5SDimitry Andric 
15200b57cec5SDimitry Andric MDNode *Instruction::getMetadataImpl(unsigned KindID) const {
15210b57cec5SDimitry Andric   // Handle 'dbg' as a special case since it is not stored in the hash table.
15220b57cec5SDimitry Andric   if (KindID == LLVMContext::MD_dbg)
15230b57cec5SDimitry Andric     return DbgLoc.getAsMDNode();
1524e8d8bef9SDimitry Andric   return Value::getMetadata(KindID);
15250b57cec5SDimitry Andric }
15260b57cec5SDimitry Andric 
15270b57cec5SDimitry Andric void Instruction::getAllMetadataImpl(
15280b57cec5SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
15290b57cec5SDimitry Andric   Result.clear();
15300b57cec5SDimitry Andric 
15310b57cec5SDimitry Andric   // Handle 'dbg' as a special case since it is not stored in the hash table.
15320b57cec5SDimitry Andric   if (DbgLoc) {
15330b57cec5SDimitry Andric     Result.push_back(
15340b57cec5SDimitry Andric         std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode()));
15350b57cec5SDimitry Andric   }
1536e8d8bef9SDimitry Andric   Value::getAllMetadata(Result);
15370b57cec5SDimitry Andric }
15380b57cec5SDimitry Andric 
15390b57cec5SDimitry Andric bool Instruction::extractProfTotalWeight(uint64_t &TotalVal) const {
1540fe6060f1SDimitry Andric   assert(
1541fe6060f1SDimitry Andric       (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select ||
1542fe6060f1SDimitry Andric        getOpcode() == Instruction::Call || getOpcode() == Instruction::Invoke ||
1543fe6060f1SDimitry Andric        getOpcode() == Instruction::IndirectBr ||
15440b57cec5SDimitry Andric        getOpcode() == Instruction::Switch) &&
15450b57cec5SDimitry Andric       "Looking for branch weights on something besides branch");
15460b57cec5SDimitry Andric 
1547*bdd1243dSDimitry Andric   return ::extractProfTotalWeight(*this, TotalVal);
15480b57cec5SDimitry Andric }
15490b57cec5SDimitry Andric 
15500b57cec5SDimitry Andric void GlobalObject::copyMetadata(const GlobalObject *Other, unsigned Offset) {
15510b57cec5SDimitry Andric   SmallVector<std::pair<unsigned, MDNode *>, 8> MDs;
15520b57cec5SDimitry Andric   Other->getAllMetadata(MDs);
15530b57cec5SDimitry Andric   for (auto &MD : MDs) {
15540b57cec5SDimitry Andric     // We need to adjust the type metadata offset.
15550b57cec5SDimitry Andric     if (Offset != 0 && MD.first == LLVMContext::MD_type) {
15560b57cec5SDimitry Andric       auto *OffsetConst = cast<ConstantInt>(
15570b57cec5SDimitry Andric           cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue());
15580b57cec5SDimitry Andric       Metadata *TypeId = MD.second->getOperand(1);
15590b57cec5SDimitry Andric       auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get(
15600b57cec5SDimitry Andric           OffsetConst->getType(), OffsetConst->getValue() + Offset));
15610b57cec5SDimitry Andric       addMetadata(LLVMContext::MD_type,
15620b57cec5SDimitry Andric                   *MDNode::get(getContext(), {NewOffsetMD, TypeId}));
15630b57cec5SDimitry Andric       continue;
15640b57cec5SDimitry Andric     }
15650b57cec5SDimitry Andric     // If an offset adjustment was specified we need to modify the DIExpression
15660b57cec5SDimitry Andric     // to prepend the adjustment:
15670b57cec5SDimitry Andric     // !DIExpression(DW_OP_plus, Offset, [original expr])
15680b57cec5SDimitry Andric     auto *Attachment = MD.second;
15690b57cec5SDimitry Andric     if (Offset != 0 && MD.first == LLVMContext::MD_dbg) {
15700b57cec5SDimitry Andric       DIGlobalVariable *GV = dyn_cast<DIGlobalVariable>(Attachment);
15710b57cec5SDimitry Andric       DIExpression *E = nullptr;
15720b57cec5SDimitry Andric       if (!GV) {
15730b57cec5SDimitry Andric         auto *GVE = cast<DIGlobalVariableExpression>(Attachment);
15740b57cec5SDimitry Andric         GV = GVE->getVariable();
15750b57cec5SDimitry Andric         E = GVE->getExpression();
15760b57cec5SDimitry Andric       }
15770b57cec5SDimitry Andric       ArrayRef<uint64_t> OrigElements;
15780b57cec5SDimitry Andric       if (E)
15790b57cec5SDimitry Andric         OrigElements = E->getElements();
15800b57cec5SDimitry Andric       std::vector<uint64_t> Elements(OrigElements.size() + 2);
15810b57cec5SDimitry Andric       Elements[0] = dwarf::DW_OP_plus_uconst;
15820b57cec5SDimitry Andric       Elements[1] = Offset;
15830b57cec5SDimitry Andric       llvm::copy(OrigElements, Elements.begin() + 2);
15840b57cec5SDimitry Andric       E = DIExpression::get(getContext(), Elements);
15850b57cec5SDimitry Andric       Attachment = DIGlobalVariableExpression::get(getContext(), GV, E);
15860b57cec5SDimitry Andric     }
15870b57cec5SDimitry Andric     addMetadata(MD.first, *Attachment);
15880b57cec5SDimitry Andric   }
15890b57cec5SDimitry Andric }
15900b57cec5SDimitry Andric 
15910b57cec5SDimitry Andric void GlobalObject::addTypeMetadata(unsigned Offset, Metadata *TypeID) {
15920b57cec5SDimitry Andric   addMetadata(
15930b57cec5SDimitry Andric       LLVMContext::MD_type,
15940b57cec5SDimitry Andric       *MDTuple::get(getContext(),
15950b57cec5SDimitry Andric                     {ConstantAsMetadata::get(ConstantInt::get(
15960b57cec5SDimitry Andric                          Type::getInt64Ty(getContext()), Offset)),
15970b57cec5SDimitry Andric                      TypeID}));
15980b57cec5SDimitry Andric }
15990b57cec5SDimitry Andric 
16005ffd83dbSDimitry Andric void GlobalObject::setVCallVisibilityMetadata(VCallVisibility Visibility) {
16015ffd83dbSDimitry Andric   // Remove any existing vcall visibility metadata first in case we are
16025ffd83dbSDimitry Andric   // updating.
16035ffd83dbSDimitry Andric   eraseMetadata(LLVMContext::MD_vcall_visibility);
16048bcb0991SDimitry Andric   addMetadata(LLVMContext::MD_vcall_visibility,
16058bcb0991SDimitry Andric               *MDNode::get(getContext(),
16068bcb0991SDimitry Andric                            {ConstantAsMetadata::get(ConstantInt::get(
16078bcb0991SDimitry Andric                                Type::getInt64Ty(getContext()), Visibility))}));
16088bcb0991SDimitry Andric }
16098bcb0991SDimitry Andric 
16108bcb0991SDimitry Andric GlobalObject::VCallVisibility GlobalObject::getVCallVisibility() const {
16118bcb0991SDimitry Andric   if (MDNode *MD = getMetadata(LLVMContext::MD_vcall_visibility)) {
16128bcb0991SDimitry Andric     uint64_t Val = cast<ConstantInt>(
16138bcb0991SDimitry Andric                        cast<ConstantAsMetadata>(MD->getOperand(0))->getValue())
16148bcb0991SDimitry Andric                        ->getZExtValue();
16158bcb0991SDimitry Andric     assert(Val <= 2 && "unknown vcall visibility!");
16168bcb0991SDimitry Andric     return (VCallVisibility)Val;
16178bcb0991SDimitry Andric   }
16188bcb0991SDimitry Andric   return VCallVisibility::VCallVisibilityPublic;
16198bcb0991SDimitry Andric }
16208bcb0991SDimitry Andric 
16210b57cec5SDimitry Andric void Function::setSubprogram(DISubprogram *SP) {
16220b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_dbg, SP);
16230b57cec5SDimitry Andric }
16240b57cec5SDimitry Andric 
16250b57cec5SDimitry Andric DISubprogram *Function::getSubprogram() const {
16260b57cec5SDimitry Andric   return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));
16270b57cec5SDimitry Andric }
16280b57cec5SDimitry Andric 
1629*bdd1243dSDimitry Andric bool Function::shouldEmitDebugInfoForProfiling() const {
16300b57cec5SDimitry Andric   if (DISubprogram *SP = getSubprogram()) {
16310b57cec5SDimitry Andric     if (DICompileUnit *CU = SP->getUnit()) {
16320b57cec5SDimitry Andric       return CU->getDebugInfoForProfiling();
16330b57cec5SDimitry Andric     }
16340b57cec5SDimitry Andric   }
16350b57cec5SDimitry Andric   return false;
16360b57cec5SDimitry Andric }
16370b57cec5SDimitry Andric 
16380b57cec5SDimitry Andric void GlobalVariable::addDebugInfo(DIGlobalVariableExpression *GV) {
16390b57cec5SDimitry Andric   addMetadata(LLVMContext::MD_dbg, *GV);
16400b57cec5SDimitry Andric }
16410b57cec5SDimitry Andric 
16420b57cec5SDimitry Andric void GlobalVariable::getDebugInfo(
16430b57cec5SDimitry Andric     SmallVectorImpl<DIGlobalVariableExpression *> &GVs) const {
16440b57cec5SDimitry Andric   SmallVector<MDNode *, 1> MDs;
16450b57cec5SDimitry Andric   getMetadata(LLVMContext::MD_dbg, MDs);
16460b57cec5SDimitry Andric   for (MDNode *MD : MDs)
16470b57cec5SDimitry Andric     GVs.push_back(cast<DIGlobalVariableExpression>(MD));
16480b57cec5SDimitry Andric }
1649