[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