The current implementation of BiLocks internally uses core::mem::transmute, which requires that the source and destination types have the same size ("Both types must have the same size", from transmute doc). In particular, transmute is used to convert usize into *mut T (https://github.com/rust-lang/futures-rs/blob/2c1c3e152f4639711658be341e00cca4cad9aa5e/futures-util/src/lock/bilock.rs#L292C13-L292C34).
Also, BiLocks are compiled as part of futures-util even if the bilock feature is not set, as they are used internally. Therefore, futures-util does not compile on architectures where usize do not have the same size as raw pointers (e.g. architectures with capability pointers : https://www.cl.cam.ac.uk/research/security/ctsrd/cheri/ ).
I think the new implementation proposed in PR #2384 does not suffer this issue.