[DebugInfo][RemoveDIs] Handle a debug-info splicing corner case (#73810)
commit37f2f48c8f43b2b98869a6e5f009d3d2471ecdaf
authorJeremy Morse <jeremy.morse@sony.com>
Wed, 20 Sep 2023 14:15:27 +0000 (20 15:15 +0100)
committerJeremy Morse <jeremy.morse@sony.com>
Fri, 1 Dec 2023 19:31:27 +0000 (1 19:31 +0000)
tree801abd6f17458a95b9332639ae728f1807e15b22
parentdeca8055d4f590047730df4a6806e06d623ef1ff
[DebugInfo][RemoveDIs] Handle a debug-info splicing corner case (#73810)

A large amount of complexity when it comes to shuffling DPValue objects
around is pushed into BasicBlock::spliceDebugInfo, and it gets
comprehensive testing there via the unit tests. It turns out that there's a
corner case though: splicing instructions and debug-info to the end()
iterator requires blocks of DPValues to be concatenated, but the DPValues
don't behave normally as they're dangling at the end of a block. While this
splicing-to-an-empty-block case is rare, and it's even rarer for it to
contain debug-info, it does happen occasionally.

Fix this by wrapping spliceDebugInfo with an outer layer that removes any
dangling DPValues in the destination block -- that way the main splicing
function (renamed to spliceDebugInfoImpl) doesn't need to worry about that
scenario. See the diagram in the added function for more info.
llvm/include/llvm/IR/BasicBlock.h
llvm/include/llvm/IR/DebugProgramInstruction.h
llvm/lib/IR/BasicBlock.cpp
llvm/unittests/IR/BasicBlockDbgInfoTest.cpp