[llvm] [DEBUGINFO] Propagate debug metadata for sext SDNode. (PR #135971)

Alexander Peskov via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 17 06:03:06 PDT 2025


https://github.com/apeskov updated https://github.com/llvm/llvm-project/pull/135971

>From 0651492b70c0b31a3eb73aaf812e34f401b1724e Mon Sep 17 00:00:00 2001
From: Alexander Peskov <apeskov at nvidia.com>
Date: Mon, 14 Apr 2025 20:28:13 +0400
Subject: [PATCH 1/4] [DEBUGINFO] Fix missed debug info for bool local var

During type promotion debug info is messed for bool vars.
---
 .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp |  4 +-
 llvm/test/DebugInfo/NVPTX/debug-bool-var.ll   | 43 +++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/DebugInfo/NVPTX/debug-bool-var.ll

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 8682c40898046..c5825a64c1c18 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -6244,7 +6244,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
       SDNodeFlags Flags;
       if (OpOpcode == ISD::ZERO_EXTEND)
         Flags.setNonNeg(N1->getFlags().hasNonNeg());
-      return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
+      SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
+      transferDbgValues(N1, NewVal);
+      return NewVal;
     }
     if (N1.isUndef())
       // sext(undef) = 0, because the top bits will all be the same.
diff --git a/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll b/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll
new file mode 100644
index 0000000000000..7e50f1ea18fea
--- /dev/null
+++ b/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll
@@ -0,0 +1,43 @@
+; RUN: llc < %s -mtriple=nvptx64-nvidia-cuda | FileCheck %s
+
+declare void @foo(i32)
+
+define void @test1(i32 noundef %gid) !dbg !3 {
+entry:
+  ;
+  ; verify that debug info exists for "xyz" variable
+  ;
+  ; CHECK-LABEL:    DW_TAG_variable
+  ; CHECK:      .b8 120     // DW_AT_name
+  ; CHECK-NEXT: .b8 121
+  ; CHECK-NEXT: .b8 122
+  ; CHECK-NEXT: .b8 0
+  ; CHECK-NEXT: .b8 1       // DW_AT_decl_file
+  ; CHECK-NEXT: .b8 6       // DW_AT_decl_line
+  ;
+  %cmp = icmp eq i32 %gid, 0, !dbg !12
+  %conv = zext i1 %cmp to i32, !dbg !12
+  %conv1 = trunc i32 %conv to i8, !dbg !12
+    #dbg_value(i8 %conv1, !10, !DIExpression(), !13)
+  %conv3 = sext i8 %conv1 to i32
+  call void @foo(i32 %conv3)
+  ret void
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "test.cu", directory: "/source/dir")
+!2 = !{i32 1, !"Debug Info Version", i32 3}
+!3 = distinct !DISubprogram(name: "test1", linkageName: "_test1i", scope: !1, file: !1, line: 5, type: !4, scopeLine: 5, unit: !0, retainedNodes: !8)
+!4 = !DISubroutineType(types: !5)
+!5 = !{!6, !7}
+!6 = !DIBasicType(tag: DW_TAG_unspecified_type, name: "void")
+!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!8 = !{}
+!9 = distinct !DILexicalBlock(scope: !3, file: !1, line: 5, column: 30)
+!10 = !DILocalVariable(name: "xyz", scope: !9, file: !1, line: 6, type: !11)
+!11 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean)
+!12 = !DILocation(line: 1, column: 3, scope: !9)
+!13 = !DILocation(line: 2, scope: !9)

>From 0f34707fd4c75318ce3be37d363ec1cfa407715a Mon Sep 17 00:00:00 2001
From: Alexander Peskov <apeskov at nvidia.com>
Date: Thu, 17 Apr 2025 16:46:15 +0400
Subject: [PATCH 2/4] Plus zext-zext case

Signed-off-by: Alexander Peskov <apeskov at nvidia.com>
---
 .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp |  4 +-
 llvm/test/DebugInfo/NVPTX/debug-bool-var.ll   | 45 ++++++++++++++++++-
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index c5825a64c1c18..e11b81f554d56 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -6266,7 +6266,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
     if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
       SDNodeFlags Flags;
       Flags.setNonNeg(N1->getFlags().hasNonNeg());
-      return getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
+      SDValue NewVal = getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
+      transferDbgValues(N1, NewVal);
+      return NewVal;
     }
     if (N1.isUndef())
       // zext(undef) = 0, because the top bits will be zero.
