[llvm] [DebugInfo][Reassociate] Preserve DebugLocs when reassociating subs (PR #114226)

Stephen Tozer via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 30 06:22:50 PDT 2024


https://github.com/SLTozer created https://github.com/llvm/llvm-project/pull/114226

In NegateValue in Reassociate, we return the negation of an existing value in order to break a subtract into an negate + add, potentially creating a new instruction to perform the negation, but we neglect to propagate the DebugLoc of the sub being replaced to the negate instruction if one is created. This patch adds that propagation.

>From 4995b53d19c48b5ee73691315191600585294ddb Mon Sep 17 00:00:00 2001
From: Stephen Tozer <stephen.tozer at sony.com>
Date: Wed, 2 Oct 2024 17:20:38 +0100
Subject: [PATCH] [DebugInfo][Reassociate] Preserve DebugLocs when
 reassociating subs

In NegateValue in Reassociate, we return the negation of an existing value
in order to break a subtract into an negate + add, potentially creating a
new instruction to perform the negation, but we neglect to propagate the
DebugLoc of the sub being replaced to the negate instruction if one is
created. This patch adds that propagation.
---
 llvm/lib/Transforms/Scalar/Reassociate.cpp    |  2 +
 .../Reassociate/preserve-debugloc.ll          | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 llvm/test/Transforms/Reassociate/preserve-debugloc.ll

diff --git a/llvm/lib/Transforms/Scalar/Reassociate.cpp b/llvm/lib/Transforms/Scalar/Reassociate.cpp
index e742d2ed12af1a..bc50f23d8eb27b 100644
--- a/llvm/lib/Transforms/Scalar/Reassociate.cpp
+++ b/llvm/lib/Transforms/Scalar/Reassociate.cpp
@@ -874,6 +874,8 @@ static Value *NegateValue(Value *V, Instruction *BI,
   // negation.
   Instruction *NewNeg =
       CreateNeg(V, V->getName() + ".neg", BI->getIterator(), BI);
+  // NewNeg is generated to potentially replace BI, so use its DebugLoc.
+  NewNeg->setDebugLoc(BI->getDebugLoc());
   ToRedo.insert(NewNeg);
   return NewNeg;
 }
diff --git a/llvm/test/Transforms/Reassociate/preserve-debugloc.ll b/llvm/test/Transforms/Reassociate/preserve-debugloc.ll
new file mode 100644
index 00000000000000..ff1f8ac73410a4
--- /dev/null
+++ b/llvm/test/Transforms/Reassociate/preserve-debugloc.ll
@@ -0,0 +1,38 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+;; Tests that we preserve DebugLocs through reassociation of sub instructions.
+; RUN: opt < %s -passes=reassociate -S | FileCheck %s
+
+define void @foo(i64 %0) {
+; CHECK-LABEL: define void @foo(
+; CHECK-SAME: i64 [[TMP0:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[DOTNEG:%.*]] = sub i64 0, [[TMP0]], !dbg [[DBG3:![0-9]+]]
+; CHECK-NEXT:    [[ADD_I_I:%.*]] = add i64 [[DOTNEG]], 1
+; CHECK-NEXT:    store i64 [[ADD_I_I]], ptr null, align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  %sub5.i.i = sub i64 1, %0, !dbg !4
+  %add.i.i = add i64 %sub5.i.i, 0
+  store i64 %add.i.i, ptr null, align 8
+  ret void
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 20.0.0git", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "test.cpp", directory: "/tmp")
+!2 = !{}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = !DILocation(line: 212, column: 25, scope: !5)
+!5 = distinct !DISubprogram(name: "foo", scope: !0, file: !1, line: 161, type: !6, scopeLine: 162, unit: !0, retainedNodes: !2)
+!6 = distinct !DISubroutineType(types: !2)
+;.
+; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: [[META1:![0-9]+]], producer: "{{.*}}clang version {{.*}}", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+; CHECK: [[META1]] = !DIFile(filename: "test.cpp", directory: {{.*}})
+; CHECK: [[DBG3]] = !DILocation(line: 212, column: 25, scope: [[META4:![0-9]+]])
+; CHECK: [[META4]] = distinct !DISubprogram(name: "foo", scope: [[META0]], file: [[META1]], line: 161, type: [[META5:![0-9]+]], scopeLine: 162, spFlags: DISPFlagDefinition, unit: [[META0]], retainedNodes: [[META6:![0-9]+]])
+; CHECK: [[META5]] = distinct !DISubroutineType(types: [[META6]])
+; CHECK: [[META6]] = !{}
+;.



More information about the llvm-commits mailing list