@Override
	public TaintVec binaryOp(PcodeOp op, TaintVec in1, TaintVec in2) {
		// TODO: Detect immediate operands and be more precise
		switch (op.getOpcode()) {
			case PcodeOp.INT_XOR:
			case PcodeOp.INT_SUB:
			case PcodeOp.BOOL_XOR:
				if (Objects.equals(op.getInput(0), op.getInput(1))) {
					return fromConst(0, op.getOutput().getSize());
				}
			default:
		}
		return PcodeArithmetic.super.binaryOp(op, in1, in2);
	}
{@inheritDoc}

<p>
We override the form taking the full p-code op, so that we can treat certain idioms. Notably,
on x86, {@code XOR RAX,RAX} is a common optimization of {@code MOV RAX,0}, since it takes
fewer bytes to encode. Thus, we must examine the input variables, not their values, to detect
this. Note that, while less common, {@code SUB RAX,RAX} would accomplish the same.
Additionally, in p-code {@link PcodeOp#INT_XOR} is identical to {@link PcodeOp#BOOL_XOR}.
When we detect these idioms, we want to clear any taints, since the value output is constant.
This is achieved intuitively, by deferring to {@link #fromConst(long, int)}, passing in 0 and
the output size.
Ghidra/Debug/TaintAnalysis/src/main/java/ghidra/pcode/emu/taint/TaintPcodeArithmetic.java