docs: def compute_dominance_frontier(graph, domtree):
      """
      Compute a dominance frontier based on the given post-dominator tree.
  
      This implementation is based on figure 2 of paper An Efficient Method of Computing Static Single Assignment
      Form by Ron Cytron, etc.
  
      :param graph:   The graph where we want to compute the dominance frontier.
      :param domtree: The dominator tree
      :returns:       A dict of dominance frontier
      """
  
      df = {}
  
      # Perform a post-order search on the dominator tree
      for x in networkx.dfs_postorder_nodes(domtree):
  
          if x not in graph:
              # Skip nodes that are not in the graph
              continue
  
          df[x] = set()
  
          # local set
          for y in graph.successors(x):
              if x not in domtree.predecessors(y):
                  df[x].add(y)
  
          # up set
          if x is None:
              continue
  
          for z in domtree.successors(x):
              if z is x:
                  continue
              if z not in df:
                  continue
              for y in df[z]:
                  if x not in list(domtree.predecessors(y)):
                      df[x].add(y)
  
      return df