public static void copyPropagateAndUpdateDominator(Block root, boolean update) {
		Queue<Entry<Block, HashMap<Integer, SSAorConst>>> queue = new LinkedList<Entry<Block, HashMap<Integer, SSAorConst>>>();
		HashMap<Integer, SSAorConst> propagator = new HashMap<Integer, SSAorConst>();
		queue.add(new AbstractMap.SimpleEntry<Block, HashMap<Integer, SSAorConst>>(root, root
				.copyPropagate(propagator)));

		while (!queue.isEmpty()) {
			Entry<Block, HashMap<Integer, SSAorConst>> entry = queue.remove();
			Block blk = entry.getKey();
			propagator = entry.getValue();
			if (blk == null) {// || visited.contains(blk)) {
				continue;
			}
			if (blk.getNextBlock() != null) {
				HashMap<Integer, SSAorConst> nextPropagator = blk.getNextBlock().copyPropagate(
						propagator);
				// continue if not the backedge
				if (!blk.getNextBlock().isBackEdgeFrom(blk)) {
					if (update) {
						blk.getNextBlock().updateDominator(blk);
					}
					queue.add(new AbstractMap.SimpleEntry<Block, HashMap<Integer, SSAorConst>>(blk
							.getNextBlock(), nextPropagator));
				}
			}
			if (blk.getNegBranchBlock() != null) {
				HashMap<Integer, SSAorConst> nextPropagator = blk.getNegBranchBlock()
						.copyPropagate(propagator);
				if (!blk.getNegBranchBlock().isBackEdgeFrom(blk)) {
					if (update) {
						blk.getNegBranchBlock().updateDominator(blk);
					}
					queue.add(new AbstractMap.SimpleEntry<Block, HashMap<Integer, SSAorConst>>(blk
							.getNegBranchBlock(), nextPropagator));
				}
			}
		}
	}