From f3ea12956a98061c2452238aefcad9e075a4de8e Mon Sep 17 00:00:00 2001 From: w-gc <25614556+w-gc@users.noreply.github.com> Date: Fri, 12 Sep 2025 20:58:12 +0800 Subject: [PATCH 1/2] [IR] Fix string overlap issue in Value::setNameImpl --- llvm/lib/IR/Value.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index 4e8f359481b81..a7aa7fb04d99e 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -374,6 +374,15 @@ void Value::setNameImpl(const Twine &NewName) { // NOTE: Could optimize for the case the name is shrinking to not deallocate // then reallocated. if (hasName()) { + if (!NameRef.empty()) { +      StringRef OldNameRef = getName(); +      if ((OldNameRef.bytes_begin() < NameRef.bytes_end()) && +          (NameRef.bytes_begin() < OldNameRef.bytes_end())) { +        NewName.toVector(NameData); +        NameRef = StringRef(NameData.data(), NameData.size()); +      } +    } + // Remove old name. ST->removeValueName(getValueName()); destroyValueName(); From 36bfc120658ec15afeaaba92f24c7fafcdd61b95 Mon Sep 17 00:00:00 2001 From: w-gc <25614556+w-gc@users.noreply.github.com> Date: Mon, 15 Sep 2025 14:10:51 +0800 Subject: [PATCH 2/2] [IR] Fix string overlap issue in Value::setNameImpl --- llvm/lib/IR/Value.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index a7aa7fb04d99e..7ae5a58c24707 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -356,6 +356,16 @@ void Value::setNameImpl(const Twine &NewName) { if (getSymTab(this, ST)) return; // Cannot set a name on this value (e.g. constant). + // Copy NewName forcely if the memory overlaps. + if (!NameRef.empty()) { + StringRef OldNameRef = getName(); + if ((OldNameRef.bytes_begin() < NameRef.bytes_end()) && + (NameRef.bytes_begin() < OldNameRef.bytes_end())) { + NewName.toVector(NameData); + NameRef = StringRef(NameData.data(), NameData.size()); + } + } + if (!ST) { // No symbol table to update? Just do the change. // NOTE: Could optimize for the case the name is shrinking to not deallocate // then reallocated. @@ -374,15 +384,6 @@ void Value::setNameImpl(const Twine &NewName) { // NOTE: Could optimize for the case the name is shrinking to not deallocate // then reallocated. if (hasName()) { - if (!NameRef.empty()) { -      StringRef OldNameRef = getName(); -      if ((OldNameRef.bytes_begin() < NameRef.bytes_end()) && -          (NameRef.bytes_begin() < OldNameRef.bytes_end())) { -        NewName.toVector(NameData); -        NameRef = StringRef(NameData.data(), NameData.size()); -      } -    } - // Remove old name. ST->removeValueName(getValueName()); destroyValueName();