compiler: omit a couple of write barriers

Omit a write barrier for
    s = s[0:]
for a slice s.  In this case the pointer is not changing and no write
barrier is required.

Omit a write barrier for
    s = append(s, v)
in the case where len(s) < cap(s) (and similarly when appending more
values).  When the slice has enough capacity the pointer is not
changing and no write barrier is required.

These changes are required to avoid write barriers in the method
randomOrder.reset in the runtime package.  That method is called from
procresize, at a point where we do not want to allocate memory.
Otherwise that method can use a write barrier, allocate memory, and
break TestReadMemStats.

Change-Id: I2cb76eba8fc8bfdeac2f979dc624241f5c9053f7
Reviewed-on: https://go-review.googlesource.com/134219
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
5 files changed