[llvm] [InstCombine][DebugInfo] Update debug info after inverting a boolean instruction (PR #71212)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 3 10:50:48 PDT 2023


https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/71212

This PR adapts all dbg users after inverting a boolean instruction.

Related issue: #71065.
After this patch, gdb/lldb prints 255 for `l_4516` in the original code. It looks like the DWARF expression is incorrect. I will fix it in the follow-up PR.


>From 0d238f18acf92c9a9680dfdf08579a6d6d0cb84f Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 4 Nov 2023 01:17:28 +0800
Subject: [PATCH 1/2] [InstCombine][DebugInfo] Add pre-commit tests for
 PR71065. NFC.

---
 llvm/test/DebugInfo/salvage-invert-bool.ll | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 llvm/test/DebugInfo/salvage-invert-bool.ll

diff --git a/llvm/test/DebugInfo/salvage-invert-bool.ll b/llvm/test/DebugInfo/salvage-invert-bool.ll
new file mode 100644
index 000000000000000..61f46ef11c70a5a
--- /dev/null
+++ b/llvm/test/DebugInfo/salvage-invert-bool.ll
@@ -0,0 +1,35 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: opt %s -passes=instcombine -S | FileCheck %s
+
+define i32 @test_invert_bool(i32 %call, i32 %a) {
+; CHECK-LABEL: define i32 @test_invert_bool(
+; CHECK-SAME: i32 [[CALL:%.*]], i32 [[A:%.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[CALL]], 0
+; CHECK-NEXT:    call void @llvm.dbg.value(metadata i1 [[TOBOOL_NOT]], metadata [[META3:![0-9]+]], metadata !DIExpression(DW_OP_LLVM_convert, 1, DW_ATE_unsigned, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_stack_value)), !dbg [[DBG8:![0-9]+]]
+; CHECK-NEXT:    [[TMP0:%.*]] = and i32 [[A]], 1
+; CHECK-NEXT:    [[AND:%.*]] = select i1 [[TOBOOL_NOT]], i32 0, i32 [[TMP0]]
+; CHECK-NEXT:    ret i32 [[AND]]
+;
+entry:
+  %tobool = icmp ne i32 %call, 0
+  %land.ext = zext i1 %tobool to i32
+  call void @llvm.dbg.value(metadata i32 %land.ext, metadata !11, metadata !DIExpression()), !dbg !16
+  %and = and i32 %land.ext, %a
+  ret i32 %and
+}
+
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!10}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
+!1 = !DIFile(filename: "test.c", directory: "/")
+!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!10 = !{i32 2, !"Debug Info Version", i32 3}
+!11 = !DILocalVariable(name: "var", scope: !12, type: !5)
+!12 = distinct !DISubprogram(name: "test", scope: !1, file: !1, type: !13, unit: !0)
+!13 = !DISubroutineType(types: !14)
+!14 = !{null}
+!16 = !DILocation(scope: !12)

>From 0918da8368ea1e5f17c0993507b93322e72e7246 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sat, 4 Nov 2023 01:19:42 +0800
Subject: [PATCH 2/2] [InstCombine][DebugInfo] Update debug info after
 inverting a boolean instruction

---
 llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 7 +++++++
 llvm/test/DebugInfo/salvage-invert-bool.ll               | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index 559eb2ef4795eb1..287b7711223901c 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -1187,6 +1187,13 @@ void InstCombinerImpl::freelyInvertAllUsersOf(Value *I, Value *IgnoredUser) {
                        "canFreelyInvertAllUsersOf() ?");
     }
   }
+
+  // Adapt all dbg users
+  if (auto *Inst = dyn_cast<Instruction>(I); Inst && Inst->isUsedByMetadata()) {
+    auto *Not = Builder.CreateNot(I);
+    auto *NotInst = dyn_cast<Instruction>(I);
+    replaceAllDbgUsesWith(*Inst, *Not, NotInst ? *NotInst : *Inst, DT);
+  }
 }
 
 /// Given a 'sub' instruction, return the RHS of the instruction if the LHS is a
diff --git a/llvm/test/DebugInfo/salvage-invert-bool.ll b/llvm/test/DebugInfo/salvage-invert-bool.ll
index 61f46ef11c70a5a..8aaee919a2736a3 100644
--- a/llvm/test/DebugInfo/salvage-invert-bool.ll
+++ b/llvm/test/DebugInfo/salvage-invert-bool.ll
@@ -6,7 +6,7 @@ define i32 @test_invert_bool(i32 %call, i32 %a) {
 ; CHECK-SAME: i32 [[CALL:%.*]], i32 [[A:%.*]]) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[CALL]], 0
-; CHECK-NEXT:    call void @llvm.dbg.value(metadata i1 [[TOBOOL_NOT]], metadata [[META3:![0-9]+]], metadata !DIExpression(DW_OP_LLVM_convert, 1, DW_ATE_unsigned, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_stack_value)), !dbg [[DBG8:![0-9]+]]
+; CHECK-NEXT:    call void @llvm.dbg.value(metadata i1 [[TOBOOL_NOT]], metadata [[META3:![0-9]+]], metadata !DIExpression(DW_OP_constu, 18446744073709551615, DW_OP_xor, DW_OP_LLVM_convert, 1, DW_ATE_unsigned, DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_stack_value)), !dbg [[DBG8:![0-9]+]]
 ; CHECK-NEXT:    [[TMP0:%.*]] = and i32 [[A]], 1
 ; CHECK-NEXT:    [[AND:%.*]] = select i1 [[TOBOOL_NOT]], i32 0, i32 [[TMP0]]
 ; CHECK-NEXT:    ret i32 [[AND]]



More information about the llvm-commits mailing list