This defines an API endpoint that allows clients to move upwards a MemoryUse/Def
*M to just before a MemoryDef *Dest, where Dest and M may reside in separate
BasicBlocks. The following conditions must hold:
- Dest must dominate M,
- All MemoryAccesses between the Dest and M, as well as Dest itself, must be no-alias with M,
- Dest is MemoryDef (this restriction could probably be lifted).
These conditions allow the splice to be carried out with simple
replaceAllUsesWith and setDefiningAccess operations. In particular, the first
and second conditions are sufficient conditions for preservation of semantics.