Skip to content

Commit

Permalink
[RemoveDIs] Simplify spliceDebugInfo, fixing splice-to-end edge case (l…
Browse files Browse the repository at this point in the history
…lvm#105670)

Not quite NFC, fixes splitBasicBlockBefore case when we split before an
instruction with debug records (but without the headBit set, i.e., we are
splitting before the instruction but after the debug records that come before
it). splitBasicBlockBefore splices the instructions before the split point into
a new block. Prior to this patch, the debug records would get shifted up to the
front of the spliced instructions (as seen in the modified unittest - I believe
the unittest was checking erroneous behaviour). We instead want to leave those
debug records at the end of the spliced instructions.

The functionality of the deleted `else if` branch is covered by the remaining
`if` now that `DestMarker` is set to the trailing marker if `Dest` is `end()`.
Previously the "===" markers were sometimes detached, now we always detach
them and always reattach them.

Note: `deleteTrailingDbgRecords` only "unlinks" the tailing marker from the
block, it doesn't delete anything. The trailing marker is still cleaned up
properly inside the final `if` body with `DestMarker->eraseFromParent();`.

Part 1 of 2 needed for llvm#105571
  • Loading branch information
OCHyams authored Aug 28, 2024
1 parent a5b6068 commit f581553
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 16 deletions.
24 changes: 10 additions & 14 deletions llvm/lib/IR/BasicBlock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -961,9 +961,13 @@ void BasicBlock::spliceDebugInfoImpl(BasicBlock::iterator Dest, BasicBlock *Src,
// Detach the marker at Dest -- this lets us move the "====" DbgRecords
// around.
DbgMarker *DestMarker = nullptr;
if (Dest != end()) {
if ((DestMarker = getMarker(Dest)))
if ((DestMarker = getMarker(Dest))) {
if (Dest == end()) {
assert(DestMarker == getTrailingDbgRecords());
deleteTrailingDbgRecords();
} else {
DestMarker->removeFromParent();
}
}

// If we're moving the tail range of DbgRecords (":::"), absorb them into the
Expand Down Expand Up @@ -1005,22 +1009,14 @@ void BasicBlock::spliceDebugInfoImpl(BasicBlock::iterator Dest, BasicBlock *Src,
} else {
// Insert them right at the start of the range we moved, ahead of First
// and the "++++" DbgRecords.
// This also covers the rare circumstance where we insert at end(), and we
// did not generate the iterator with begin() / getFirstInsertionPt(),
// meaning any trailing debug-info at the end of the block would
// "normally" have been pushed in front of "First". We move it there now.
DbgMarker *FirstMarker = createMarker(First);
FirstMarker->absorbDebugValues(*DestMarker, true);
}
DestMarker->eraseFromParent();
} else if (Dest == end() && !InsertAtHead) {
// In the rare circumstance where we insert at end(), and we did not
// generate the iterator with begin() / getFirstInsertionPt(), it means
// any trailing debug-info at the end of the block would "normally" have
// been pushed in front of "First". Move it there now.
DbgMarker *TrailingDbgRecords = getTrailingDbgRecords();
if (TrailingDbgRecords) {
DbgMarker *FirstMarker = createMarker(First);
FirstMarker->absorbDebugValues(*TrailingDbgRecords, true);
TrailingDbgRecords->eraseFromParent();
deleteTrailingDbgRecords();
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions llvm/unittests/IR/BasicBlockDbgInfoTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,11 +141,11 @@ TEST(BasicBlockDbgInfoTest, SplitBasicBlockBefore) {
Function *F = M->getFunction("func");

BasicBlock &BB = F->getEntryBlock();
auto I = std::prev(BB.end(), 2);
auto I = std::prev(BB.end(), 2); // store i32 2, ptr %1.
BB.splitBasicBlockBefore(I, "before");

BasicBlock &BBBefore = F->getEntryBlock();
auto I2 = std::prev(BBBefore.end(), 2);
auto I2 = std::prev(BBBefore.end()); // br label %1 (new).
ASSERT_TRUE(I2->hasDbgRecords());
}

Expand Down

0 comments on commit f581553

Please sign in to comment.