[llvm] [IR] Fix ignoring `non-global-value-max-name-size` in `ValueSymbolTab… (PR #89057)
Daniil Fukalov via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 17 05:56:09 PDT 2024
https://github.com/dfukalov updated https://github.com/llvm/llvm-project/pull/89057
>From daa21880e1455eb25abddbe11fdabd455172646f Mon Sep 17 00:00:00 2001
From: dfukalov <1671137+dfukalov at users.noreply.github.com>
Date: Wed, 17 Apr 2024 13:43:36 +0200
Subject: [PATCH 1/2] [IR] Fix ignoring `non-global-value-max-name-size` in
`ValueSymbolTable::makeUniqueName()`.
E.g. during inlining new symbol name can be duplicated and then
`ValueSymbolTable::makeUniqueName()` will add unique suffix, exceeding
the `non-global-value-max-name-size` restriction.
---
llvm/lib/IR/ValueSymbolTable.cpp | 31 ++++++++++++-------
.../non-global-value-max-name-size-2.ll | 23 ++++++++++++++
2 files changed, 43 insertions(+), 11 deletions(-)
create mode 100644 llvm/test/Assembler/non-global-value-max-name-size-2.ll
diff --git a/llvm/lib/IR/ValueSymbolTable.cpp b/llvm/lib/IR/ValueSymbolTable.cpp
index 52f7ddcdc65a2b..7b4cecac9a2ccd 100644
--- a/llvm/lib/IR/ValueSymbolTable.cpp
+++ b/llvm/lib/IR/ValueSymbolTable.cpp
@@ -43,23 +43,32 @@ ValueSymbolTable::~ValueSymbolTable() {
ValueName *ValueSymbolTable::makeUniqueName(Value *V,
SmallString<256> &UniqueName) {
unsigned BaseSize = UniqueName.size();
+ bool AppenDot = false;
+ if (auto *GV = dyn_cast<GlobalValue>(V)) {
+ // A dot is appended to mark it as clone during ABI demangling so that
+ // for example "_Z1fv" and "_Z1fv.1" both demangle to "f()", the second
+ // one being a clone.
+ // On NVPTX we cannot use a dot because PTX only allows [A-Za-z0-9_$] for
+ // identifiers. This breaks ABI demangling but at least ptxas accepts and
+ // compiles the program.
+ const Module *M = GV->getParent();
+ if (!(M && Triple(M->getTargetTriple()).isNVPTX()))
+ AppenDot = true;
+ }
+
while (true) {
// Trim any suffix off and append the next number.
UniqueName.resize(BaseSize);
raw_svector_ostream S(UniqueName);
- if (auto *GV = dyn_cast<GlobalValue>(V)) {
- // A dot is appended to mark it as clone during ABI demangling so that
- // for example "_Z1fv" and "_Z1fv.1" both demangle to "f()", the second
- // one being a clone.
- // On NVPTX we cannot use a dot because PTX only allows [A-Za-z0-9_$] for
- // identifiers. This breaks ABI demangling but at least ptxas accepts and
- // compiles the program.
- const Module *M = GV->getParent();
- if (!(M && Triple(M->getTargetTriple()).isNVPTX()))
- S << ".";
- }
+ if (AppenDot)
+ S << ".";
S << ++LastUnique;
+ // Retry if MaxNameSize has been exceeded.
+ if (MaxNameSize > -1 && UniqueName.size() > (unsigned)MaxNameSize) {
+ BaseSize -= UniqueName.size() - (unsigned)MaxNameSize;
+ continue;
+ }
// Try insert the vmap entry with this suffix.
auto IterBool = vmap.insert(std::make_pair(UniqueName.str(), V));
if (IterBool.second)
diff --git a/llvm/test/Assembler/non-global-value-max-name-size-2.ll b/llvm/test/Assembler/non-global-value-max-name-size-2.ll
new file mode 100644
index 00000000000000..5eac003ddb4383
--- /dev/null
+++ b/llvm/test/Assembler/non-global-value-max-name-size-2.ll
@@ -0,0 +1,23 @@
+; RUN: opt < %s -S -passes='always-inline' -non-global-value-max-name-size=5 | opt -non-global-value-max-name-size=5 -passes=verify -disable-output
+
+; Opt should not generate too long name for labels during inlining.
+
+define internal i32 @inner(i32 %flag) alwaysinline {
+entry:
+ %icmp = icmp slt i32 %flag, 0
+ br i1 %icmp, label %one, label %two
+
+one:
+ ret i32 42
+
+two:
+ ret i32 44
+}
+
+define i32 @outer(i32 %x) {
+entry:
+ %call1 = call i32 @inner(i32 %x)
+ %call2 = call i32 @inner(i32 %x)
+ %ret = add i32 %call1, %call2
+ ret i32 %ret
+}
\ No newline at end of file
>From 0c376ad20206580b257032da0f9e9379a64aab3b Mon Sep 17 00:00:00 2001
From: dfukalov <1671137+dfukalov at users.noreply.github.com>
Date: Wed, 17 Apr 2024 14:54:56 +0200
Subject: [PATCH 2/2] Fix `Bitcode/value-with-long-name.ll` test
---
llvm/lib/IR/ValueSymbolTable.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/IR/ValueSymbolTable.cpp b/llvm/lib/IR/ValueSymbolTable.cpp
index 7b4cecac9a2ccd..040a84228f11ae 100644
--- a/llvm/lib/IR/ValueSymbolTable.cpp
+++ b/llvm/lib/IR/ValueSymbolTable.cpp
@@ -65,7 +65,7 @@ ValueName *ValueSymbolTable::makeUniqueName(Value *V,
S << ++LastUnique;
// Retry if MaxNameSize has been exceeded.
- if (MaxNameSize > -1 && UniqueName.size() > (unsigned)MaxNameSize) {
+ if (MaxNameSize > 0 && UniqueName.size() > (unsigned)MaxNameSize) {
BaseSize -= UniqueName.size() - (unsigned)MaxNameSize;
continue;
}
More information about the llvm-commits
mailing list