SIL: simplify deleting instruction while iterating over instructions.

Add `deletableInstructions()` and `reverseDeletableInstructions()` in SILBasicBlock.
It allows deleting instructions while iterating over all instructions of the block.
This is a replacement for `InstructionDeleter::updatingRange()`.
It's a simpler implementation than the existing `UpdatingListIterator` and `UpdatingInstructionIteratorRegistry`, because it just needs to keep the prev/next pointers for "deleted" instructions instead of the iterator-registration machinery.
It's also safer, because it doesn't require to delete instructions via a specific instance of an InstructionDeleter (which can be missed easily).
This commit is contained in:
Erik Eckstein
2022-12-02 15:21:23 +01:00
parent 05a63c70c5
commit c180d1363e
12 changed files with 143 additions and 339 deletions

View File

@@ -72,9 +72,9 @@ private:
for (SILBasicBlock &block : function) {
InstructionDeleter deleter;
for (SILInstruction *inst : deleter.updatingRange(&block)) {
if (constFold(inst, IGM)) {
deleter.forceDelete(inst);
for (SILInstruction &inst : block.deletableInstructions()) {
if (constFold(&inst, IGM)) {
deleter.forceDelete(&inst);
changed = true;
}
}