private void computeLater(final ExprInfo exprInfo) {
		Iterator blocks = cfg.nodes().iterator();

		// Initialize later to can be available...
		while (blocks.hasNext()) {
			final Block block = (Block) blocks.next();

			final Phi phi = exprInfo.exprPhiAtBlock(block);

			if (phi == null) {
				continue;
			}

			phi.setLater(phi.canBeAvail());
		}

		blocks = cfg.nodes().iterator();

		// Iterate over each PHI-statement, phi...

		while (blocks.hasNext()) {
			final Block block = (Block) blocks.next();

			final Phi phi = exprInfo.exprPhiAtBlock(block);

			if (phi == null) {
				continue;
			}

			if (!phi.later()) {
				continue;
			}

			final Iterator e = cfg.preds(block).iterator();

			// If later == true and there is an operand of phi that:
			// 1. is not tack
			// 2. has a real use
			// set later to false and propagate this information back up the
			// CFG.
			// Basically, what we're saying is that if an operand of the
			// PHI-statement has a real use, we want to evaluate the expression
			// now.

			while (e.hasNext()) {
				final Block pred = (Block) e.next();
				final Def operand = phi.operandAt(pred);

				if ((operand != null) && phi.hasRealUse(pred)) {
					resetLater(exprInfo, phi);
					break;
				}
			}
		}
	}