public void analyzeSet(Program program, AddressSet todoSet, TaskMonitor monitor)
			throws CancelledException {

		long totalNumAddresses = todoSet.getNumAddresses();
		monitor.initialize(totalNumAddresses);

		// Iterate over all new instructions
		// Evaluate each operand
		Listing listing = program.getListing();
		int count = 0;
		while (!todoSet.isEmpty()) {
			monitor.checkCancelled();

			if ((count++ % NOTIFICATION_INTERVAL) == 0) {
				monitor.setProgress(totalNumAddresses - todoSet.getNumAddresses());
			}

			// find the next instruction starting at the minimum addr in the set
			Address nextAddr = todoSet.getMinAddress();
			Instruction instr = listing.getInstructionAt(nextAddr);
			if (instr == null) {
				// no instr at min address, find the next after
				instr = listing.getInstructionAfter(nextAddr);
				if (instr == null) {
					break; // no more to do
				}

				// the instruction after could land outside the set,
				// but that will only happen once, then the
				// search will start again inside the set
				nextAddr = instr.getMinAddress();
				if (!todoSet.contains(nextAddr)) {
					todoSet.deleteFromMin(nextAddr);
					continue;
				}
			}

			Address start = instr.getMinAddress();
			AddressSetView resultSet = analyzeLocation(program, start, todoSet, monitor);
			if (resultSet != null) { // null sometimes when cancelled
				// if the first instruction found in todoSet, was past the beginning of
				// the todoSet, there will be no instructions before start
				if (!start.equals(todoSet.getMinAddress())) {
					// delete all addresses up to the start from the todo set
					todoSet.deleteFromMin(start);
				}
				// now get rid of all the instructions that were analyzed
				todoSet.delete(resultSet);
			}
		}
	}
Analyze all addresses in todoSet

@param program program
@param todoSet addresses that are not in functions
@param monitor to cancel

@throws CancelledException
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/ConstantPropagationAnalyzer.java