cmd/compile: omit write barrier when assigning global function

Currently we generate write barriers when the right side of an
assignment is a global function. This doesn't fall into the existing
case of storing an address of a global because we haven't lowered the
function to a pointer yet.

This write barrier is unnecessary, so eliminate it.

Fixes #13901.

Change-Id: Ibc10e00a8803db0fd75224b66ab94c3737842a79
Reviewed-on: https://go-review.googlesource.com/20772
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index b4c38ec..69c8390 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -2140,6 +2140,12 @@
 		return false
 	}
 
+	// No write barrier for storing global function, which is live
+	// no matter what.
+	if r.Op == ONAME && r.Class == PFUNC {
+		return false
+	}
+
 	// Otherwise, be conservative and use write barrier.
 	return true
 }