Value.cpp revision 6e0d1cb30957a636c53158d3089e6fb88348a57a
1009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===-- Value.cpp - Implement the Value class -----------------------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 10722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner// This file implements the Value, ValueHandle, and User classes. 11009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 13009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 140d1e40728d668085257b78657b381e1f13d77d52Chris Lattner#include "llvm/Constant.h" 15b04adddd50dfa4c3fbdad3b15d601402254c1ff5Anton Korobeynikov#include "llvm/Constants.h" 160d1e40728d668085257b78657b381e1f13d77d52Chris Lattner#include "llvm/DerivedTypes.h" 17009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/InstrTypes.h" 18bb4f8d40458eb086cb901e19c4be0777e2a73dceDevang Patel#include "llvm/Instructions.h" 193a7a68c10880c2a28387617b42d14d774e218727Dan Gohman#include "llvm/Operator.h" 200d1e40728d668085257b78657b381e1f13d77d52Chris Lattner#include "llvm/Module.h" 21e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel#include "llvm/MDNode.h" 22ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer#include "llvm/ValueSymbolTable.h" 236e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbar#include "llvm/ADT/SmallString.h" 242e3def1177c462e14b20ddad71adf5c6b7c3e867Bill Wendling#include "llvm/Support/Debug.h" 25ab7c09b6b6f4516a631fd6788918c237c83939afTorok Edwin#include "llvm/Support/ErrorHandling.h" 26551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h" 27722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner#include "llvm/Support/ManagedStatic.h" 28722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner#include "llvm/Support/ValueHandle.h" 29dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/raw_ostream.h" 30f2aac28d3040f9c716b4597ec90d237f27883866Owen Anderson#include "llvm/System/RWMutex.h" 31e3cd5ca7e79f4359e8a101c211fc9c117eb62347Owen Anderson#include "llvm/System/Threading.h" 32722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner#include "llvm/ADT/DenseMap.h" 33009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include <algorithm> 3431f8499e83dc4dccbb57ea7e76d1fd49b7010d0cChris Lattnerusing namespace llvm; 35d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 36009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 37009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// Value Class 38009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 39009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 4082d18aa0e42a4858c2cb7c15934cc3e567432490Chris Lattnerstatic inline const Type *checkType(const Type *Ty) { 4182d18aa0e42a4858c2cb7c15934cc3e567432490Chris Lattner assert(Ty && "Value defined with a null type: Error!"); 4282d18aa0e42a4858c2cb7c15934cc3e567432490Chris Lattner return Ty; 4382d18aa0e42a4858c2cb7c15934cc3e567432490Chris Lattner} 4482d18aa0e42a4858c2cb7c15934cc3e567432490Chris Lattner 45dec628eead87b20773c98a00830580df211acc98Chris LattnerValue::Value(const Type *ty, unsigned scid) 469491c16e14f9fb56d5d71cd855c2d8c315fbb5aeDan Gohman : SubclassID(scid), HasValueHandle(0), SubclassOptionalData(0), 479491c16e14f9fb56d5d71cd855c2d8c315fbb5aeDan Gohman SubclassData(0), VTy(checkType(ty)), 486f4266506bca785828bacda55bd5db9172f990c6Gabor Greif UseList(0), Name(0) { 49db71d63467bdb7b629641fee3272b47bd028e09fDevang Patel if (isa<CallInst>(this) || isa<InvokeInst>(this)) 501bf9a18834b338484c0a494110cff9cc407be381Evan Cheng assert((VTy->isFirstClassType() || VTy == Type::VoidTy || 511bf9a18834b338484c0a494110cff9cc407be381Evan Cheng isa<OpaqueType>(ty) || VTy->getTypeID() == Type::StructTyID) && 52bb4f8d40458eb086cb901e19c4be0777e2a73dceDevang Patel "invalid CallInst type!"); 53bb4f8d40458eb086cb901e19c4be0777e2a73dceDevang Patel else if (!isa<Constant>(this) && !isa<BasicBlock>(this)) 541bf9a18834b338484c0a494110cff9cc407be381Evan Cheng assert((VTy->isFirstClassType() || VTy == Type::VoidTy || 555c45e6db391bb2dfe361236403c4979f421c726cChris Lattner isa<OpaqueType>(ty)) && 56a9e7781b3b8e457946491529816feab73c66d774Chris Lattner "Cannot create non-first-class values except for constants!"); 57009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 58009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 59afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon HenriksenValue::~Value() { 60722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Notify all ValueHandles (if present) that this value is going away. 61722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner if (HasValueHandle) 62722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase::ValueIsDeleted(this); 63722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 64009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#ifndef NDEBUG // Only in -g mode... 65ee976f33713016a96e3fbb394b7d0c5465be25d7Chris Lattner // Check to make sure that there are no uses of this value that are still 66ee976f33713016a96e3fbb394b7d0c5465be25d7Chris Lattner // around when the value is destroyed. If there are, then we have a dangling 67ee976f33713016a96e3fbb394b7d0c5465be25d7Chris Lattner // reference and something is wrong. This code is here to print out what is 68fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman // still being referenced. The value in question should be printed as 69ee976f33713016a96e3fbb394b7d0c5465be25d7Chris Lattner // a <badref> 70ee976f33713016a96e3fbb394b7d0c5465be25d7Chris Lattner // 71afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen if (!use_empty()) { 72b95c2fd2700a92a7b857ebd1ecf6c7d561d676d2Daniel Dunbar errs() << "While deleting: " << *VTy << " %" << getNameStr() << "\n"; 73afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen for (use_iterator I = use_begin(), E = use_end(); I != E; ++I) 74b95c2fd2700a92a7b857ebd1ecf6c7d561d676d2Daniel Dunbar errs() << "Use still stuck around after Def is destroyed:" 752e3def1177c462e14b20ddad71adf5c6b7c3e867Bill Wendling << **I << "\n"; 76009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 77009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#endif 78afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen assert(use_empty() && "Uses remain when a value is destroyed!"); 79d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner 8091857da2f53d9abc620cf944465d2899c517a5b5Chris Lattner // If this value is named, destroy the name. This should not be in a symtab 8191857da2f53d9abc620cf944465d2899c517a5b5Chris Lattner // at this point. 82afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen if (Name) 83afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen Name->Destroy(); 8491857da2f53d9abc620cf944465d2899c517a5b5Chris Lattner 85d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner // There should be no uses of this object anymore, remove it. 86afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen LeakDetector::removeGarbageObject(this); 87009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 88009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 8929d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner/// hasNUses - Return true if this Value has exactly N users. 9029d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner/// 9129d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattnerbool Value::hasNUses(unsigned N) const { 9229d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner use_const_iterator UI = use_begin(), E = use_end(); 9329d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner 9429d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner for (; N; --N, ++UI) 9529d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner if (UI == E) return false; // Too few. 9629d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner return UI == E; 9729d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner} 9829d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner 998daf056c90c2590709090b0c27045e1a45803461Chris Lattner/// hasNUsesOrMore - Return true if this value has N users or more. This is 1008daf056c90c2590709090b0c27045e1a45803461Chris Lattner/// logically equivalent to getNumUses() >= N. 1018daf056c90c2590709090b0c27045e1a45803461Chris Lattner/// 1028daf056c90c2590709090b0c27045e1a45803461Chris Lattnerbool Value::hasNUsesOrMore(unsigned N) const { 1038daf056c90c2590709090b0c27045e1a45803461Chris Lattner use_const_iterator UI = use_begin(), E = use_end(); 1048daf056c90c2590709090b0c27045e1a45803461Chris Lattner 1058daf056c90c2590709090b0c27045e1a45803461Chris Lattner for (; N; --N, ++UI) 1068daf056c90c2590709090b0c27045e1a45803461Chris Lattner if (UI == E) return false; // Too few. 1078daf056c90c2590709090b0c27045e1a45803461Chris Lattner 1088daf056c90c2590709090b0c27045e1a45803461Chris Lattner return true; 1098daf056c90c2590709090b0c27045e1a45803461Chris Lattner} 1108daf056c90c2590709090b0c27045e1a45803461Chris Lattner 111502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng/// isUsedInBasicBlock - Return true if this value is used in the specified 112502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng/// basic block. 113c4f72dd6e759a170808ecfc6be784f8598367484Bill Wendlingbool Value::isUsedInBasicBlock(const BasicBlock *BB) const { 114502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng for (use_const_iterator I = use_begin(), E = use_end(); I != E; ++I) { 115502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng const Instruction *User = dyn_cast<Instruction>(*I); 116502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng if (User && User->getParent() == BB) 117502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng return true; 118502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng } 119502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng return false; 120502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng} 121502a4f5162498ec420e3cb22f667808d726dd7daEvan Cheng 1228daf056c90c2590709090b0c27045e1a45803461Chris Lattner 12329d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner/// getNumUses - This method computes the number of uses of this Value. This 12429d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner/// is a linear time operation. Use hasOneUse or hasNUses to check for specific 12529d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner/// values. 12629d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattnerunsigned Value::getNumUses() const { 12729d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner return (unsigned)std::distance(use_begin(), use_end()); 12829d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner} 12929d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner 1307216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattnerstatic bool getSymTab(Value *V, ValueSymbolTable *&ST) { 131ea7acb859111a7f55c497e0b7cf569ac81e97208Chris Lattner ST = 0; 1327216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner if (Instruction *I = dyn_cast<Instruction>(V)) { 1330d1e40728d668085257b78657b381e1f13d77d52Chris Lattner if (BasicBlock *P = I->getParent()) 1340d1e40728d668085257b78657b381e1f13d77d52Chris Lattner if (Function *PP = P->getParent()) 13578d033e086e19e016273de014f9214aa6f3f844bReid Spencer ST = &PP->getValueSymbolTable(); 1367216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner } else if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) { 137ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer if (Function *P = BB->getParent()) 138ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer ST = &P->getValueSymbolTable(); 1397216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) { 140ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer if (Module *P = GV->getParent()) 141ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer ST = &P->getValueSymbolTable(); 1427216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner } else if (Argument *A = dyn_cast<Argument>(V)) { 143ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer if (Function *P = A->getParent()) 144ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer ST = &P->getValueSymbolTable(); 145e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel } else if (isa<MDString>(V)) 146e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel return true; 147e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel else { 1487216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner assert(isa<Constant>(V) && "Unknown value type!"); 1497216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner return true; // no name is setable for this. 1500d1e40728d668085257b78657b381e1f13d77d52Chris Lattner } 1517216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner return false; 1527216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner} 1537216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner 15471996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner/// getNameStart - Return a pointer to a null terminated string for this name. 15571996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner/// Note that names can have null characters within the string as well as at 15671996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner/// their end. This always returns a non-null pointer. 15771996e73d8050d2b8805b14a48ab635155b11a12Chris Lattnerconst char *Value::getNameStart() const { 15871996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner if (Name == 0) return ""; 15971996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner return Name->getKeyData(); 16071996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner} 16171996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner 16271996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner/// getNameLen - Return the length of the string, correctly handling nul 16371996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner/// characters embedded into them. 16471996e73d8050d2b8805b14a48ab635155b11a12Chris Lattnerunsigned Value::getNameLen() const { 165d7c4ca100932089aeee4a2596715b22fef95194fChris Lattner return Name ? Name->getKeyLength() : 0; 16671996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner} 16771996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner 16812e6d200597bb5d61ed56ccf9d70a52614956a70Chris Lattner/// isName - Return true if this value has the name specified by the provided 16912e6d200597bb5d61ed56ccf9d70a52614956a70Chris Lattner/// nul terminated string. 17012e6d200597bb5d61ed56ccf9d70a52614956a70Chris Lattnerbool Value::isName(const char *N) const { 17112e6d200597bb5d61ed56ccf9d70a52614956a70Chris Lattner unsigned InLen = strlen(N); 1725c5f1095ec4587865fc2b25534fcd1ed14ad8b82Chris Lattner return InLen == getNameLen() && memcmp(getNameStart(), N, InLen) == 0; 17312e6d200597bb5d61ed56ccf9d70a52614956a70Chris Lattner} 17412e6d200597bb5d61ed56ccf9d70a52614956a70Chris Lattner 17571996e73d8050d2b8805b14a48ab635155b11a12Chris Lattner 176924b1ca9ee02b648149d76b62e30f5d9c0ebbf27Chris Lattnerstd::string Value::getNameStr() const { 177dec628eead87b20773c98a00830580df211acc98Chris Lattner if (Name == 0) return ""; 178dec628eead87b20773c98a00830580df211acc98Chris Lattner return std::string(Name->getKeyData(), 179dec628eead87b20773c98a00830580df211acc98Chris Lattner Name->getKeyData()+Name->getKeyLength()); 180dec628eead87b20773c98a00830580df211acc98Chris Lattner} 1817216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner 182e6c42dd6d3cc1e0a8a11224a11bcfbd8c60c6fffDaniel DunbarStringRef Value::getNameRef() const { 183e6c42dd6d3cc1e0a8a11224a11bcfbd8c60c6fffDaniel Dunbar if (Name == 0) return StringRef(); 184e6c42dd6d3cc1e0a8a11224a11bcfbd8c60c6fffDaniel Dunbar return StringRef(Name->getKeyData(), Name->getKeyLength()); 185e6c42dd6d3cc1e0a8a11224a11bcfbd8c60c6fffDaniel Dunbar} 186e6c42dd6d3cc1e0a8a11224a11bcfbd8c60c6fffDaniel Dunbar 1876e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbarvoid Value::setName(const Twine &Name) { 1886e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbar SmallString<32> NameData; 1896e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbar Name.toVector(NameData); 1906e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbar setName(NameData.begin(), NameData.size()); 191042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner} 192042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner 193ec79b3da13ae9ba09f52e177bd71fcc5669d61a5Chris Lattnervoid Value::setName(const char *Name) { 194ec79b3da13ae9ba09f52e177bd71fcc5669d61a5Chris Lattner setName(Name, Name ? strlen(Name) : 0); 195ec79b3da13ae9ba09f52e177bd71fcc5669d61a5Chris Lattner} 196ec79b3da13ae9ba09f52e177bd71fcc5669d61a5Chris Lattner 197042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattnervoid Value::setName(const char *NameStr, unsigned NameLen) { 198042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner if (NameLen == 0 && !hasName()) return; 199ca5183d445954a9b2a570d6bbba1bc2b00ad6442Jeff Cohen assert(getType() != Type::VoidTy && "Cannot assign a name to void values!"); 200dec628eead87b20773c98a00830580df211acc98Chris Lattner 2017216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner // Get the symbol table to update for this object. 2027216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner ValueSymbolTable *ST; 2037216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner if (getSymTab(this, ST)) 2047216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner return; // Cannot set a name on this value (e.g. constant). 2050d1e40728d668085257b78657b381e1f13d77d52Chris Lattner 206dec628eead87b20773c98a00830580df211acc98Chris Lattner if (!ST) { // No symbol table to update? Just do the change. 207042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner if (NameLen == 0) { 208dec628eead87b20773c98a00830580df211acc98Chris Lattner // Free the name for this value. 209dec628eead87b20773c98a00830580df211acc98Chris Lattner Name->Destroy(); 210dec628eead87b20773c98a00830580df211acc98Chris Lattner Name = 0; 211042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner return; 21204cb800c324ef661017aff474e266ed7f2cddb90Chris Lattner } 213042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner 214042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner if (Name) { 215042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner // Name isn't changing? 216042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner if (NameLen == Name->getKeyLength() && 217042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner !memcmp(Name->getKeyData(), NameStr, NameLen)) 218042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner return; 219042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner Name->Destroy(); 220042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner } 221042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner 222042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner // NOTE: Could optimize for the case the name is shrinking to not deallocate 223042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner // then reallocated. 224042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner 225042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner // Create the new name. 226042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner Name = ValueName::Create(NameStr, NameStr+NameLen); 227042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner Name->setValue(this); 228dec628eead87b20773c98a00830580df211acc98Chris Lattner return; 229dec628eead87b20773c98a00830580df211acc98Chris Lattner } 230dec628eead87b20773c98a00830580df211acc98Chris Lattner 231dec628eead87b20773c98a00830580df211acc98Chris Lattner // NOTE: Could optimize for the case the name is shrinking to not deallocate 232dec628eead87b20773c98a00830580df211acc98Chris Lattner // then reallocated. 233dec628eead87b20773c98a00830580df211acc98Chris Lattner if (hasName()) { 234dec628eead87b20773c98a00830580df211acc98Chris Lattner // Name isn't changing? 235042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner if (NameLen == Name->getKeyLength() && 236042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner !memcmp(Name->getKeyData(), NameStr, NameLen)) 237dec628eead87b20773c98a00830580df211acc98Chris Lattner return; 238dec628eead87b20773c98a00830580df211acc98Chris Lattner 239dec628eead87b20773c98a00830580df211acc98Chris Lattner // Remove old name. 240dec628eead87b20773c98a00830580df211acc98Chris Lattner ST->removeValueName(Name); 241dec628eead87b20773c98a00830580df211acc98Chris Lattner Name->Destroy(); 242dec628eead87b20773c98a00830580df211acc98Chris Lattner Name = 0; 243dec628eead87b20773c98a00830580df211acc98Chris Lattner 244042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner if (NameLen == 0) 245042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner return; 24604cb800c324ef661017aff474e266ed7f2cddb90Chris Lattner } 247dec628eead87b20773c98a00830580df211acc98Chris Lattner 248dec628eead87b20773c98a00830580df211acc98Chris Lattner // Name is changing to something new. 249e6c42dd6d3cc1e0a8a11224a11bcfbd8c60c6fffDaniel Dunbar Name = ST->createValueName(StringRef(NameStr, NameLen), this); 2500d1e40728d668085257b78657b381e1f13d77d52Chris Lattner} 2510d1e40728d668085257b78657b381e1f13d77d52Chris Lattner 252042ad36871d67a2db48bf41a8dbde3a5676fc96fChris Lattner 2537216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner/// takeName - transfer the name from V to this value, setting V's name to 2547216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner/// empty. It is an error to call V->takeName(V). 2557216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattnervoid Value::takeName(Value *V) { 2560878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner ValueSymbolTable *ST = 0; 2570878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // If this value has a name, drop it. 2580878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (hasName()) { 2590878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // Get the symtab this is in. 2600878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (getSymTab(this, ST)) { 2610878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // We can't set a name on this value, but we need to clear V's name if 2620878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // it has one. 2630878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (V->hasName()) V->setName(0, 0); 2640878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner return; // Cannot set a name on this value (e.g. constant). 2650878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner } 2660878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner 2670878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // Remove old name. 2680878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (ST) 2690878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner ST->removeValueName(Name); 2700878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner Name->Destroy(); 2710878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner Name = 0; 2720878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner } 2730878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner 2740878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // Now we know that this has no name. 2750878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner 2760878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // If V has no name either, we're done. 2770878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (!V->hasName()) return; 2780878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner 2790878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // Get this's symtab if we didn't before. 2800878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (!ST) { 2810878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (getSymTab(this, ST)) { 2820878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // Clear V's name. 2830878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner V->setName(0, 0); 2840878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner return; // Cannot set a name on this value (e.g. constant). 2850878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner } 2860878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner } 2870878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner 2880878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // Get V's ST, this should always succed, because V has a name. 2890878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner ValueSymbolTable *VST; 2900878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner bool Failure = getSymTab(V, VST); 291a1aabe422f139daebf9cada3d45a611687465ac5Chris Lattner assert(!Failure && "V has a name, so it should have a ST!"); Failure=Failure; 2920878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner 2930878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // If these values are both in the same symtab, we can do this very fast. 2940878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // This works even if both values have no symtab yet. 2950878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (ST == VST) { 2960878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // Take the name! 2970878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner Name = V->Name; 2980878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner V->Name = 0; 2990878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner Name->setValue(this); 300f41916e75dc9c622fa81b91eb6a5e0a36fa13754Chris Lattner return; 301f41916e75dc9c622fa81b91eb6a5e0a36fa13754Chris Lattner } 302f41916e75dc9c622fa81b91eb6a5e0a36fa13754Chris Lattner 3030878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // Otherwise, things are slightly more complex. Remove V's name from VST and 3040878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner // then reinsert it into ST. 3050878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner 3060878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (VST) 3070878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner VST->removeValueName(V->Name); 3080878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner Name = V->Name; 3090878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner V->Name = 0; 3100878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner Name->setValue(this); 3110878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner 3120878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner if (ST) 3130878c310596d564e75657bf3c771431b4ef7eea5Chris Lattner ST->reinsertValue(this); 3147216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner} 3157216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner 3167216811ea22d68cbf8df092cda8e64e13e394ac8Chris Lattner 3172bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner// uncheckedReplaceAllUsesWith - This is exactly the same as replaceAllUsesWith, 3182bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner// except that it doesn't have all of the asserts. The asserts fail because we 3192bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner// are half-way done resolving types, which causes some types to exist as two 3202bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner// different Type*'s at the same time. This is a sledgehammer to work around 3212bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner// this problem. 3222bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner// 3232bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattnervoid Value::uncheckedReplaceAllUsesWith(Value *New) { 324722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Notify all ValueHandles (if present) that this value is going away. 325722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner if (HasValueHandle) 326722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase::ValueIsRAUWd(this, New); 327722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 32829d1ca6c424df225b9fd48473f0d6419fdd44bd7Chris Lattner while (!use_empty()) { 3296f4266506bca785828bacda55bd5db9172f990c6Gabor Greif Use &U = *UseList; 3302bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner // Must handle Constants specially, we cannot call replaceUsesOfWith on a 3312d691333acec66118ede55b6d7ec7a3083bc1e01Chris Lattner // constant because they are uniqued. 332c3cc71abbcac9a5d172e64002e2262c8f1a41967Chris Lattner if (Constant *C = dyn_cast<Constant>(U.getUser())) { 3332d691333acec66118ede55b6d7ec7a3083bc1e01Chris Lattner if (!isa<GlobalValue>(C)) { 334d0ff1adbdb4b7b565b7f8f191aac0731e80aa1efChris Lattner C->replaceUsesOfWithOnConstant(this, New, &U); 3352d691333acec66118ede55b6d7ec7a3083bc1e01Chris Lattner continue; 3362d691333acec66118ede55b6d7ec7a3083bc1e01Chris Lattner } 3372bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner } 3382d691333acec66118ede55b6d7ec7a3083bc1e01Chris Lattner 3392d691333acec66118ede55b6d7ec7a3083bc1e01Chris Lattner U.set(New); 3402bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner } 3412bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner} 3422bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner 343c3cc71abbcac9a5d172e64002e2262c8f1a41967Chris Lattnervoid Value::replaceAllUsesWith(Value *New) { 344c3cc71abbcac9a5d172e64002e2262c8f1a41967Chris Lattner assert(New && "Value::replaceAllUsesWith(<null>) is invalid!"); 345c3cc71abbcac9a5d172e64002e2262c8f1a41967Chris Lattner assert(New != this && "this->replaceAllUsesWith(this) is NOT valid!"); 346c3cc71abbcac9a5d172e64002e2262c8f1a41967Chris Lattner assert(New->getType() == getType() && 347c3cc71abbcac9a5d172e64002e2262c8f1a41967Chris Lattner "replaceAllUses of value with new value of different type!"); 3482bc065b63a8377456ddbe149621b3daf15f052a4Chris Lattner 349c3cc71abbcac9a5d172e64002e2262c8f1a41967Chris Lattner uncheckedReplaceAllUsesWith(New); 350009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 351009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 3520b12ecf6ff6b5d3a144178257b6206f0c4788792Anton KorobeynikovValue *Value::stripPointerCasts() { 3535d0392c6b370758750b397e254a6c6f028479969Duncan Sands if (!isa<PointerType>(getType())) 3545d0392c6b370758750b397e254a6c6f028479969Duncan Sands return this; 355f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands Value *V = this; 356f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands do { 357016de81177ec5c950f1668be4a48992bc1ee0d75Dan Gohman if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) { 358f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands if (!GEP->hasAllZeroIndices()) 359f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands return V; 360016de81177ec5c950f1668be4a48992bc1ee0d75Dan Gohman V = GEP->getPointerOperand(); 361016de81177ec5c950f1668be4a48992bc1ee0d75Dan Gohman } else if (Operator::getOpcode(V) == Instruction::BitCast) { 362016de81177ec5c950f1668be4a48992bc1ee0d75Dan Gohman V = cast<Operator>(V)->getOperand(0); 363f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands } else { 364f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands return V; 3650b12ecf6ff6b5d3a144178257b6206f0c4788792Anton Korobeynikov } 366f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands assert(isa<PointerType>(V->getType()) && "Unexpected operand type!"); 367f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands } while (1); 3680b12ecf6ff6b5d3a144178257b6206f0c4788792Anton Korobeynikov} 3690b12ecf6ff6b5d3a144178257b6206f0c4788792Anton Korobeynikov 3705d0392c6b370758750b397e254a6c6f028479969Duncan SandsValue *Value::getUnderlyingObject() { 3715d0392c6b370758750b397e254a6c6f028479969Duncan Sands if (!isa<PointerType>(getType())) 3725d0392c6b370758750b397e254a6c6f028479969Duncan Sands return this; 373f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands Value *V = this; 374300e36503ca6f0599d64d0e5d4705a1030dac6a1Nick Lewycky unsigned MaxLookup = 6; 375f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands do { 376016de81177ec5c950f1668be4a48992bc1ee0d75Dan Gohman if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) { 377016de81177ec5c950f1668be4a48992bc1ee0d75Dan Gohman V = GEP->getPointerOperand(); 378016de81177ec5c950f1668be4a48992bc1ee0d75Dan Gohman } else if (Operator::getOpcode(V) == Instruction::BitCast) { 379016de81177ec5c950f1668be4a48992bc1ee0d75Dan Gohman V = cast<Operator>(V)->getOperand(0); 380f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands } else { 381f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands return V; 382f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands } 383f08bf1193c390bfe4b25d8533f146742d0277d06Duncan Sands assert(isa<PointerType>(V->getType()) && "Unexpected operand type!"); 384300e36503ca6f0599d64d0e5d4705a1030dac6a1Nick Lewycky } while (--MaxLookup); 385300e36503ca6f0599d64d0e5d4705a1030dac6a1Nick Lewycky return V; 3865d0392c6b370758750b397e254a6c6f028479969Duncan Sands} 3875d0392c6b370758750b397e254a6c6f028479969Duncan Sands 38801c8e0233d086354b55d2047506ac6a8fc3c9f65Chris Lattner/// DoPHITranslation - If this value is a PHI node with CurBB as its parent, 389c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner/// return the value in the PHI node corresponding to PredBB. If not, return 390c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner/// ourself. This is useful if you want to know the value something has in a 391c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner/// predecessor block. 392c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris LattnerValue *Value::DoPHITranslation(const BasicBlock *CurBB, 393c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner const BasicBlock *PredBB) { 394c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner PHINode *PN = dyn_cast<PHINode>(this); 395c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner if (PN && PN->getParent() == CurBB) 396c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner return PN->getIncomingValueForBlock(PredBB); 397c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner return this; 398c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner} 399c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner 400e922c0201916e0b980ab3cfe91e1413e68d55647Owen AndersonLLVMContext &Value::getContext() const { return VTy->getContext(); } 401e922c0201916e0b980ab3cfe91e1413e68d55647Owen Anderson 402722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner//===----------------------------------------------------------------------===// 403722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner// ValueHandleBase Class 404722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner//===----------------------------------------------------------------------===// 405722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 406722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner/// ValueHandles - This map keeps track of all of the value handles that are 407722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner/// watching a Value*. The Value::HasValueHandle bit is used to know whether or 408722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner/// not a value has an entry in this map. 409722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattnertypedef DenseMap<Value*, ValueHandleBase*> ValueHandlesTy; 410722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattnerstatic ManagedStatic<ValueHandlesTy> ValueHandles; 411bcf9737f1e8ca39efc4f7a4638d0836cad7ba4e1Owen Andersonstatic ManagedStatic<sys::SmartRWMutex<true> > ValueHandlesLock; 412722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 413fe095f39e7009c51d1c86769792ccbcad8cdd2ecMike Stump/// AddToExistingUseList - Add this ValueHandle to the use list for VP, where 414fe095f39e7009c51d1c86769792ccbcad8cdd2ecMike Stump/// List is known to point into the existing use list. 415722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattnervoid ValueHandleBase::AddToExistingUseList(ValueHandleBase **List) { 416722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(List && "Handle list is null?"); 417722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 418722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Splice ourselves into the list. 419722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner Next = *List; 420722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner *List = this; 421722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner setPrevPtr(List); 422722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner if (Next) { 423722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner Next->setPrevPtr(&Next); 424722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(VP == Next->VP && "Added to wrong list?"); 425722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 426722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner} 427722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 428722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner/// AddToUseList - Add this ValueHandle to the use list for VP. 429722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattnervoid ValueHandleBase::AddToUseList() { 430722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(VP && "Null pointer doesn't have a use list!"); 431722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner if (VP->HasValueHandle) { 432722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // If this value already has a ValueHandle, then it must be in the 433722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // ValueHandles map already. 434a9d1f2c559ef4b2549e29288fe6944e68913ba0fOwen Anderson sys::SmartScopedReader<true> Reader(*ValueHandlesLock); 435722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase *&Entry = (*ValueHandles)[VP]; 436722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(Entry != 0 && "Value doesn't have any handles?"); 437f2aac28d3040f9c716b4597ec90d237f27883866Owen Anderson AddToExistingUseList(&Entry); 438f2aac28d3040f9c716b4597ec90d237f27883866Owen Anderson return; 439722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 440722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 441722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Ok, it doesn't have any handles yet, so we must insert it into the 442722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // DenseMap. However, doing this insertion could cause the DenseMap to 443722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // reallocate itself, which would invalidate all of the PrevP pointers that 444722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // point into the old table. Handle this by checking for reallocation and 445722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // updating the stale pointers only if needed. 446a9d1f2c559ef4b2549e29288fe6944e68913ba0fOwen Anderson sys::SmartScopedWriter<true> Writer(*ValueHandlesLock); 447722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandlesTy &Handles = *ValueHandles; 448722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner const void *OldBucketPtr = Handles.getPointerIntoBucketsArray(); 449722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 450722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase *&Entry = Handles[VP]; 451722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(Entry == 0 && "Value really did already have handles?"); 452722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner AddToExistingUseList(&Entry); 453fe095f39e7009c51d1c86769792ccbcad8cdd2ecMike Stump VP->HasValueHandle = true; 454722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 455722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // If reallocation didn't happen or if this was the first insertion, don't 456722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // walk the table. 457722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner if (Handles.isPointerIntoBucketsArray(OldBucketPtr) || 458f2aac28d3040f9c716b4597ec90d237f27883866Owen Anderson Handles.size() == 1) { 459722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner return; 460f2aac28d3040f9c716b4597ec90d237f27883866Owen Anderson } 461722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 462722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Okay, reallocation did happen. Fix the Prev Pointers. 463722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner for (ValueHandlesTy::iterator I = Handles.begin(), E = Handles.end(); 464722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner I != E; ++I) { 465722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(I->second && I->first == I->second->VP && "List invariant broken!"); 466722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner I->second->setPrevPtr(&I->second); 467722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 468722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner} 469722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 470722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner/// RemoveFromUseList - Remove this ValueHandle from its current use list. 471722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattnervoid ValueHandleBase::RemoveFromUseList() { 472722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(VP && VP->HasValueHandle && "Pointer doesn't have a use list!"); 473722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 474722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Unlink this from its use list. 475722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase **PrevPtr = getPrevPtr(); 476722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(*PrevPtr == this && "List invariant broken"); 477722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 478722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner *PrevPtr = Next; 479722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner if (Next) { 480722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(Next->getPrevPtr() == &Next && "List invariant broken"); 481722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner Next->setPrevPtr(PrevPtr); 482722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner return; 483722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 484722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 485722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // If the Next pointer was null, then it is possible that this was the last 486722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // ValueHandle watching VP. If so, delete its entry from the ValueHandles 487722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // map. 488a9d1f2c559ef4b2549e29288fe6944e68913ba0fOwen Anderson sys::SmartScopedWriter<true> Writer(*ValueHandlesLock); 489722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandlesTy &Handles = *ValueHandles; 490722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner if (Handles.isPointerIntoBucketsArray(PrevPtr)) { 491722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner Handles.erase(VP); 492722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner VP->HasValueHandle = false; 493722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 494722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner} 495722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 496722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 497722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattnervoid ValueHandleBase::ValueIsDeleted(Value *V) { 498722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(V->HasValueHandle && "Should only be called if ValueHandles present"); 499722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 500722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Get the linked list base, which is guaranteed to exist since the 501722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // HasValueHandle flag is set. 502bcf9737f1e8ca39efc4f7a4638d0836cad7ba4e1Owen Anderson ValueHandlesLock->reader_acquire(); 503722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase *Entry = (*ValueHandles)[V]; 504bcf9737f1e8ca39efc4f7a4638d0836cad7ba4e1Owen Anderson ValueHandlesLock->reader_release(); 505722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(Entry && "Value bit set but no entries exist"); 506722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 507722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner while (Entry) { 508722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Advance pointer to avoid invalidation. 509722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase *ThisNode = Entry; 510722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner Entry = Entry->Next; 511722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 512722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner switch (ThisNode->getKind()) { 513722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner case Assert: 514722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner#ifndef NDEBUG // Only in -g mode... 515b95c2fd2700a92a7b857ebd1ecf6c7d561d676d2Daniel Dunbar errs() << "While deleting: " << *V->getType() << " %" << V->getNameStr() 516b95c2fd2700a92a7b857ebd1ecf6c7d561d676d2Daniel Dunbar << "\n"; 517722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner#endif 518c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("An asserting value handle still pointed to this" 51973097623650346be7fb01b773894bc3d8ea7ac8dJeffrey Yasskin " value!"); 520722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner case Weak: 521722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Weak just goes to null, which will unlink it from the list. 522722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ThisNode->operator=(0); 523722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner break; 524722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner case Callback: 525c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman // Forward to the subclass's implementation. 526c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman static_cast<CallbackVH*>(ThisNode)->deleted(); 527c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman break; 528722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 529722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 530722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 531722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // All callbacks and weak references should be dropped by now. 532722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(!V->HasValueHandle && "All references to V were not removed?"); 533722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner} 534722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 535722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 536722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattnervoid ValueHandleBase::ValueIsRAUWd(Value *Old, Value *New) { 537722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(Old->HasValueHandle &&"Should only be called if ValueHandles present"); 538722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(Old != New && "Changing value into itself!"); 539722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 540722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Get the linked list base, which is guaranteed to exist since the 541722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // HasValueHandle flag is set. 542bcf9737f1e8ca39efc4f7a4638d0836cad7ba4e1Owen Anderson ValueHandlesLock->reader_acquire(); 543722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase *Entry = (*ValueHandles)[Old]; 544bcf9737f1e8ca39efc4f7a4638d0836cad7ba4e1Owen Anderson ValueHandlesLock->reader_release(); 545722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner assert(Entry && "Value bit set but no entries exist"); 546722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 547722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner while (Entry) { 548722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Advance pointer to avoid invalidation. 549722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ValueHandleBase *ThisNode = Entry; 550722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner Entry = Entry->Next; 551722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 552722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner switch (ThisNode->getKind()) { 553722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner case Assert: 554722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Asserting handle does not follow RAUW implicitly. 555722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner break; 556722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner case Weak: 557722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner // Weak goes to the new value, which will unlink it from Old's list. 558722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner ThisNode->operator=(New); 559722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner break; 560722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner case Callback: 561c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman // Forward to the subclass's implementation. 562c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman static_cast<CallbackVH*>(ThisNode)->allUsesReplacedWith(New); 563c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman break; 564722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 565722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner } 566722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner} 567722272df41d8de9c7683811b7bd8e901ee2f2785Chris Lattner 568c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman/// ~CallbackVH. Empty, but defined here to avoid emitting the vtable 569c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman/// more than once. 570c09b12c62208f09de9d107b320f5420ae6e4fc38Dan GohmanCallbackVH::~CallbackVH() {} 571c09b12c62208f09de9d107b320f5420ae6e4fc38Dan Gohman 572c7f7c1dc5067a36c8ae337610dcbbe55d525c80cChris Lattner 573009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 574009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// User Class 575009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 576009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 577009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// replaceUsesOfWith - Replaces all references to the "From" definition with 578009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// references to the "To" definition. 579009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 580009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnervoid User::replaceUsesOfWith(Value *From, Value *To) { 581009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (From == To) return; // Duh what? 582009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 583ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov assert((!isa<Constant>(this) || isa<GlobalValue>(this)) && 58428eca8bb5692dced9f51a99c96078cbd67e230c6Chris Lattner "Cannot call User::replaceUsesofWith on a constant!"); 58528eca8bb5692dced9f51a99c96078cbd67e230c6Chris Lattner 586c8b25d40cbec063b1ca99cc1adf794399c6d05c0Chris Lattner for (unsigned i = 0, E = getNumOperands(); i != E; ++i) 587c8b25d40cbec063b1ca99cc1adf794399c6d05c0Chris Lattner if (getOperand(i) == From) { // Is This operand is pointing to oldval? 588009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // The side effects of this setOperand call include linking to 589009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // "To", adding "this" to the uses list of To, and 590009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // most importantly, removing "this" from the use list of "From". 591c8b25d40cbec063b1ca99cc1adf794399c6d05c0Chris Lattner setOperand(i, To); // Fix it now... 592009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 593009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 594