Index: lib/IR/Value.cpp =================================================================== --- lib/IR/Value.cpp +++ lib/IR/Value.cpp @@ -39,6 +39,10 @@ using namespace llvm; +static cl::opt 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 //===----------------------------------------------------------------------===// @@ -231,6 +235,10 @@ if (getContext().shouldDiscardValueNames() && !isa(this)) return; + // Same here, based on the NonGlobalValueMaxNameSize option + if (NonGlobalValueMaxNameSize == 0 && !isa(this)) + return; + // Fast path for common IRBuilder case of setName("") when there is no name. if (NewName.isTriviallyEmpty() && !hasName()) return; @@ -244,6 +252,10 @@ if (getName() == NameRef) return; + // Cap the size of non-GlobalValue names. + if (NameRef.size() > NonGlobalValueMaxNameSize && !isa(this)) + NameRef = NameRef.substr(0, NonGlobalValueMaxNameSize); + assert(!getType()->isVoidTy() && "Cannot assign a name to void values!"); // Get the symbol table to update for this object. Index: test/Bitcode/value-with-long-name.ll =================================================================== --- test/Bitcode/value-with-long-name.ll +++ test/Bitcode/value-with-long-name.ll @@ -0,0 +1,16 @@ +; 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 %s +; RUN: opt -S %s -O2 -o - -non-global-value-max-name-size=1 | FileCheck %s + +; CHECK-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 +} + +