diff --git a/include/llvm/ADT/Twine.h b/include/llvm/ADT/Twine.h index 2c6ba0bc232..88fde0a54ae 100644 --- a/include/llvm/ADT/Twine.h +++ b/include/llvm/ADT/Twine.h @@ -320,6 +320,16 @@ namespace llvm { return Twine(&Val, UHexKind, 0, EmptyKind); } + /// @} + /// @name Predicate Operations + /// @{ + + /// isTriviallyEmpty - Check if this twine is trivially empty; a false + /// return value does not necessarily mean the twine is empty. + bool isTriviallyEmpty() const { + return isNullary(); + } + /// @} /// @name String Operations /// @{ diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index 157245d9ea8..34291b9d728 100644 --- a/lib/VMCore/Value.cpp +++ b/lib/VMCore/Value.cpp @@ -171,6 +171,10 @@ std::string Value::getNameStr() const { } void Value::setName(const Twine &NewName) { + // Fast path for common IRBuilder case of setName("") when there is no name. + if (NewName.isTriviallyEmpty() && !hasName()) + return; + SmallString<256> NameData; NewName.toVector(NameData);