private void eliminateCasts(ArrayList<DataVertex> casts) {
		for (DataVertex castNode : casts) {

			DataVertex in = castNode.sources.get(0);
			DataVertex out = castNode.sinks.get(0);
			DataVertex assoc = null;
			int assocSlot = 0;
			if (out.sinks.size() == 1) {
				assoc = out.sinks.get(0);		// Preferred node to associate with is the reading op
				// Generate distinguishing slot for associate based on input slot CAST feeds into
				for (assocSlot = 0; assocSlot < assoc.sources.size(); ++assocSlot) {
					if (assoc.sources.get(assocSlot) == out) {
						break;
					}
				}
			}

			boolean outCast = true;
			if ((out.sinks.size() == 1 && out.vn.isUnique()) || in.sources.size() == 0) {
				outCast = false;
			}

			if (outCast) {
				// PcodeOp defining CAST input, now defines CAST output
				// input is isolated
				DataVertex topOp = in.sources.get(0);
				topOp.sinks.clear();
				out.sources.clear();
				topOp.sinks.add(out);
				out.sources.add(topOp);
				in.collapse();
				if (assoc == null) {
					assoc = out;
				}
				makeAssociation(castNode, in, assoc, assocSlot);
			}
			else {
				// CAST input becomes input to descendants of CAST output
				// output is isolated
				removeInEdge(castNode, 0);
				replaceNodeInOutEdges(out, in);
				out.collapse();
				if (assoc == null) {
					assoc = in;
				}
				makeAssociation(castNode, out, assoc, assocSlot);
			}
			castNode.collapse();
		}
	}
CAST operations are isolated in the graph and either:
   - The input replaces reads of the output, and the output is eliminated, OR
   - The output is redefined by defining PcodeOp op of the input, and the input is eliminated.
@param casts is the list of CAST vertices
Ghidra/Features/CodeCompare/src/main/java/ghidra/features/codecompare/graphanalysis/DataGraph.java