MemorySSA currently treats lifetime.end intrinsics as not aliasing anything. This breaks MemorySSA-based MemCpyOpt, because we'll happily move a read of a pointer below a lifetime.end intrinsic, as no clobber is reported.
I think the MemorySSA modelling here isn't correct. lifetime.end(p) has approximately the same effect as doing a memcpy(p, undef), and should be treated as a clobber.
This patch removes the special handling of lifetime.end, leaving alias analysis to handle it appropriately.