New peephole optimizations:
(1) add A B C ; sub D A C => [add A B C ; ] assign D B
    (the add is elided as well if A is not subsequently needed.)
    And the same thing if the order of the add and sub are switched.
(2) OP A B... ; assign C A => OP C B...
    As long as A is not subsequently used and OP is a "simple"
    operation that fully overwrites A and writes to no other variables.

Looking at production shaders, the post-optimized number of
instructions, symbols, connections, culled layers, and size of JITed
code all improve by about 1-4% (depending on the thing being measured
and varying from scene to scene).  Rendering speed doesn't improve quite
as much, but every little bit helps.
CHANGES