private Collection idf(final Collection blocks, boolean reverse) {
		if (domEdgeModCount != edgeModCount) {
			computeDominators();
		}

		final HashSet idf = new HashSet();

		final HashSet inWorklist = new HashSet(blocks);
		final LinkedList worklist = new LinkedList(inWorklist);

		while (!worklist.isEmpty()) {
			final Block block = (Block) worklist.removeFirst();

			Collection df;

			if (!reverse) {
				df = block.domFrontier();
			} else {
				df = block.pdomFrontier();
			}

			final Iterator iter = df.iterator();

			while (iter.hasNext()) {
				final Block dfBlock = (Block) iter.next();
				idf.add(dfBlock);

				if (inWorklist.add(dfBlock)) {
					worklist.add(dfBlock);
				}
			}
		}

		return idf;
	}