The first is doing some trivial cross-regclass folding, where we can either
do some extra constraining to eliminate the copy or modify uses to use a smaller
regclass.
The second is that we set the kill flags on vreg use operands if they're the
only use of that vreg.
Both of these cases seem to be done by SelectionDAG's lowering from DAG to
MIs that we currently miss. There are minor code size improvements on average.
Here's the results for -Os on CTMark.
Program                                       size.__text
                                              before         after           diff
tramp3d-v4/tramp3d-v4                         366000.00      366012.00       0.0%
mafft/pairlocalalign                          248196.00      248188.00      -0.0%
7zip/7zip-benchmark                           568612.00      568592.00      -0.0%
kimwitu++/kc                                  434704.00      434676.00      -0.0%
Bullet/bullet                                 456128.00      456096.00      -0.0%
sqlite3/sqlite3                               284136.00      284100.00      -0.0%
ClamAV/clamscan                               381492.00      381396.00      -0.0%
SPASS/SPASS                                   412052.00      411944.00      -0.0%
lencod/lencod                                 428060.00      427912.00      -0.0%
consumer-typeset/consumer-typeset             413148.00      411116.00      -0.5%
                           Geomean difference                               -0.1%
I'd be disappointed if this is actually helping. Do you have examples where kill flags are needed that aren't added by LiveVariables?