def METHOD_NAME(self):
    self._doms = {}
    # Start block dominates itself.
    self._doms[self._start_name] = self._start_name
    # We don't yet know what blocks dominate all other blocks.
    for block_name in range(self._start_name):
        self._doms[block_name] = None
    changed = True
    while changed:
        changed = False
        # For all blocks except start block, in reverse postorder...
        for block_name in reversed(range(self._start_name)):
            # Select a new immediate dominator from the blocks we have
            # already processed, and remember all others.
            # We've already processed at least one previous block because
            # of the graph traverse order.
            new_idom, prev_block_names = None, []
            for prev_block_name in self._prev_block_names(block_name):
                if new_idom is None and self._doms[prev_block_name] is not None:
                    new_idom = prev_block_name
                else:
                    prev_block_names.append(prev_block_name)
            # Find a common previous block
            for prev_block_name in prev_block_names:
                if self._doms[prev_block_name] is not None:
                    new_idom = self._intersect(prev_block_name, new_idom)
            if self._doms[block_name] != new_idom:
                self._doms[block_name] = new_idom
                changed = True