This only works on integrals for now.
Add four new opcodes, Inc, IncPop, Dec and DecPop. The *Pop variants don't leave anything on the stack and exist because the common case is that the result is unused.
There are still a few corner cases left like floating values, pointers, and over/underflow handling.
Style question: should we prefer doing something like: return DiscardResult ? this->emitIncPop(*T, E) : this->emitInc(*T, E); to discourage accidentally adding code between the two increment operations? (And applying this style more generally for discarded results?)
Alternatively, do we want to add a helper function to ByteCodeExprGen called doEmitInc() that hides the discarded result behavior so the Visit* functions don't have to keep doing that dance?