[PATCH] D17946: Add a flag to the LLVMContext to disable name for Value other than GlobalValue
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 9 15:23:55 PST 2016
Mehdi AMINI <mehdi.amini at apple.com> writes:
> joker.eph updated this revision to Diff 50175.
> joker.eph added a comment.
>
> Take Chandler's comment into account
This version LGTM, and I like the discard-value-names terminology.
>
> http://reviews.llvm.org/D17946
>
> Files:
> include/llvm/IR/LLVMContext.h
> lib/AsmParser/LLParser.cpp
> lib/IR/LLVMContext.cpp
> lib/IR/LLVMContextImpl.h
> lib/IR/Value.cpp
> lib/LTO/LTOCodeGenerator.cpp
> test/Feature/strip_names.ll
> tools/llc/llc.cpp
> tools/opt/opt.cpp
>
> Index: tools/opt/opt.cpp
> ===================================================================
> --- tools/opt/opt.cpp
> +++ tools/opt/opt.cpp
> @@ -196,6 +196,11 @@
> cl::desc("Run all passes twice, re-using the same pass manager."),
> cl::init(false), cl::Hidden);
>
> +static cl::opt<bool> DiscardValueNames(
> + "discard-value-names",
> + cl::desc("Discard names from Value (other than GlobalValue)."),
> + cl::init(false), cl::Hidden);
> +
> static inline void addPass(legacy::PassManagerBase &PM, Pass *P) {
> // Add the pass to the pass manager...
> PM.add(P);
> @@ -345,6 +350,8 @@
>
> SMDiagnostic Err;
>
> + Context.setDiscardValueNames(DiscardValueNames);
> +
> // Load the input module...
> std::unique_ptr<Module> M = parseIRFile(InputFilename, Err, Context);
>
> Index: tools/llc/llc.cpp
> ===================================================================
> --- tools/llc/llc.cpp
> +++ tools/llc/llc.cpp
> @@ -103,6 +103,11 @@
> "manager and verify the result is the same."),
> cl::init(false));
>
> +static cl::opt<bool> DiscardValueNames(
> + "discard-value-names",
> + cl::desc("Discard names from Value (other than GlobalValue)."),
> + cl::init(false), cl::Hidden);
> +
> static int compileModule(char **, LLVMContext &);
>
> static std::unique_ptr<tool_output_file>
> @@ -205,6 +210,8 @@
>
> cl::ParseCommandLineOptions(argc, argv, "llvm system compiler\n");
>
> + Context.setDiscardValueNames(DiscardValueNames);
> +
> // Compile the module TimeCompilations times to give better compile time
> // metrics.
> for (unsigned I = TimeCompilations; I; --I)
> Index: test/Feature/strip_names.ll
> ===================================================================
> --- /dev/null
> +++ test/Feature/strip_names.ll
> @@ -0,0 +1,26 @@
> +; RUN: opt < %s -S | FileCheck %s
> +; RUN: opt < %s | opt -S -discard-value-names | FileCheck --check-prefix=NONAME %s
> +
> +
> +; CHECK: @GlobalValueName
> +; CHECK: @foo(i32 %in)
> +; CHECK: somelabel:
> +; CHECK: %GV = load i32, i32* @GlobalValueName
> +; CHECK: %add = add i32 %in, %GV
> +; CHECK: ret i32 %add
> +
> +; NONAME: @GlobalValueName
> +; NONAME: @foo(i32)
> +; NONAME-NOT: somelabel:
> +; NONAME: %2 = load i32, i32* @GlobalValueName
> +; NONAME: %3 = add i32 %0, %2
> +; NONAME: ret i32 %3
> +
> + at GlobalValueName = global i32 0
> +
> +define i32 @foo(i32 %in) {
> +somelabel:
> + %GV = load i32, i32* @GlobalValueName
> + %add = add i32 %in, %GV
> + ret i32 %add
> +}
> Index: lib/LTO/LTOCodeGenerator.cpp
> ===================================================================
> --- lib/LTO/LTOCodeGenerator.cpp
> +++ lib/LTO/LTOCodeGenerator.cpp
> @@ -73,9 +73,20 @@
> #endif
> }
>
> +static cl::opt<bool> DiscardValueNames(
> + "discard-value-names",
> + cl::desc("Strip names from Value (other than GlobalValue)."),
> +#ifdef NDEBUG
> + cl::init(true),
> +#else
> + cl::init(false),
> +#endif
> + cl::Hidden);
> +
> LTOCodeGenerator::LTOCodeGenerator(LLVMContext &Context)
> : Context(&Context), MergedModule(new Module("ld-temp.o", Context)),
> TheLinker(new Linker(*MergedModule)) {
> + Context.setDiscardValueNames(DiscardValueNames);
> initializeLTOPasses();
> }
>
> Index: lib/IR/Value.cpp
> ===================================================================
> --- lib/IR/Value.cpp
> +++ lib/IR/Value.cpp
> @@ -195,6 +195,10 @@
> }
>
> void Value::setNameImpl(const Twine &NewName) {
> + // Fast-path: LLVMContext can be set to strip out non-GlobalValue names
> + if (getContext().discardValueNames() && !isa<GlobalValue>(this))
> + return;
> +
> // Fast path for common IRBuilder case of setName("") when there is no name.
> if (NewName.isTriviallyEmpty() && !hasName())
> return;
> Index: lib/IR/LLVMContextImpl.h
> ===================================================================
> --- lib/IR/LLVMContextImpl.h
> +++ lib/IR/LLVMContextImpl.h
> @@ -1034,6 +1034,10 @@
> /// clients which do use GC.
> DenseMap<const Function*, std::string> GCNames;
>
> + /// Flag to indicate if Value (other than GlobalValue) retains their name or
> + /// not.
> + bool DiscardValueNames = false;
> +
> LLVMContextImpl(LLVMContext &C);
> ~LLVMContextImpl();
>
> Index: lib/IR/LLVMContext.cpp
> ===================================================================
> --- lib/IR/LLVMContext.cpp
> +++ lib/IR/LLVMContext.cpp
> @@ -320,3 +320,9 @@
> void LLVMContext::deleteGC(const Function &Fn) {
> pImpl->GCNames.erase(&Fn);
> }
> +
> +bool LLVMContext::discardValueNames() { return pImpl->DiscardValueNames; }
> +
> +void LLVMContext::setDiscardValueNames(bool Discard) {
> + pImpl->DiscardValueNames = Discard;
> +}
> Index: lib/AsmParser/LLParser.cpp
> ===================================================================
> --- lib/AsmParser/LLParser.cpp
> +++ lib/AsmParser/LLParser.cpp
> @@ -45,6 +45,11 @@
> // Prime the lexer.
> Lex.Lex();
>
> + if (Context.discardValueNames())
> + return Error(
> + Lex.getLoc(),
> + "Can't read textual IR with a Context that discards named Values");
> +
> return ParseTopLevelEntities() ||
> ValidateEndOfModule();
> }
> Index: include/llvm/IR/LLVMContext.h
> ===================================================================
> --- include/llvm/IR/LLVMContext.h
> +++ include/llvm/IR/LLVMContext.h
> @@ -103,6 +103,15 @@
> /// Remove the GC for a function
> void deleteGC(const Function &Fn);
>
> + /// Return true if the Context runtime configuration is set to discard all
> + /// value names. When true, only GlobalValue names will be available in the
> + /// IR.
> + bool discardValueNames();
> +
> + /// Set the Context runtime configuration to discard all value name (but
> + /// GlobalValue). Clients can use this flag to save memory and runtime,
> + /// especially in release mode.
> + void setDiscardValueNames(bool Discard);
>
> typedef void (*InlineAsmDiagHandlerTy)(const SMDiagnostic&, void *Context,
> unsigned LocCookie);
More information about the llvm-commits
mailing list