With Shenandoah, we have a prototype where, rather than using an extra header field for the forwarding pointer, we use the mark word. When the shenandoah barrier is applied to an oop, the oop is first checked to be in cset which is done by converting the oop to an integer and extracting some of the bits of the address and then, if that test fails, the forwarding pointer is loaded by masking off some bits in the mark word. We're seeing a case where, in compiled code, the in cset test and the mark word load for the same oop use 2 different loads, i.e. the load of the field/array element is duplicated, it is reloaded between the in cset test and loading of the forwarding pointer.