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

via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 30 06:23:15 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-debuginfo

Author: Stephen Tozer (SLTozer)

<details>
<summary>Changes</summary>

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.

---
Full diff: https://github.com/llvm/llvm-project/pull/114226.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/Scalar/Reassociate.cpp (+2) 
- (added) llvm/test/Transforms/Reassociate/preserve-debugloc.ll (+38) 


``````````diff
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]] = !{}
+;.

``````````

</details>


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


More information about the llvm-commits mailing list