boolean propExpr(final Block block, final LocalExpr lhs, final Expr rhs) {
		if (ExprPropagation.DEBUG) {
			System.out.println("prop " + rhs + " to uses of " + lhs);
			System.out.println("    uses of lhs = " + lhs.uses());
		}

		if (rhs instanceof LocalExpr) {
			// We can't prop a local to a PhiStmt operand, so don't bother
			// doing the propagation at all.
			Iterator e = lhs.uses().iterator();

			while (e.hasNext()) {
				final LocalExpr use = (LocalExpr) e.next();

				if (use.parent() instanceof PhiStmt) {
					return false;
				}
			}

			// Replaces all uses of the lhs with the rhs. Both are local
			// variables.
			e = lhs.uses().iterator();

			while (e.hasNext()) {
				final LocalExpr use = (LocalExpr) e.next();
				use.replaceWith((Expr) rhs.clone());
			}

			return true;

		} else {
			boolean replacedAll = true;

			final Iterator e = lhs.uses().iterator();

			while (e.hasNext()) {
				final LocalExpr use = (LocalExpr) e.next();

				if (use.parent() instanceof PhiCatchStmt) {
					replacedAll = false;
				} else {
					use.replaceWith((Expr) rhs.clone());
				}
			}

			return replacedAll;
		}
	}