[llvm] r321886 - Limit size of non-GlobalValue name

Serge Guelton via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 5 11:41:19 PST 2018


Author: serge_sans_paille
Date: Fri Jan  5 11:41:19 2018
New Revision: 321886

URL: http://llvm.org/viewvc/llvm-project?rev=321886&view=rev
Log:
Limit size of non-GlobalValue name

Otherwise, in some extreme test case, very long names are created and the
compiler consumes large amount of memory. Size limit is set to a relatively
high value not to disturb debugging.

Compiler flag -non-global-value-max-name-size=<value> can be used to customize
the size.

Differential Revision: https://reviews.llvm.org/D41296



Added:
    llvm/trunk/test/Bitcode/value-with-long-name.ll
Modified:
    llvm/trunk/lib/IR/Value.cpp

Modified: llvm/trunk/lib/IR/Value.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Value.cpp?rev=321886&r1=321885&r2=321886&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Value.cpp (original)
+++ llvm/trunk/lib/IR/Value.cpp Fri Jan  5 11:41:19 2018
@@ -39,6 +39,10 @@
 
 using namespace llvm;
 
+static cl::opt<unsigned> NonGlobalValueMaxNameSize(
+    "non-global-value-max-name-size", cl::Hidden, cl::init(1024),
+    cl::desc("Maximum size for the name of non-global values."));
+
 //===----------------------------------------------------------------------===//
 //                                Value Class
 //===----------------------------------------------------------------------===//
@@ -244,6 +248,11 @@ void Value::setNameImpl(const Twine &New
   if (getName() == NameRef)
     return;
 
+  // Cap the size of non-GlobalValue names.
+  if (NameRef.size() > NonGlobalValueMaxNameSize && !isa<GlobalValue>(this))
+    NameRef =
+        NameRef.substr(0, std::max(1u, (unsigned)NonGlobalValueMaxNameSize));
+
   assert(!getType()->isVoidTy() && "Cannot assign a name to void values!");
 
   // Get the symbol table to update for this object.

Added: llvm/trunk/test/Bitcode/value-with-long-name.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/value-with-long-name.ll?rev=321886&view=auto
==============================================================================
--- llvm/trunk/test/Bitcode/value-with-long-name.ll (added)
+++ llvm/trunk/test/Bitcode/value-with-long-name.ll Fri Jan  5 11:41:19 2018
@@ -0,0 +1,18 @@
+; Check the size of generated variable when no option is set
+; RUN: opt -S %s -O2 -o - | FileCheck -check-prefix=CHECK-LONG %s
+; CHECK-LONG: %{{[a-z]{4}[a-z]+}}
+
+; Then check we correctly cap the size of newly generated non-global values name
+; Force the size to be small so that the check works on release and debug build
+; RUN: opt -S %s -O2 -o - -non-global-value-max-name-size=0 | FileCheck -check-prefix=CHECK-SHORT %s
+; RUN: opt -S %s -O2 -o - -non-global-value-max-name-size=1 | FileCheck -check-prefix=CHECK-SHORT %s
+; CHECK-SHORT-NOT: %{{[a-z][a-z]+}}
+
+define i32 @f(i32 %a, i32 %b) {
+  %c = add i32 %a, %b
+  %d = add i32 %c, %a
+  %e = add i32 %d, %b
+  ret i32 %e
+}
+
+




More information about the llvm-commits mailing list