Fix Block::eraseArguments: keep track the first removed element while removing
authorMehdi Amini <joker.eph@gmail.com>
Sat, 27 Feb 2021 19:18:09 +0000 (19:18 +0000)
committerMehdi Amini <joker.eph@gmail.com>
Sat, 27 Feb 2021 19:18:09 +0000 (19:18 +0000)
Not only this is likely more efficient than BitVector::find_first(), but
also if the BitVector is empty find_first() returns -1, which
llvm::drop_begin isn't robust against.

mlir/lib/IR/Block.cpp

index 0758d1e..53797aa 100644 (file)
@@ -192,15 +192,17 @@ void Block::eraseArguments(llvm::BitVector eraseIndices) {
   // We do this in reverse so that we erase later indices before earlier
   // indices, to avoid shifting the later indices.
   unsigned originalNumArgs = getNumArguments();
+  int64_t firstErased = originalNumArgs;
   for (unsigned i = 0; i < originalNumArgs; ++i) {
     int64_t currentPos = originalNumArgs - i - 1;
     if (eraseIndices.test(currentPos)) {
       arguments[currentPos].destroy();
       arguments.erase(arguments.begin() + currentPos);
+      firstErased = currentPos;
     }
   }
   // Update the cached position for the arguments after the first erased one.
-  int64_t index = eraseIndices.find_first();
+  int64_t index = firstErased;
   for (BlockArgument arg : llvm::drop_begin(arguments, index))
     arg.setArgNumber(index++);
 }