[CodeGen] Fix for MachineBasicBlock::rfindDebugLoc(instr_rend())
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Thu, 25 May 2023 10:57:33 +0000 (12:57 +0200)
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Thu, 25 May 2023 12:48:52 +0000 (14:48 +0200)
Make sure we do not crash in rfindDebugLoc when starting at
instr_rend(). Solution is to see it as we start one MI before the
first MI, so we can start searching forward at instr_begin()
instead.

This behavior is similar to how findPrevDebugLoc(instr_end()) works.

Differential Revision: https://reviews.llvm.org/D150577

llvm/lib/CodeGen/MachineBasicBlock.cpp
llvm/unittests/CodeGen/MachineBasicBlockTest.cpp

index 1e92318..6a1d5ee 100644 (file)
@@ -1474,6 +1474,8 @@ MachineBasicBlock::findDebugLoc(instr_iterator MBBI) {
 }
 
 DebugLoc MachineBasicBlock::rfindDebugLoc(reverse_instr_iterator MBBI) {
+  if (MBBI == instr_rend())
+    return findDebugLoc(instr_begin());
   // Skip debug declarations, we don't want a DebugLoc from them.
   MBBI = skipDebugInstructionsBackward(MBBI, instr_rbegin());
   if (!MBBI->isDebugInstr())
index e88b21c..3dd2235 100644 (file)
@@ -56,9 +56,8 @@ TEST(FindDebugLocTest, DifferentIterators) {
   EXPECT_EQ(DL0, MBB.findDebugLoc(MBB.instr_begin()));
   EXPECT_EQ(DL0, MBB.findDebugLoc(MBB.instr_end()));
 
-  // FIXME: This would crash (see https://reviews.llvm.org/D150577).
-  //EXPECT_EQ(DL0, MBB.rfindDebugLoc(MBB.instr_rbegin()));
-  //EXPECT_EQ(DL0, MBB.rfindDebugLoc(MBB.instr_rend()));
+  EXPECT_EQ(DL0, MBB.rfindDebugLoc(MBB.instr_rbegin()));
+  EXPECT_EQ(DL0, MBB.rfindDebugLoc(MBB.instr_rend()));
 
   EXPECT_EQ(DL0, MBB.findPrevDebugLoc(MBB.instr_begin()));
   EXPECT_EQ(DL0, MBB.findPrevDebugLoc(MBB.instr_end()));
@@ -84,8 +83,7 @@ TEST(FindDebugLocTest, DifferentIterators) {
   EXPECT_EQ(DL3, MBB.findDebugLoc(MI3));
   EXPECT_EQ(DL0, MBB.findDebugLoc(MBB.instr_end()));
 
-  // FIXME: This would crash (see https://reviews.llvm.org/D150577).
-  //EXPECT_EQ(DL1, MBB.rfindDebugLoc(MBB.instr_rend()));
+  EXPECT_EQ(DL1, MBB.rfindDebugLoc(MBB.instr_rend()));
   EXPECT_EQ(DL1, MBB.rfindDebugLoc(MI1));
   EXPECT_EQ(DL3, MBB.rfindDebugLoc(MI2));
   EXPECT_EQ(DL3, MBB.rfindDebugLoc(MI3));