Remove the special casing for intrinsics in MemoryLocation::getForDest() and handle them through the general attribute based code. On the DSE side, this means that isRemovable() now needs to handle more than a hardcoded list of intrinsics. We consider everything apart from volatile accesses memory intrinsics and lifetime markers to be removable.
This allows us to perform DSE on intrinsics that DSE has not been specially been taught about, using a matrix store as an example here.
There is an interesting test change for invariant.start, but I believe that optimization is correct. It only looks a bit odd because the code is immediate UB anyway.
might be worth an assert here