[llvm] [DebugInfo][RemoveDIs] "Final" cleanup for non-instr debug-info (PR #79121)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 23 03:37:36 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Jeremy Morse (jmorse)
<details>
<summary>Changes</summary>
Here's a raft of minor fixes for the RemoveDIs project that's replacing dbg.value intrinsics with DPValue objects, all IMO trivial:
* When inserting functions or blocks and calling setIsNewDbgInfoFormat, do that after setting the Parent pointer, just in case conversion from (or to) dbg.value mode is triggered.
* When transferring DPValues from an empty range in a splice call, don't transfer if there are no DPValues attached to the source block at all.
* stripNonLineTableDebugInfo should drop DPValues.
* In insertBefore, don't try to transfer DPValues if there aren't any.
* Replace a DIArgList operand with Poison, not Undef, in salvageDebugInfo to match past dbg.value behaviour.
These all cause minor variations in test outputs that we're looking to suppress before turning RemoveDIs on, or some obvious risk of crashing. I've added --try-experimental-debuginfo-iterator runlines to tests that clearly stimulate this -- the deeper modifications aren't easily reachable alas.
---
Full diff: https://github.com/llvm/llvm-project/pull/79121.diff
7 Files Affected:
- (modified) llvm/include/llvm/IR/Function.h (+2-1)
- (modified) llvm/lib/IR/BasicBlock.cpp (+11-5)
- (modified) llvm/lib/IR/DebugInfo.cpp (+3)
- (modified) llvm/lib/IR/Instruction.cpp (+3-3)
- (modified) llvm/lib/Transforms/Utils/Local.cpp (+1-1)
- (modified) llvm/test/DebugInfo/salvage-limit-expr-size.ll (+1)
- (modified) llvm/test/Transforms/Util/strip-nonlinetable-debuginfo-localvars.ll (+1)
``````````diff
diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index 6ac768b51395cc..cb87a44980321a 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/include/llvm/IR/Function.h
@@ -722,8 +722,9 @@ class LLVM_EXTERNAL_VISIBILITY Function : public GlobalObject,
/// Insert \p BB in the basic block list at \p Position. \Returns an iterator
/// to the newly inserted BB.
Function::iterator insert(Function::iterator Position, BasicBlock *BB) {
+ Function::iterator FIt = BasicBlocks.insert(Position, BB);
BB->setIsNewDbgInfoFormat(IsNewDbgInfoFormat);
- return BasicBlocks.insert(Position, BB);
+ return FIt;
}
/// Transfer all blocks from \p FromF to this function at \p ToIt.
diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp
index 03b74b0480f071..a1d2923df16c47 100644
--- a/llvm/lib/IR/BasicBlock.cpp
+++ b/llvm/lib/IR/BasicBlock.cpp
@@ -240,12 +240,12 @@ void BasicBlock::insertInto(Function *NewParent, BasicBlock *InsertBefore) {
assert(NewParent && "Expected a parent");
assert(!Parent && "Already has a parent");
- setIsNewDbgInfoFormat(NewParent->IsNewDbgInfoFormat);
-
if (InsertBefore)
NewParent->insert(InsertBefore->getIterator(), this);
else
NewParent->insert(NewParent->end(), this);
+
+ setIsNewDbgInfoFormat(NewParent->IsNewDbgInfoFormat);
}
BasicBlock::~BasicBlock() {
@@ -824,9 +824,15 @@ void BasicBlock::spliceDebugInfoEmptyBlock(BasicBlock::iterator Dest,
// There are instructions in this block; if the First iterator was
// with begin() / getFirstInsertionPt() then the caller intended debug-info
- // at the start of the block to be transferred.
- if (!Src->empty() && First == Src->begin() && ReadFromHead)
- Dest->DbgMarker->absorbDebugValues(*First->DbgMarker, InsertAtHead);
+ // at the start of the block to be transferred. Return otherwise.
+ if (Src->empty() || First != Src->begin() || !ReadFromHead)
+ return;
+
+ // Is there actually anything to transfer?
+ if (!First->hasDbgValues())
+ return;
+
+ createMarker(Dest)->absorbDebugValues(*First->DbgMarker, InsertAtHead);
return;
}
diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp
index fcd3f77f8f6e2b..a7c16ba38a41aa 100644
--- a/llvm/lib/IR/DebugInfo.cpp
+++ b/llvm/lib/IR/DebugInfo.cpp
@@ -892,6 +892,9 @@ bool llvm::stripNonLineTableDebugInfo(Module &M) {
// Strip heapallocsite attachments, they point into the DIType system.
if (I.hasMetadataOtherThanDebugLoc())
I.setMetadata("heapallocsite", nullptr);
+
+ // Strip any DPValues attached.
+ I.dropDbgValues();
}
}
}
diff --git a/llvm/lib/IR/Instruction.cpp b/llvm/lib/IR/Instruction.cpp
index 717e33f1857b8a..d7bf1447921fec 100644
--- a/llvm/lib/IR/Instruction.cpp
+++ b/llvm/lib/IR/Instruction.cpp
@@ -146,9 +146,9 @@ void Instruction::insertBefore(BasicBlock &BB,
bool InsertAtHead = InsertPos.getHeadBit();
if (!InsertAtHead) {
DPMarker *SrcMarker = BB.getMarker(InsertPos);
- if (!SrcMarker)
- SrcMarker = BB.createMarker(InsertPos);
- DbgMarker->absorbDebugValues(*SrcMarker, false);
+ // If there's no source marker, InsertPos is very likely end().
+ if (SrcMarker)
+ DbgMarker->absorbDebugValues(*SrcMarker, false);
}
// If we're inserting a terminator, check if we need to flush out
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index 2a1ac85ee55bf5..ea64ac2a68cf40 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -2340,7 +2340,7 @@ void llvm::salvageDebugInfoForDbgValues(
// currently only valid for stack value expressions.
// Also do not salvage if the resulting DIArgList would contain an
// unreasonably large number of values.
- Value *Undef = UndefValue::get(I.getOperand(0)->getType());
+ Value *Undef = PoisonValue::get(I.getOperand(0)->getType());
DPV->replaceVariableLocationOp(I.getOperand(0), Undef);
}
LLVM_DEBUG(dbgs() << "SALVAGE: " << DPV << '\n');
diff --git a/llvm/test/DebugInfo/salvage-limit-expr-size.ll b/llvm/test/DebugInfo/salvage-limit-expr-size.ll
index 39bf14b062e1e3..94e451327b2148 100644
--- a/llvm/test/DebugInfo/salvage-limit-expr-size.ll
+++ b/llvm/test/DebugInfo/salvage-limit-expr-size.ll
@@ -1,4 +1,5 @@
; RUN: opt %s -passes=dce -S | FileCheck %s
+; RUN: opt %s -passes=dce -S --try-experimental-debuginfo-iterators | FileCheck %s
;; Tests that a DIExpression will only be salvaged up to a certain length, and
;; will produce an undef value if an expression would need to exceed that length.
diff --git a/llvm/test/Transforms/Util/strip-nonlinetable-debuginfo-localvars.ll b/llvm/test/Transforms/Util/strip-nonlinetable-debuginfo-localvars.ll
index 83887397459db6..19558a227b9f71 100644
--- a/llvm/test/Transforms/Util/strip-nonlinetable-debuginfo-localvars.ll
+++ b/llvm/test/Transforms/Util/strip-nonlinetable-debuginfo-localvars.ll
@@ -1,4 +1,5 @@
; RUN: opt -S -passes=strip-nonlinetable-debuginfo %s -o - | FileCheck %s
+; RUN: opt -S -passes=strip-nonlinetable-debuginfo %s -o - --try-experimental-debuginfo-iterators | FileCheck %s
; CHECK: define void @f() !dbg ![[F:[0-9]+]]
define void @f() !dbg !4 {
entry:
``````````
</details>
https://github.com/llvm/llvm-project/pull/79121
More information about the llvm-commits
mailing list