diff --git a/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll b/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll
index 7e50f1ea18fea..02f68efbaa3b6 100644
--- a/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll
+++ b/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll
@@ -5,9 +5,16 @@ declare void @foo(i32)
 define void @test1(i32 noundef %gid) !dbg !3 {
 entry:
   ;
-  ; verify that debug info exists for "xyz" variable
+  ; Equivalent of code:
+  ;   extern void foo(int);
+  ;   void test_kernel_bool(int a) {
+  ;     bool xyz = a == 0;
+  ;     foo(xyz);
+  ;   }
   ;
-  ; CHECK-LABEL:    DW_TAG_variable
+  ; Verify that debug info exists for "xyz" variable
+  ;
+  ; CHECK:       DW_TAG_variable
   ; CHECK:      .b8 120     // DW_AT_name
   ; CHECK-NEXT: .b8 121
   ; CHECK-NEXT: .b8 122
@@ -24,6 +31,35 @@ entry:
   ret void
 }
 
+define void @test2(i32 noundef %gid) !dbg !14 {
+entry:
+  ;
+  ; Equivalent of code:
+  ;   extern void foo(int);
+  ;   void test_kernel_bool(int a) {
+  ;     unsigned char abc = a == 0;
+  ;     foo(abc);
+  ;   }
+  ;
+  ; Verify that debug info exists for "abc" variable
+  ;
+  ; CHECK:       DW_TAG_variable
+  ; CHECK:      .b8 97      // DW_AT_name
+  ; CHECK-NEXT: .b8 98
+  ; CHECK-NEXT: .b8 99
+  ; CHECK-NEXT: .b8 0
+  ; CHECK-NEXT: .b8 1       // DW_AT_decl_file
+  ; CHECK-NEXT: .b8 11       // DW_AT_decl_line
+  ;
+  %cmp = icmp eq i32 %gid, 0, !dbg !17
+  %conv = zext i1 %cmp to i32, !dbg !17
+  %conv1 = trunc i32 %conv to i8, !dbg !17
+    #dbg_value(i8 %conv1, !16, !DIExpression(), !18)
+  %conv3 = zext i8 %conv1 to i32
+  call void @foo(i32 %conv3)
+  ret void
+}
+
 !llvm.dbg.cu = !{!0}
 !llvm.module.flags = !{!2}
 
@@ -41,3 +77,8 @@ entry:
 !11 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean)
 !12 = !DILocation(line: 1, column: 3, scope: !9)
 !13 = !DILocation(line: 2, scope: !9)
+!14 = distinct !DISubprogram(name: "test2", linkageName: "_test2i", scope: !1, file: !1, line: 10, type: !4, scopeLine: 10, unit: !0, retainedNodes: !8)
+!15 = distinct !DILexicalBlock(scope: !14, file: !1, line: 10, column: 30)
+!16 = !DILocalVariable(name: "abc", scope: !15, file: !1, line: 11, type: !11)
+!17 = !DILocation(line: 11, column: 3, scope: !15)
+!18 = !DILocation(line: 12, scope: !15)
\ No newline at end of file

>From ad5d90a74e23275e2f154b5dae68ad3c061d71b7 Mon Sep 17 00:00:00 2001
From: Alexander Peskov <apeskov at nvidia.com>
Date: Thu, 17 Apr 2025 16:59:00 +0400
Subject: [PATCH 3/4] fix lint

---
 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index e11b81f554d56..147953d6985db 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -6266,7 +6266,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
     if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
       SDNodeFlags Flags;
       Flags.setNonNeg(N1->getFlags().hasNonNeg());
-      SDValue NewVal = getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
+      SDValue NewVal =
+          getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
       transferDbgValues(N1, NewVal);
       return NewVal;
     }

>From 54d98c930cd250d8e243c8d2bf25a9e0bce9e4e3 Mon Sep 17 00:00:00 2001
From: Alexander Peskov <apeskov at nvidia.com>
Date: Thu, 17 Apr 2025 17:02:12 +0400
Subject: [PATCH 4/4] minor

---
 llvm/test/DebugInfo/NVPTX/debug-bool-var.ll | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll b/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll
index 02f68efbaa3b6..c878ea1056346 100644
--- a/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll
+++ b/llvm/test/DebugInfo/NVPTX/debug-bool-var.ll
@@ -81,4 +81,4 @@ entry:
 !15 = distinct !DILexicalBlock(scope: !14, file: !1, line: 10, column: 30)
 !16 = !DILocalVariable(name: "abc", scope: !15, file: !1, line: 11, type: !11)
 !17 = !DILocation(line: 11, column: 3, scope: !15)
-!18 = !DILocation(line: 12, scope: !15)
\ No newline at end of file
+!18 = !DILocation(line: 12, scope: !15)



More information about the llvm-commits mailing list