[llvm] [Reassociate][DebugInfo] Salvage debug info before rewriting expression (PR #182730)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 22 00:18:10 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Shivam Kunwar (phyBrackets)
<details>
<summary>Changes</summary>
When RewriteExprTree modifies instruction operands, call `salvageDebugInfo()` before `setOperand()` so debug value expressions are rewritten while original operands are still intact. This preserves variable accessibility in debuggers instead of dropping values to poison.
Fixes #<!-- -->60532
Fixes #<!-- -->61272
---
Full diff: https://github.com/llvm/llvm-project/pull/182730.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/Scalar/Reassociate.cpp (+4)
- (modified) llvm/test/Transforms/Reassociate/reassociate_dbgvalue_discard.ll (+7-7)
``````````diff
diff --git a/llvm/lib/Transforms/Scalar/Reassociate.cpp b/llvm/lib/Transforms/Scalar/Reassociate.cpp
index 010ff6e1fa5b4..31486cbd0b3bb 100644
--- a/llvm/lib/Transforms/Scalar/Reassociate.cpp
+++ b/llvm/lib/Transforms/Scalar/Reassociate.cpp
@@ -636,12 +636,14 @@ void ReassociatePass::RewriteExprTree(BinaryOperator *I,
BinaryOperator *BO = isReassociableOp(OldLHS, Opcode);
if (BO && !NotRewritable.count(BO))
NodesToRewrite.push_back(BO);
+ salvageDebugInfo(*Op);
Op->setOperand(0, NewLHS);
}
if (NewRHS != OldRHS) {
BinaryOperator *BO = isReassociableOp(OldRHS, Opcode);
if (BO && !NotRewritable.count(BO))
NodesToRewrite.push_back(BO);
+ salvageDebugInfo(*Op);
Op->setOperand(1, NewRHS);
}
LLVM_DEBUG(dbgs() << "TO: " << *Op << '\n');
@@ -669,6 +671,7 @@ void ReassociatePass::RewriteExprTree(BinaryOperator *I,
BinaryOperator *BO = isReassociableOp(Op->getOperand(1), Opcode);
if (BO && !NotRewritable.count(BO))
NodesToRewrite.push_back(BO);
+ salvageDebugInfo(*Op);
Op->setOperand(1, NewRHS);
ExpressionChangedStart = Op;
if (!ExpressionChangedEnd)
@@ -707,6 +710,7 @@ void ReassociatePass::RewriteExprTree(BinaryOperator *I,
}
LLVM_DEBUG(dbgs() << "RA: " << *Op << '\n');
+ salvageDebugInfo(*Op);
Op->setOperand(0, NewOp);
LLVM_DEBUG(dbgs() << "TO: " << *Op << '\n');
ExpressionChangedStart = Op;
diff --git a/llvm/test/Transforms/Reassociate/reassociate_dbgvalue_discard.ll b/llvm/test/Transforms/Reassociate/reassociate_dbgvalue_discard.ll
index 7f617d145b840..b0c5d2b3113b5 100644
--- a/llvm/test/Transforms/Reassociate/reassociate_dbgvalue_discard.ll
+++ b/llvm/test/Transforms/Reassociate/reassociate_dbgvalue_discard.ll
@@ -11,14 +11,14 @@ target triple = "x86_64-unknown-linux-gnu"
define dso_local i32 @test1(i32 %a, i32 %b, i32 %c, i32 %d) local_unnamed_addr #0 !dbg !7 {
; CHECK-LABEL: @test1(
; CHECK-NEXT: entry:
-; CHECK-NEXT: #dbg_value(i32 poison, [[META16:![0-9]+]], !DIExpression(), [[META20:![0-9]+]])
-; CHECK-NEXT: #dbg_value(i32 poison, [[META17:![0-9]+]], !DIExpression(), [[META21:![0-9]+]])
-; CHECK-NEXT: [[M1:%.*]] = mul i32 [[D:%.*]], [[C:%.*]], !dbg [[DBG22:![0-9]+]]
-; CHECK-NEXT: [[M3:%.*]] = mul i32 [[M1]], [[A:%.*]], !dbg [[DBG23:![0-9]+]]
-; CHECK-NEXT: #dbg_value(i32 [[M3]], [[META18:![0-9]+]], !DIExpression(), [[META24:![0-9]+]])
+; CHECK-NEXT: #dbg_value(!DIArgList(i32 [[A:%.*]], i32 [[C:%.*]]), [[META16:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_mul, DW_OP_stack_value), [[META20:![0-9]+]])
+; CHECK-NEXT: #dbg_value(!DIArgList(i32 [[B:%.*]], i32 [[C]]), [[META17:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_mul, DW_OP_stack_value), [[META21:![0-9]+]])
+; CHECK-NEXT: [[M1:%.*]] = mul i32 [[D:%.*]], [[C]], !dbg [[DBG22:![0-9]+]]
+; CHECK-NEXT: [[M3:%.*]] = mul i32 [[M1]], [[A]], !dbg [[DBG23:![0-9]+]]
+; CHECK-NEXT: #dbg_value(!DIArgList(i32 [[A]], i32 [[D]], i32 [[C]]), [[META18:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 2, DW_OP_mul, DW_OP_LLVM_arg, 1, DW_OP_mul, DW_OP_stack_value), [[META24:![0-9]+]])
; CHECK-NEXT: [[M2:%.*]] = mul i32 [[D]], [[C]], !dbg [[DBG25:![0-9]+]]
-; CHECK-NEXT: [[M4:%.*]] = mul i32 [[M2]], [[B:%.*]], !dbg [[DBG26:![0-9]+]]
-; CHECK-NEXT: #dbg_value(i32 [[M4]], [[META19:![0-9]+]], !DIExpression(), [[META27:![0-9]+]])
+; CHECK-NEXT: [[M4:%.*]] = mul i32 [[M2]], [[B]], !dbg [[DBG26:![0-9]+]]
+; CHECK-NEXT: #dbg_value(!DIArgList(i32 [[B]], i32 [[D]], i32 [[C]]), [[META19:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 2, DW_OP_mul, DW_OP_LLVM_arg, 1, DW_OP_mul, DW_OP_stack_value), [[META27:![0-9]+]])
; CHECK-NEXT: [[RES:%.*]] = xor i32 [[M3]], [[M4]]
; CHECK-NEXT: ret i32 [[RES]], !dbg [[DBG28:![0-9]+]]
;
``````````
</details>
https://github.com/llvm/llvm-project/pull/182730
More information about the llvm-commits
mailing list