| 1234567891011121314151617181920212223242526272829303132 |
- """Find basic blocks that are likely to be executed frequently.
- For example, this would not include blocks that have exception handlers.
- We can use different optimization heuristics for common and rare code. For
- example, we can make IR fast to compile instead of fast to execute for rare
- code.
- """
- from __future__ import annotations
- from mypyc.ir.ops import BasicBlock, Branch, Goto
- def frequently_executed_blocks(entry_point: BasicBlock) -> set[BasicBlock]:
- result: set[BasicBlock] = set()
- worklist = [entry_point]
- while worklist:
- block = worklist.pop()
- if block in result:
- continue
- result.add(block)
- t = block.terminator
- if isinstance(t, Goto):
- worklist.append(t.label)
- elif isinstance(t, Branch):
- if t.rare or t.traceback_entry is not None:
- worklist.append(t.false)
- else:
- worklist.append(t.true)
- worklist.append(t.false)
- return result
|