docs: def make_phi_node(self, block_addr, *variables):
          """
          Create a phi variable for variables at block `block_addr`.
  
          :param int block_addr:  The address of the current block.
          :param variables:       Variables that the phi variable represents.
          :return:                The created phi variable.
          """
  
          existing_phis = set()
          non_phis = set()
          for var in variables:
              if self.is_phi_variable(var):
                  existing_phis.add(var)
              else:
                  non_phis.add(var)
          if len(existing_phis) == 1:
              existing_phi = next(iter(existing_phis))
              if non_phis.issubset(self.get_phi_subvariables(existing_phi)):
                  return existing_phi
              else:
                  # Update phi variables
                  self._phi_variables[existing_phi] |= non_phis
                  return existing_phi
  
          repre = next(iter(variables))
          repre_type = type(repre)
          if repre_type is SimRegisterVariable:
              ident_sort = 'register'
              a = SimRegisterVariable(repre.reg, repre.size, ident=self.next_variable_ident(ident_sort))
          elif repre_type is SimMemoryVariable:
              ident_sort = 'memory'
              a = SimMemoryVariable(repre.addr, repre.size, ident=self.next_variable_ident(ident_sort))
          elif repre_type is SimStackVariable:
              ident_sort = 'stack'
              a = SimStackVariable(repre.offset, repre.size, ident=self.next_variable_ident(ident_sort))
          else:
              raise TypeError('make_phi_node(): Unsupported variable type "%s".' % type(repre))
  
          # Keep a record of all phi variables
          self._phi_variables[a] = set(variables)
          self._phi_variables_by_block[block_addr].add(a)
  
          return a