https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80571

--- Comment #1 from Peter Cordes <peter at cordes dot ca> ---
Tracking "cold" registers that are safe to use as a read-only source (whether
or not they're holding a useful value like a constant) has a couple other
applications for x86:

 * vcvtsi2ss/sd %src,%merge_into, %xmm destination
 * vsqrtss     (mem),%merge_into, %xmm
 * vpcmpeqd    %same,%same, %dest    # false dep on KNL / Silvermont
 * vcmptrueps  %same,%same, %ymm     # splat -1 without AVX2.  false dep on all
known uarches
 * _mm_undefined_ps()

Or before clobbering a dead reg, whether we can skip the xor-zeroing before:

 * any of the above without AVX, e.g. sqrtss %src, %dst
 * vpternlogd  $0xff,any,any, src3/dst   # zmm splat -1: false dep

See https://bugs.llvm.org/show_bug.cgi?id=32863 for a more detailed writeup of
this idea.

----

Current out-of-order execution designs always retire in-order, so a register is
guaranteed to be ready if it hasn't been written in the last N instructions,
where N is the out-of-order window size.  (AKA ROB size, 224 on Skylake for
example).

Reply via email to