Transform basic blocks that represent a single function. The result of the transform will be collected at self.builder.blocks.
(self, blocks: list[BasicBlock])
| 77 | self.op_map: dict[Value, Value | None] = {} |
| 78 | |
| 79 | def transform_blocks(self, blocks: list[BasicBlock]) -> None: |
| 80 | """Transform basic blocks that represent a single function. |
| 81 | |
| 82 | The result of the transform will be collected at self.builder.blocks. |
| 83 | """ |
| 84 | block_map: dict[BasicBlock, BasicBlock] = {} |
| 85 | op_map = self.op_map |
| 86 | empties = set() |
| 87 | for block in blocks: |
| 88 | new_block = BasicBlock() |
| 89 | block_map[block] = new_block |
| 90 | self.builder.activate_block(new_block) |
| 91 | new_block.error_handler = block.error_handler |
| 92 | for op in block.ops: |
| 93 | new_op = op.accept(self) |
| 94 | if new_op is not op: |
| 95 | op_map[op] = new_op |
| 96 | # A transform can produce empty blocks which can be removed. |
| 97 | if is_empty_block(new_block) and not is_empty_block(block): |
| 98 | empties.add(new_block) |
| 99 | self.builder.blocks = [block for block in self.builder.blocks if block not in empties] |
| 100 | # Update all op/block references to point to the transformed ones. |
| 101 | patcher = PatchVisitor(op_map, block_map) |
| 102 | for block in self.builder.blocks: |
| 103 | for op in block.ops: |
| 104 | op.accept(patcher) |
| 105 | if block.error_handler is not None: |
| 106 | block.error_handler = block_map.get(block.error_handler, block.error_handler) |
| 107 | |
| 108 | def add(self, op: Op) -> Value: |
| 109 | return self.builder.add(op) |
no test coverage detected