Metadata.cpp revision b2a33b46469a6d2c0e61122002079efb7d6d3f9c
10a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===-- Metadata.cpp - Implement Metadata classes -------------------------===// 20a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// 30a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// The LLVM Compiler Infrastructure 40a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// 50a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// This file is distributed under the University of Illinois Open Source 60a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// License. See LICENSE.TXT for details. 70a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// 80a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===----------------------------------------------------------------------===// 90a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// 100a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// This file implements the Metadata classes. 110a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// 120a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===----------------------------------------------------------------------===// 130a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel 14647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson#include "LLVMContextImpl.h" 150a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel#include "llvm/Metadata.h" 16647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson#include "llvm/LLVMContext.h" 17f457d1316dec017cf204b54524878310c356bf64Devang Patel#include "llvm/Module.h" 18937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel#include "llvm/Instruction.h" 1928bc9d88260a3e153ead4311c9129e3d3ad07736Devang Patel#include "SymbolTableListTraitsImpl.h" 200a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patelusing namespace llvm; 210a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel 220a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===----------------------------------------------------------------------===// 23b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// MetadataBase implementation. 244771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel// 254771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel 264771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel/// resizeOperands - Metadata keeps track of other metadata uses using 274771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel/// OperandList. Resize this list to hold anticipated number of metadata 284771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel/// operands. 294771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patelvoid MetadataBase::resizeOperands(unsigned NumOps) { 304771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel unsigned e = getNumOperands(); 314771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel if (NumOps == 0) { 324771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel NumOps = e*2; 334771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel if (NumOps < 2) NumOps = 2; 344771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel } else if (NumOps > NumOperands) { 354771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel // No resize needed. 364771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel if (ReservedSpace >= NumOps) return; 374771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel } else if (NumOps == NumOperands) { 384771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel if (ReservedSpace == NumOps) return; 394771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel } else { 404771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel return; 414771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel } 424771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel 434771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel ReservedSpace = NumOps; 444771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel Use *OldOps = OperandList; 454771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel Use *NewOps = allocHungoffUses(NumOps); 464771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel std::copy(OldOps, OldOps + e, NewOps); 474771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel OperandList = NewOps; 484771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel if (OldOps) Use::zap(OldOps, OldOps + e, true); 494771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel} 504771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel//===----------------------------------------------------------------------===// 51b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// MDString implementation. 52647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson// 53647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen AndersonMDString *MDString::get(LLVMContext &Context, const StringRef &Str) { 54647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson LLVMContextImpl *pImpl = Context.pImpl; 55647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); 56647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson StringMapEntry<MDString *> &Entry = 57647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson pImpl->MDStringCache.GetOrCreateValue(Str); 58647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson MDString *&S = Entry.getValue(); 59b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner if (S) return S; 60b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner 61b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner return S = new MDString(Context, Entry.getKeyData(), Entry.getKeyLength()); 62647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson} 63647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson 64647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson//===----------------------------------------------------------------------===// 65b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// MDNode implementation. 660a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// 67b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris LattnerMDNode::MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals) 681d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson : MetadataBase(Type::getMetadataTy(C), Value::MDNodeVal) { 694771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel NumOperands = 0; 704771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel resizeOperands(NumVals); 714771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel for (unsigned i = 0; i != NumVals; ++i) { 724771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel // Only record metadata uses. 734771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel if (MetadataBase *MB = dyn_cast_or_null<MetadataBase>(Vals[i])) 744771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel OperandList[NumOperands++] = MB; 7568f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel else if(Vals[i] && 7668f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel Vals[i]->getType()->getTypeID() == Type::MetadataTyID) 7768f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel OperandList[NumOperands++] = Vals[i]; 785f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel Node.push_back(ElementVH(Vals[i], this)); 794771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel } 800a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel} 810a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel 825f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patelvoid MDNode::Profile(FoldingSetNodeID &ID) const { 835f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel for (const_elem_iterator I = elem_begin(), E = elem_end(); I != E; ++I) 845f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel ID.AddPointer(*I); 855f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel} 865f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 87647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen AndersonMDNode *MDNode::get(LLVMContext &Context, Value*const* Vals, unsigned NumVals) { 885f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel LLVMContextImpl *pImpl = Context.pImpl; 895f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel FoldingSetNodeID ID; 905f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel for (unsigned i = 0; i != NumVals; ++i) 915f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel ID.AddPointer(Vals[i]); 925f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 935f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel void *InsertPoint; 94b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner MDNode *N; 95b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner { 96b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner sys::SmartScopedReader<true> Reader(pImpl->ConstantsLock); 97b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); 98b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner } 99b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner if (N) return N; 100740fce30206ad3e1759c71ae04af9a5859857af9Devang Patel 101b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); 102b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); 1035f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel if (!N) { 104b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner // InsertPoint will have been set by the FindNodeOrInsertPos call. 105b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner N = new MDNode(Context, Vals, NumVals); 106b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner pImpl->MDNodeSet.InsertNode(N, InsertPoint); 1075f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel } 1085f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 1095f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel return N; 110647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson} 111647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson 1124771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel/// dropAllReferences - Remove all uses and clear node vector. 1134771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patelvoid MDNode::dropAllReferences() { 1144771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel User::dropAllReferences(); 1154771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel Node.clear(); 1164771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel} 1174771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel 1184771e16fa96f41e62fc54578b6f656a52c23b61cDevang PatelMDNode::~MDNode() { 11988cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel { 12088cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel LLVMContextImpl *pImpl = getType()->getContext().pImpl; 12188cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); 12288cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel pImpl->MDNodeSet.RemoveNode(this); 12388cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel } 1248cf476be5b4be900ae3ae1fa43cff65d005d3d39Devang Patel dropAllReferences(); 1254771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel} 126ab67e705f59d567afded845465f358b8a66ab62eDevang Patel 1275f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel// Replace value from this node's element list. 1285f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patelvoid MDNode::replaceElement(Value *From, Value *To) { 1295f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel if (From == To || !getType()) 1305f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel return; 1315f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel LLVMContext &Context = getType()->getContext(); 1325f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel LLVMContextImpl *pImpl = Context.pImpl; 1335f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 1345f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // Find value. This is a linear search, do something if it consumes 1355f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // lot of time. It is possible that to have multiple instances of 1365f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // From in this MDNode's element list. 1375f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel SmallVector<unsigned, 4> Indexes; 1385f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel unsigned Index = 0; 1395f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel for (SmallVector<ElementVH, 4>::iterator I = Node.begin(), 1405f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel E = Node.end(); I != E; ++I, ++Index) { 1415f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel Value *V = *I; 1425f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel if (V && V == From) 1435f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel Indexes.push_back(Index); 1445f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel } 1455f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 1465f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel if (Indexes.empty()) 1475f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel return; 1485f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 1495f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // Remove "this" from the context map. 1505f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel { 1515f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); 1525f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel pImpl->MDNodeSet.RemoveNode(this); 1535f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel } 1545f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 15568f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel // MDNode only lists metadata elements in operand list, because MDNode 15668f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel // used by MDNode is considered a valid use. However on the side, MDNode 15768f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel // using a non-metadata value is not considered a "use" of non-metadata 15868f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel // value. 15968f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel SmallVector<unsigned, 4> OpIndexes; 16068f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel unsigned OpIndex = 0; 16168f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel for (User::op_iterator OI = op_begin(), OE = op_end(); 16268f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel OI != OE; ++OI, OpIndex++) { 16368f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel if (*OI == From) 16468f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel OpIndexes.push_back(OpIndex); 16568f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel } 16668f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel if (MetadataBase *MDTo = dyn_cast_or_null<MetadataBase>(To)) { 16768f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel for (SmallVector<unsigned, 4>::iterator OI = OpIndexes.begin(), 16868f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel OE = OpIndexes.end(); OI != OE; ++OI) 16968f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel setOperand(*OI, MDTo); 17068f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel } else { 17168f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel for (SmallVector<unsigned, 4>::iterator OI = OpIndexes.begin(), 17268f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel OE = OpIndexes.end(); OI != OE; ++OI) 17368f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel setOperand(*OI, 0); 17468f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel } 17568f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel 1765f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // Replace From element(s) in place. 1775f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel for (SmallVector<unsigned, 4>::iterator I = Indexes.begin(), E = Indexes.end(); 1785f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel I != E; ++I) { 1795f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel unsigned Index = *I; 1805f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel Node[Index] = ElementVH(To, this); 1815f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel } 1825f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 1835f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // Insert updated "this" into the context's folding node set. 1845f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // If a node with same element list already exist then before inserting 1855f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // updated "this" into the folding node set, replace all uses of existing 1865f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // node with updated "this" node. 1875f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel FoldingSetNodeID ID; 1885f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel Profile(ID); 1895f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel pImpl->ConstantsLock.reader_acquire(); 1905f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel void *InsertPoint; 1915f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel MDNode *N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); 1925f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel pImpl->ConstantsLock.reader_release(); 1935f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 1945f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel if (N) { 1955f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel N->replaceAllUsesWith(this); 1965f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel delete N; 1975f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel N = 0; 1985f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel } 1995f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 2005f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel { 2015f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); 2025f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); 2035f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel if (!N) { 2045f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel // InsertPoint will have been set by the FindNodeOrInsertPos call. 2055f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel N = this; 2065f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel pImpl->MDNodeSet.InsertNode(N, InsertPoint); 2075f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel } 2085f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel } 2095f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel} 2105f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel 211f457d1316dec017cf204b54524878310c356bf64Devang Patel//===----------------------------------------------------------------------===// 212b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// NamedMDNode implementation. 213f457d1316dec017cf204b54524878310c356bf64Devang Patel// 2141d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen AndersonNamedMDNode::NamedMDNode(LLVMContext &C, const Twine &N, 215b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner MetadataBase *const *MDs, 2165316bf0252ce9797e90a233645b6580695403837Devang Patel unsigned NumMDs, Module *ParentModule) 2171d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson : MetadataBase(Type::getMetadataTy(C), Value::NamedMDNodeVal), Parent(0) { 21828bc9d88260a3e153ead4311c9129e3d3ad07736Devang Patel setName(N); 2194771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel NumOperands = 0; 2204771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel resizeOperands(NumMDs); 2214771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel 2224771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel for (unsigned i = 0; i != NumMDs; ++i) { 2234771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel if (MDs[i]) 2244771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel OperandList[NumOperands++] = MDs[i]; 225f457d1316dec017cf204b54524878310c356bf64Devang Patel Node.push_back(WeakMetadataVH(MDs[i])); 2264771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel } 2275316bf0252ce9797e90a233645b6580695403837Devang Patel if (ParentModule) 2285316bf0252ce9797e90a233645b6580695403837Devang Patel ParentModule->getNamedMDList().push_back(this); 229f457d1316dec017cf204b54524878310c356bf64Devang Patel} 230a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel 231ab67e705f59d567afded845465f358b8a66ab62eDevang PatelNamedMDNode *NamedMDNode::Create(const NamedMDNode *NMD, Module *M) { 232b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner assert(NMD && "Invalid source NamedMDNode!"); 233ab67e705f59d567afded845465f358b8a66ab62eDevang Patel SmallVector<MetadataBase *, 4> Elems; 234ab67e705f59d567afded845465f358b8a66ab62eDevang Patel for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i) 235ab67e705f59d567afded845465f358b8a66ab62eDevang Patel Elems.push_back(NMD->getElement(i)); 2361d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson return new NamedMDNode(NMD->getContext(), NMD->getName().data(), 2371d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Elems.data(), Elems.size(), M); 238ab67e705f59d567afded845465f358b8a66ab62eDevang Patel} 239ab67e705f59d567afded845465f358b8a66ab62eDevang Patel 240a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel/// eraseFromParent - Drop all references and remove the node from parent 241a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel/// module. 242a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patelvoid NamedMDNode::eraseFromParent() { 243a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel getParent()->getNamedMDList().erase(this); 244a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel} 245a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel 246a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel/// dropAllReferences - Remove all uses and clear node vector. 247a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patelvoid NamedMDNode::dropAllReferences() { 2484771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel User::dropAllReferences(); 249a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel Node.clear(); 250a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel} 251a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel 252a82f8838c60b7a3b240e185983dacb3291396f3eDevang PatelNamedMDNode::~NamedMDNode() { 253a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel dropAllReferences(); 254a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel} 255937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel 256937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel//===----------------------------------------------------------------------===// 257b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// MetadataContext implementation. 258937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel// 259937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel 260937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// RegisterMDKind - Register a new metadata kind and return its ID. 261937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// A metadata kind can be registered only once. 262e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang Patelunsigned MetadataContext::RegisterMDKind(const char *Name) { 263b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner assert(validName(Name) && "Invalid custome metadata name!"); 264a2148402ce39fb3aad09e98a32078d3853a01ae9Devang Patel unsigned Count = MDHandlerNames.size(); 26511716d766b283815ac024a51ad75c1d6342cc0d4Devang Patel assert(MDHandlerNames.find(Name) == MDHandlerNames.end() 26611716d766b283815ac024a51ad75c1d6342cc0d4Devang Patel && "Already registered MDKind!"); 267937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel MDHandlerNames[Name] = Count + 1; 268937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel return Count + 1; 269937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel} 270937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel 2710475c9170e9621292a48c688c3976031be5650bbDevang Patel/// validName - Return true if Name is a valid custom metadata handler name. 2720475c9170e9621292a48c688c3976031be5650bbDevang Patelbool MetadataContext::validName(const char *Name) { 2730475c9170e9621292a48c688c3976031be5650bbDevang Patel if (!Name) 2740475c9170e9621292a48c688c3976031be5650bbDevang Patel return false; 2750475c9170e9621292a48c688c3976031be5650bbDevang Patel 2760475c9170e9621292a48c688c3976031be5650bbDevang Patel if (!isalpha(*Name)) 2770475c9170e9621292a48c688c3976031be5650bbDevang Patel return false; 2780475c9170e9621292a48c688c3976031be5650bbDevang Patel 2790475c9170e9621292a48c688c3976031be5650bbDevang Patel unsigned Length = strlen(Name); 2800475c9170e9621292a48c688c3976031be5650bbDevang Patel unsigned Count = 1; 2810475c9170e9621292a48c688c3976031be5650bbDevang Patel ++Name; 2820475c9170e9621292a48c688c3976031be5650bbDevang Patel while (Name && 2830475c9170e9621292a48c688c3976031be5650bbDevang Patel (isalnum(*Name) || *Name == '_' || *Name == '-' || *Name == '.')) { 2840475c9170e9621292a48c688c3976031be5650bbDevang Patel ++Name; 2850475c9170e9621292a48c688c3976031be5650bbDevang Patel ++Count; 2860475c9170e9621292a48c688c3976031be5650bbDevang Patel } 2870475c9170e9621292a48c688c3976031be5650bbDevang Patel if (Length != Count) 2880475c9170e9621292a48c688c3976031be5650bbDevang Patel return false; 2890475c9170e9621292a48c688c3976031be5650bbDevang Patel return true; 2900475c9170e9621292a48c688c3976031be5650bbDevang Patel} 2910475c9170e9621292a48c688c3976031be5650bbDevang Patel 292937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// getMDKind - Return metadata kind. If the requested metadata kind 293937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// is not registered then return 0. 294e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang Patelunsigned MetadataContext::getMDKind(const char *Name) { 295b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner assert(validName(Name) && "Invalid custome metadata name!"); 296937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel StringMap<unsigned>::iterator I = MDHandlerNames.find(Name); 297937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel if (I == MDHandlerNames.end()) 298937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel return 0; 299937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel 300937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel return I->getValue(); 301937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel} 302937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel 30358a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel/// addMD - Attach the metadata of given kind with an Instruction. 30458a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patelvoid MetadataContext::addMD(unsigned MDKind, MDNode *Node, Instruction *Inst) { 305b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner assert(Node && "Invalid null MDNode"); 306937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel Inst->HasMetadata = true; 30758a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel MDStoreTy::iterator I = MetadataStore.find(Inst); 308937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel if (I == MetadataStore.end()) { 309937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel MDMapTy Info; 310937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel Info.push_back(std::make_pair(MDKind, Node)); 311937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel MetadataStore.insert(std::make_pair(Inst, Info)); 312937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel return; 313937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel } 31458a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel 315937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel MDMapTy &Info = I->second; 31658a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel // If there is an entry for this MDKind then replace it. 31758a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel for (unsigned i = 0, e = Info.size(); i != e; ++i) { 31858a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel MDPairTy &P = Info[i]; 31958a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel if (P.first == MDKind) { 32058a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel Info[i] = std::make_pair(MDKind, Node); 32158a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel return; 32258a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel } 32358a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel } 32458a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel 32558a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel // Otherwise add a new entry. 326937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel Info.push_back(std::make_pair(MDKind, Node)); 327937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel return; 328937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel} 329937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel 33074da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel/// removeMD - Remove metadata of given kind attached with an instuction. 33174da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patelvoid MetadataContext::removeMD(unsigned Kind, Instruction *Inst) { 33274da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel MDStoreTy::iterator I = MetadataStore.find(Inst); 33374da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel if (I == MetadataStore.end()) 33474da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel return; 33574da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel 33674da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel MDMapTy &Info = I->second; 33774da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel for (MDMapTy::iterator MI = Info.begin(), ME = Info.end(); MI != ME; ++MI) { 33874da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel MDPairTy &P = *MI; 33974da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel if (P.first == Kind) { 34074da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel Info.erase(MI); 34174da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel return; 34274da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel } 34374da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel } 34474da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel 34574da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel return; 34674da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel} 34774da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel 34874da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel/// removeMDs - Remove all metadata attached with an instruction. 34974da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patelvoid MetadataContext::removeMDs(const Instruction *Inst) { 35074da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel // Find Metadata handles for this instruction. 35174da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel MDStoreTy::iterator I = MetadataStore.find(Inst); 352b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner assert(I != MetadataStore.end() && "Invalid custom metadata info!"); 35374da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel MDMapTy &Info = I->second; 35474da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel 35574da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel // FIXME : Give all metadata handlers a chance to adjust. 35674da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel 35774da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel // Remove the entries for this instruction. 35874da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel Info.clear(); 35974da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel MetadataStore.erase(I); 36074da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel} 36174da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel 3625db2c52270e70271ace8b4f0c2942823be702132Devang Patel/// copyMD - If metadata is attached with Instruction In1 then attach 3635db2c52270e70271ace8b4f0c2942823be702132Devang Patel/// the same metadata to In2. 3645db2c52270e70271ace8b4f0c2942823be702132Devang Patelvoid MetadataContext::copyMD(Instruction *In1, Instruction *In2) { 365b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner assert(In1 && In2 && "Invalid instruction!"); 3665db2c52270e70271ace8b4f0c2942823be702132Devang Patel MDStoreTy::iterator I = MetadataStore.find(In1); 3675db2c52270e70271ace8b4f0c2942823be702132Devang Patel if (I == MetadataStore.end()) 3685db2c52270e70271ace8b4f0c2942823be702132Devang Patel return; 3695db2c52270e70271ace8b4f0c2942823be702132Devang Patel 3705db2c52270e70271ace8b4f0c2942823be702132Devang Patel MDMapTy &In1Info = I->second; 3715db2c52270e70271ace8b4f0c2942823be702132Devang Patel MDMapTy In2Info; 3725db2c52270e70271ace8b4f0c2942823be702132Devang Patel for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I) 3735db2c52270e70271ace8b4f0c2942823be702132Devang Patel if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second)) 3745db2c52270e70271ace8b4f0c2942823be702132Devang Patel addMD(I->first, MD, In2); 3755db2c52270e70271ace8b4f0c2942823be702132Devang Patel} 37674da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel 377937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// getMD - Get the metadata of given kind attached with an Instruction. 378937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// If the metadata is not found then return 0. 379e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang PatelMDNode *MetadataContext::getMD(unsigned MDKind, const Instruction *Inst) { 380937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel MDStoreTy::iterator I = MetadataStore.find(Inst); 381937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel if (I == MetadataStore.end()) 38258a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel return NULL; 383937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel 384937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel MDMapTy &Info = I->second; 385937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel for (MDMapTy::iterator I = Info.begin(), E = Info.end(); I != E; ++I) 386937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel if (I->first == MDKind) 38758a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel return dyn_cast_or_null<MDNode>(I->second); 38858a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel return NULL; 389937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel} 390937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel 39143215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel/// getMDs - Get the metadata attached with an Instruction. 392b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattnerconst MetadataContext::MDMapTy * 393b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris LattnerMetadataContext::getMDs(const Instruction *Inst) { 39443215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel MDStoreTy::iterator I = MetadataStore.find(Inst); 39543215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel if (I == MetadataStore.end()) 39643215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel return NULL; 39743215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel 398b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner return &I->second; 39943215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel} 40043215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel 401e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel/// getHandlerNames - Get handler names. This is used by bitcode 402e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel/// writer. 403e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang Patelconst StringMap<unsigned> *MetadataContext::getHandlerNames() { 404e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel return &MDHandlerNames; 405e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel} 406e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel 4076c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel/// ValueIsCloned - This handler is used to update metadata store 4086c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel/// when In1 is cloned to create In2. 409e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang Patelvoid MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) { 4106c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel // Find Metadata handles for In1. 4116c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel MDStoreTy::iterator I = MetadataStore.find(In1); 412b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner assert(I != MetadataStore.end() && "Invalid custom metadata info!"); 4136c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel 4146c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel // FIXME : Give all metadata handlers a chance to adjust. 4156c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel 4166c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel MDMapTy &In1Info = I->second; 4176c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel MDMapTy In2Info; 4186c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I) 4196c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second)) 42058a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel addMD(I->first, MD, In2); 4216c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel} 422740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel 423740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel/// ValueIsRAUWd - This handler is used when V1's all uses are replaced by 424740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel/// V2. 425740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patelvoid MetadataContext::ValueIsRAUWd(Value *V1, Value *V2) { 426740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel Instruction *I1 = dyn_cast<Instruction>(V1); 427740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel Instruction *I2 = dyn_cast<Instruction>(V2); 428740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel if (!I1 || !I2) 429740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel return; 430740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel 431740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel // FIXME : Give custom handlers a chance to override this. 432740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel ValueIsCloned(I1, I2); 433740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel} 4345db2c52270e70271ace8b4f0c2942823be702132Devang Patel 435