diff options
Diffstat (limited to 'llvm/lib/IR/Value.cpp')
-rw-r--r-- | llvm/lib/IR/Value.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index 281594d..11dc506 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -315,8 +315,12 @@ StringRef Value::getName() const { } void Value::setNameImpl(const Twine &NewName) { + bool NeedNewName = + !getContext().shouldDiscardValueNames() || isa<GlobalValue>(this); + // Fast-path: LLVMContext can be set to strip out non-GlobalValue names - if (getContext().shouldDiscardValueNames() && !isa<GlobalValue>(this)) + // and there is no need to delete the old name. + if (!NeedNewName && !hasName()) return; // Fast path for common IRBuilder case of setName("") when there is no name. @@ -324,7 +328,7 @@ void Value::setNameImpl(const Twine &NewName) { return; SmallString<256> NameData; - StringRef NameRef = NewName.toStringRef(NameData); + StringRef NameRef = NeedNewName ? NewName.toStringRef(NameData) : ""; assert(NameRef.find_first_of(0) == StringRef::npos && "Null bytes are not allowed in names"); @@ -340,20 +344,17 @@ void Value::setNameImpl(const Twine &NewName) { return; // Cannot set a name on this value (e.g. constant). if (!ST) { // No symbol table to update? Just do the change. - if (NameRef.empty()) { - // Free the name for this value. - destroyValueName(); - return; - } - // NOTE: Could optimize for the case the name is shrinking to not deallocate // then reallocated. destroyValueName(); - // Create the new name. - MallocAllocator Allocator; - setValueName(ValueName::create(NameRef, Allocator)); - getValueName()->setValue(this); + if (!NameRef.empty()) { + // Create the new name. + assert(NeedNewName); + MallocAllocator Allocator; + setValueName(ValueName::create(NameRef, Allocator)); + getValueName()->setValue(this); + } return; } @@ -369,6 +370,7 @@ void Value::setNameImpl(const Twine &NewName) { } // Name is changing to something new. + assert(NeedNewName); setValueName(ST->createValueName(NameRef, this)); } |