diff options
-rw-r--r-- | include/llvm/Metadata.h | 1 | ||||
-rw-r--r-- | lib/VMCore/Metadata.cpp | 12 | ||||
-rw-r--r-- | lib/VMCore/Value.cpp | 4 |
3 files changed, 17 insertions, 0 deletions
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index e4414817ca..dd79ac09a2 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -361,6 +361,7 @@ public: void ValueIsDeleted(const Instruction *Inst) { removeMDs(Inst); } + void ValueIsRAUWd(Value *V1, Value *V2); /// ValueIsCloned - This handler is used to update metadata store /// when In1 is cloned to create In2. diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index 2f2345f55e..f3601cbdf5 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -404,3 +404,15 @@ void MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) { if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second)) addMD(I->first, MD, In2); } + +/// ValueIsRAUWd - This handler is used when V1's all uses are replaced by +/// V2. +void MetadataContext::ValueIsRAUWd(Value *V1, Value *V2) { + Instruction *I1 = dyn_cast<Instruction>(V1); + Instruction *I2 = dyn_cast<Instruction>(V2); + if (!I1 || !I2) + return; + + // FIXME : Give custom handlers a chance to override this. + ValueIsCloned(I1, I2); +} diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index 03b0e6f172..ba72af635c 100644 --- a/lib/VMCore/Value.cpp +++ b/lib/VMCore/Value.cpp @@ -309,6 +309,10 @@ void Value::uncheckedReplaceAllUsesWith(Value *New) { // Notify all ValueHandles (if present) that this value is going away. if (HasValueHandle) ValueHandleBase::ValueIsRAUWd(this, New); + if (HasMetadata) { + LLVMContext &Context = getContext(); + Context.pImpl->TheMetadata.ValueIsRAUWd(this, New); + } while (!use_empty()) { Use &U = *UseList; |