private void placePhiFunctions(final ExprInfo exprInfo) {
		final ArrayList w = new ArrayList(cfg.size());

		final Iterator uses = exprInfo.def().uses().iterator();

		w.add(exprInfo.def().block());

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

			if (use.parent() instanceof PhiJoinStmt) {
				final PhiJoinStmt phi = (PhiJoinStmt) use.parent();

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

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

					if (phi.operandAt(pred) == use) {
						w.add(pred);
						break;
					}
				}
			} else if (!(use.parent() instanceof PhiCatchStmt)) {
				w.add(use.block());
			}
		}

		final Iterator df = cfg.iteratedDomFrontier(w).iterator();

		while (df.hasNext()) {
			final Block block = (Block) df.next();
			exprInfo.addPhi(block);
		}

		// Don't bother with placing phis for catch blocks, since the
		// operand stack is zeroed at catch blocks.
	}