Hi Kyrill, Andrea,
Since r17-4663 (PR127485) the d == 0 edge of d = a - b records a == b,
so threadfull1 threads through a following (a >= b ? 1 : 0) diamond
before phiopt can form the comparison. In lib6502's M6502_run at -O2
that is +180 bytes on arm, +300 on aarch64 and +165 on x86_64. Reduced:
typedef unsigned char byte;
byte cmp (byte p, byte r, byte b)
{
byte d = r - b;
return (byte) ((p & (byte) ~0x83) | (d & 0x80)
| (!d ? 2 : 0) | (r >= b ? 1 : 0));
}
1/2 still applies to trunk a924d879f01 and restores those sizes; on the
reduced case it executes 21% fewer insns on arm and 8%/15% more on
aarch64/x86_64, where the threaded path skips a setcc. In x86_64
tree-ssa.exp and dg.exp, pr105679.c and ssa-thread-27.c then need
-fdisable-tree-phiopt1 (I have that change) and pr108357.c keeps foo
(PR127292). Without the embedded-diamond guard, ssa-ifcombine-7 goes
from 5 to 8 insns on x86_64.
Andrea, is 1/2 going in with your phiopt work?
Thanks,
Dominic