[clang] [clang] Honor -discard-value-names for LLVM IR input (PR #229674)
Fangrui Song via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 7 00:13:43 PDT 2026
https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/229674
For IR input, CodeGenAction forces setDiscardValueNames(false) to avoid
the crash in #44241, so names created by the optimizer (e.g. the
inliner's `.i`) are kept. c53d807321f6 fixed that crash in
Value::setNameImpl. Apply CodeGenOpts.DiscardValueNames after loading
the module and remove the "ignoring -fdiscard-value-names" warning.
LLM-aided. `clang -O3 -c sqlite3.bc` executes 0.7% fewer instructions.
>From 98adde678eb3d952fbbe2dddcd11a4d596838ff5 Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Tue, 6 Oct 2026 22:46:52 -0700
Subject: [PATCH] [clang] Honor -discard-value-names for LLVM IR input
For IR input, CodeGenAction forces setDiscardValueNames(false) to avoid
the crash in #44241, so names created by the optimizer (e.g. the
inliner's `.i`) are kept. c53d807321f6 fixed that crash in
Value::setNameImpl. Apply CodeGenOpts.DiscardValueNames after loading
the module and remove the "ignoring -fdiscard-value-names" warning.
LLM-aided. `clang -O3 -c sqlite3.bc` executes 0.7% fewer instructions.
---
.../clang/Basic/DiagnosticDriverKinds.td | 3 ---
clang/lib/CodeGen/CodeGenAction.cpp | 5 ++---
clang/lib/Driver/ToolChains/Clang.cpp | 9 +-------
clang/test/CodeGen/PR44896.ll | 16 --------------
clang/test/CodeGen/discard-name-values.ll | 21 +++++++++++++++++++
5 files changed, 24 insertions(+), 30 deletions(-)
delete mode 100644 clang/test/CodeGen/PR44896.ll
create mode 100644 clang/test/CodeGen/discard-name-values.ll
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index df6ff0c2cf399f6..e8a66dae748fff6 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -487,9 +487,6 @@ def warn_drv_dwarf_version_limited_by_target : Warning<
InGroup<UnsupportedTargetOpt>;
def warn_c_kext : Warning<
"ignoring -fapple-kext which is valid for C++ and Objective-C++ only">;
-def warn_ignoring_fdiscard_for_bitcode : Warning<
- "ignoring -fdiscard-value-names for LLVM Bitcode">,
- InGroup<UnusedCommandLineArgument>;
def warn_drv_input_file_unused : Warning<
"%0: '%1' input unused%select{ when '%3' is present|}2">,
InGroup<UnusedCommandLineArgument>;
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp
index de677a385d832be..1abd8b0455a19b3 100644
--- a/clang/lib/CodeGen/CodeGenAction.cpp
+++ b/clang/lib/CodeGen/CodeGenAction.cpp
@@ -617,9 +617,8 @@ void CodeGenAction::ExecuteAction() {
if (!CodeGenOpts.LinkBitcodePostopt && Result.LinkInModules(&*TheModule))
return;
- // PR44896: Force DiscardValueNames as false. DiscardValueNames cannot be
- // true here because the valued names are needed for reading textual IR.
- Ctx.setDiscardValueNames(false);
+ // Textual IR needs value names while parsing; discard new names afterwards.
+ Ctx.setDiscardValueNames(CodeGenOpts.DiscardValueNames);
Ctx.setDiagnosticHandler(Result.createDiagnosticHandler());
Ctx.setDefaultTargetCPU(TargetOpts.CPU);
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 33507396561e215..2325e7cc552ef9f 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -5797,15 +5797,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
// Discard value names in no-asserts builds unless otherwise specified.
if (Args.hasFlag(options::OPT_fdiscard_value_names,
- options::OPT_fno_discard_value_names, !IsAssertBuild)) {
- if (Args.hasArg(options::OPT_fdiscard_value_names) &&
- llvm::any_of(Inputs, [](const clang::driver::InputInfo &II) {
- return types::isLLVMIR(II.getType());
- })) {
- D.Diag(diag::warn_ignoring_fdiscard_for_bitcode);
- }
+ options::OPT_fno_discard_value_names, !IsAssertBuild))
CmdArgs.push_back("-discard-value-names");
- }
// Set the main file name, so that debug info works even with
// -save-temps.
diff --git a/clang/test/CodeGen/PR44896.ll b/clang/test/CodeGen/PR44896.ll
deleted file mode 100644
index 6547ea12168f65d..000000000000000
--- a/clang/test/CodeGen/PR44896.ll
+++ /dev/null
@@ -1,16 +0,0 @@
-; REQUIRES: x86-registered-target
-; RUN: %clang --target=x86_64-linux-gnu -fdiscard-value-names -S %s -o /dev/null 2>&1 | FileCheck --check-prefix=WARNING %s
-; RUN: %clang --target=x86_64-linux-gnu -S %s -o /dev/null 2>&1 | FileCheck --check-prefix=NOWARNING %s
-; RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm %s -discard-value-names -o /dev/null
-; PR 44896
-
-; WARNING: ignoring -fdiscard-value-names for LLVM Bitcode
-; NOWARNING-NOT: ignoring -fdiscard-value-names for LLVM Bitcode
-
-target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
-target triple = "x86_64--linux-gnu"
-
-define linkonce ptr @b(ptr %a) {
- ret ptr %a
-}
-
diff --git a/clang/test/CodeGen/discard-name-values.ll b/clang/test/CodeGen/discard-name-values.ll
new file mode 100644
index 000000000000000..246bca2d102a594
--- /dev/null
+++ b/clang/test/CodeGen/discard-name-values.ll
@@ -0,0 +1,21 @@
+; REQUIRES: x86-registered-target
+;; Textual IR keeps its names while parsing; -discard-value-names only drops
+;; names created afterwards (here by the inliner).
+; RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -O1 -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,KEEP
+; RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -O1 -emit-llvm %s -discard-value-names -o - | FileCheck %s --check-prefixes=CHECK,DISCARD
+
+; CHECK-LABEL: define {{.*}} @g(i32 {{.*}}%a)
+; KEEP: %y.i = add i32 %a, 1
+; DISCARD: %1 = add i32 %a, 1
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define internal i32 @f(i32 %x) {
+ %y = add i32 %x, 1
+ ret i32 %y
+}
+
+define i32 @g(i32 %a) {
+ %r = call i32 @f(i32 %a)
+ ret i32 %r
+}
More information about the cfe-commits
mailing list