"I think this is a consequence of variables being sent to a channel effectively having their address taken, disabling register allocation for them."
Looks like the Go code generator and optimizer is absolutely terrible, since any reasonable optimizer has standard optimizations that prevent this.
Apparently they wrote their own rather than using something established like LLVM, and this is the result.