private void analyze() {
		/**
		 * I want every value that could get written back out to the state, either because it's
		 * retired, or because the output operand is memory. I also need inputs to branches or to
		 * callother's, since those may have side effects depending on those inputs.
		 */

		Set<JitPhiOp> phisBefore = Set.copyOf(dfm.phiNodes());
		for (JitBlock block : cfm.getBlocks()) {

			for (PcodeOp op : block.getCode()) {
				if (dfm.getJitOp(op) instanceof JitCallOtherOpIf callother) {
					for (Varnode vn : getCallOtherRetireVarnodes(block, callother)) {
						// We only want the side effect: Adds needed phi.
						callother.dfState().getVar(vn); // Visit is later
					}
				}
			}

			for (Varnode vn : getCouldRetireVarnodes(block)) {
				JitDataFlowBlockAnalyzer analyzer = dfm.getAnalyzer(block);
				analyzer.getVar(vn); // Visit is later
			}
		}
		Set<JitPhiOp> extraPhis = new LinkedHashSet<>(dfm.phiNodes());
		extraPhis.removeAll(phisBefore);
		dfm.analyzeInterblock(extraPhis);

		for (JitBlock block : cfm.getBlocks()) {
			OpUseCollector collector = new OpUseCollector(block);

			// Locate memory outputs, stores, branches, callothers
			for (PcodeOp op : block.getCode()) {
				JitOp jitOp = dfm.getJitOp(op);
				if (jitOp instanceof JitCallOtherOpIf callotherOp) {
					for (Varnode vn : getCallOtherRetireVarnodes(block, callotherOp)) {
						collector.visitCallOtherRetireable(vn, callotherOp);
					}
				}
				if (!jitOp.canBeRemoved()) {
					collector.visitOp(jitOp);
				}
			}

			// Compute retire-able variables
			for (Varnode vn : getCouldRetireVarnodes(block)) {
				collector.visitRetireable(vn);
			}
		}
	}
Perform the analysis

<p>
This first backfills any missing phi nodes that might not have been considered during data
flow analysis. Then, it collects all the sinks and invokes the traversal on them. Note that
we can end traversal any time we encounter an op that we have already marked as used, because
we will already have marked its dependencies, too. The visit order does not matter, so we
just iterate over the blocks and ops, marking things as we encounter them.
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/analysis/JitOpUseModel.java