protected JitTypeBehavior computeNewAssignment(JitVal v) {
		Contest contest = new Contest();
		// Downstream votes
		for (ValUse use : v.uses()) {
			JitTypeBehavior type = use.type();
			if (type == JitTypeBehavior.COPY && use.op() instanceof JitDefOp def) {
				JitVal downstream = def.out();
				type = assignments.get(downstream);
			}
			contest.vote(type);
		}

		// Upstream votes
		if (v instanceof JitOutVar out) {
			JitTypeBehavior defType = JitTypeBehavior.ANY;
			JitDefOp def = out.definition();
			defType = def.type();
			if (defType == JitTypeBehavior.COPY) {
				Contest subContest = new Contest();
				for (JitVal upstream : def.inputs()) {
					subContest.vote(assignments.get(upstream));
				}
				defType = subContest.winner();
			}
			contest.vote(defType);
		}

		return contest.winner();
	}
Compute the new tentative assignment for the given value

<p>
As discussed in the "voting" section of {@link JitTypeModel}, this tallies up the votes among
the values's uses and defining op then selects the winner.

@param v the value
@return the new assignment
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/analysis/JitTypeModel.java