public HashMap<Integer, SSAorConst> copyPropagate(HashMap<Integer, SSAorConst> propagation) {

		HashMap<Integer, SSAorConst> returnPropagation = new HashMap<Integer, SSAorConst>(
				propagation);
		Iterator<SSAInstruction> iter = instructions.iterator();
		while (iter.hasNext()) {
			SSAInstruction curIns = iter.next();
			if (curIns.getOP() == OP.MOVE) {
				SSAorConst src = curIns.getSrc();
				while (!src.isConst()
						&& returnPropagation.containsKey(src.getSSAVar().getVersion())) {
					src = returnPropagation.get(src.getSSAVar().getVersion());
				}
				returnPropagation.put(curIns.getId(), src);
				iter.remove();
				continue;
			}
			// normal instruction
			curIns.copyPropagate(returnPropagation);
			if (Instruction.ARITHMETIC_SET.contains(curIns.getOP()) && curIns.isConstExpression()) {
				// copy propagate const value again
				returnPropagation.put(curIns.getId(),
						new SSAorConst(curIns.computeArithmeticValue()));
				iter.remove();
			}
		}
		return returnPropagation;
	}