if (DEBUG) debug(block, logicalPred, edge, "Meet " + start + " with " + predFact); analysis.meetInto(predFact, edge, start);
if (DEBUG) debug(block, logicalPred, edge, "Meet " + start + " with " + edgeFact); analysis.meetInto(edgeFact, edge, start);
	public void execute() throws DataflowAnalysisException {		boolean change;		if (DEBUG) {			String shortAnalysisName = analysis.getClass().getName();			int pkgEnd = shortAnalysisName.lastIndexOf('.');			if (pkgEnd >= 0) {				shortAnalysisName = shortAnalysisName.substring(pkgEnd + 1);			}			System.out.println("Executing " + shortAnalysisName + " on " + cfg.getMethodName());		}		do {			change = false;			++numIterations;			if (DEBUG) {				System.out.println("----------------------------------------------------------------------");				System.out.println("Dataflow iteration " + numIterations);				System.out.println("----------------------------------------------------------------------");			}			if (numIterations >= MAX_ITERS)				throw new DataflowAnalysisException("Too many iterations (" + numIterations + ") in dataflow!");				analysis.startIteration();						// For each block in CFG...			Iterator<BasicBlock> i = blockOrder.blockIterator();			while (i.hasNext()) {				BasicBlock block = i.next();				if (DEBUG) debug(block, "start\n");					// Get start fact for block.				Fact start = analysis.getStartFact(block);				analysis.makeFactTop(start);					// Meet all of the logical predecessor results into this block's start.				// Special case: if the block is the logical entry, then it gets				// the special "entry fact".				if (block == logicalEntryBlock()) {					analysis.initEntryFact(start);					if (DEBUG) debug(block, "Init entry fact ==> " + start + "\n");				} else {					Iterator<Edge> predEdgeIter = logicalPredecessorEdgeIterator(block);					while (predEdgeIter.hasNext()) {						Edge edge = predEdgeIter.next();						BasicBlock logicalPred = isForwards ? edge.getSource() : edge.getTarget();						Fact predFact = analysis.getResultFact(logicalPred);						if (DEBUG) debug(block, logicalPred, edge, "Meet " + start + " with " + predFact);						analysis.meetInto(predFact, edge, start);						if (DEBUG) System.out.println(" ==> " + start);					}				}				if (DEBUG) debug(block, "start fact is " + start + "\n");					// Get result facts for block,				// making a copy of it (so we can detect if it changed).				Fact result = analysis.getResultFact(block);				Fact origResult = analysis.createFact();				analysis.copy(result, origResult);					// Apply the transfer function.				analysis.transfer(block, null, start, result);				if (DEBUG && SystemProperties.getBoolean("dataflow.blockdebug")) {					debug(block, "Dumping flow values for block:\n");					Iterator<org.apache.bcel.generic.InstructionHandle> ii = block.instructionIterator();					while (ii.hasNext()) {						org.apache.bcel.generic.InstructionHandle handle = ii.next();						Fact tmpResult = analysis.createFact();						analysis.transfer(block, handle, start, tmpResult);						System.out.println("\t" + handle + " " + tmpResult);					}				}					// See if the result changed.				if (DEBUG) debug(block, "orig result is " + origResult + "\n");				if (!analysis.same(result, origResult)) {					if (DEBUG) debug(block, "result changed!\n");					change = true;				}				if (DEBUG) debug(block, "result is " + result + "\n");			}						analysis.finishIteration();		} while (change);	}