diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h index 6ac768b51395c..cb87a44980321 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 03b74b0480f07..a1d2923df16c4 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 fcd3f77f8f6e2..a7c16ba38a41a 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 717e33f1857b8..d7bf1447921fe 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 2a1ac85ee55bf..ea64ac2a68cf4 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 39bf14b062e1e..94e451327b214 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 83887397459db..19558a227b9f7 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: