Allow call-slop optzn for destinations with a suitable dereferenceable attribute

Currently, call slot optimization requires that if the destination is an
argument, the argument has the sret attribute. This is to ensure that
the memory access won't trap. In addition to sret, we can also allow the
optimization to happen for arguments that have the new dereferenceable
attribute, which gives the same guarantee.

For rust, this eliminates a bunch of memcpys resulting in, for example,
a slight speedup (~2.5%) for type checking.

This has already landed upstream, but updating to the current upstream requires
some larger adjustments to rust.