private void resetCanBeAvail(final ExprInfo exprInfo, final Phi phi) {
		phi.setCanBeAvail(false);

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

		// Iterate over every PHI-statement, other, that uses the
		// the "h" defined by phi as an operand...

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

			final Phi other = exprInfo.exprPhiAtBlock(block);

			if (other == null) {
				continue;
			}

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

			while (e.hasNext()) {
				final Block pred = (Block) e.next();

				final Def operand = other.operandAt(pred);

				// For each use of the "h" defined by exprInfo...
				if (operand == phi) {
					if (other.hasRealUse(pred)) {
						continue;
					}

					// If the use does not have a real use, set the use to tack
					// (bottom).
					other.setOperandAt(pred, null);

					// Since we changed other (by setting one of its operands to
					// tack), if other is not down safe, propagate this
					// information
					// back up the CFG by resetting its cba.
					if (!other.downSafe() && other.canBeAvail()) {
						resetCanBeAvail(exprInfo, other);
					}
				}
			}
		}
	}