private static OrdinalSet<InstanceKey> findReachableInstances(
      final PointerAnalysis<InstanceKey> pts, final PointerKey pkStart) {
    final HeapGraph hg = pts.getHeapGraph();
    if (!hg.containsNode(pkStart)) {
      return OrdinalSet.empty();
    }

    final OrdinalSetMapping<InstanceKey> mapping = pts.getInstanceKeyMapping();

    final BitVectorIntSet resultSet = new BitVectorIntSet();

    final NumberedDFSDiscoverTimeIterator<Object> dfsDiscover =
        new NumberedDFSDiscoverTimeIterator<Object>(hg, pkStart);
    while (dfsDiscover.hasNext()) {
      Object obj = dfsDiscover.next();
      if (obj instanceof InstanceKey) {
        InstanceKey ik = (InstanceKey) obj;
        final int ikNum = mapping.getMappedIndex(ik);
        resultSet.add(ikNum);
      }
    }

    final OrdinalSet<InstanceKey> reachable = new OrdinalSet<InstanceKey>(resultSet, mapping);

    return reachable;
  }
 public void addSubgraphForNode(CGNode node) {
   int n = cg.getNumber(node);
   if (!cgNodesVisited.contains(n)) {
     cgNodesVisited.add(n);
     unconditionallyAddConstraintsFromNode(node);
     addNodesForParameters(node);
   }
 }