Repository: go
Issue: cmd/compile: elide unnecessary copies
Labels: Performance,NeedsInvestigation,compiler/runtime

### What version of Go are you using (`go version`)?

<pre>
$ go version
go version devel go1.20-8d57f4dcef Sat Aug 20 00:56:30 2022 +0000 linux/amd64
</pre>

### Does this issue reproduce with the latest release?
Yes, reproduces on Go 1.19.


### What operating system and processor architecture are you using (`go env`)?
linux/amd64

### What did you do?
```
package pkg

func fn1() byte {
	arr := [5]byte{1, 2, 3, 4, 5}
	return arr[0] | arr[1] | arr[2] | arr[3] | arr[4]
}

func fn2() byte {
	arr1 := [5]byte{1, 2, 3, 4, 5}
	arr2 := arr1
	arr3 := arr1
	arr4 := arr1
	arr5 := arr1
	return arr1[0] | arr2[1] | arr3[2] | arr4[3] | arr5[4]
}
```


### What did you expect to see?
Both functions to compile the same.


### What did you see instead?
`fn2` really does copy `arr` 4 times. The compiler could elide these copies, turning arr2–5 into aliases, without affecting the behavior of the program.

```
command-line-arguments.fn1 STEXT nosplit size=73 args=0x0 locals=0x10 funcid=0x0 align=0x0
        0x0000 00000 (/home/dominikh/prj/src/example.com/foo.go:3)      TEXT    command-line-arguments.fn1(SB), NOSPLIT|ABIInternal, $16-0
        0x0000 00000 (/home/dominikh/prj/src/example.com/foo.go:3)      SUBQ    $16, SP
        0x0004 00004 (/home/dominikh/prj/src/example.com/foo.go:3)      MOVQ    BP, 8(SP)
        0x0009 00009 (/home/dominikh/prj/src/example.com/foo.go:3)      LEAQ    8(SP), BP
        0x000e 00014 (/home/dominikh/prj/src/example.com/foo.go:3)      FUNCDATA        $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        0x000e 00014 (/home/dominikh/prj/src/example.com/foo.go:3)      FUNCDATA        $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        0x000e 00014 (/home/dominikh/prj/src/example.com/foo.go:4)      MOVL    $67305985, command-line-arguments.arr+3(SP)
        0x0016 00022 (/home/dominikh/prj/src/example.com/foo.go:4)      MOVB    $5, command-line-arguments.arr+7(SP)
        0x001b 00027 (/home/dominikh/prj/src/example.com/foo.go:5)      MOVBLZX command-line-arguments.arr+3(SP), AX
        0x0020 00032 (/home/dominikh/prj/src/example.com/foo.go:5)      MOVBLZX command-line-arguments.arr+4(SP), CX
        0x0025 00037 (/home/dominikh/prj/src/example.com/foo.go:5)      ORL     CX, AX
        0x0027 00039 (/home/dominikh/prj/src/example.com/foo.go:5)      MOVBLZX command-line-arguments.arr+5(SP), CX
        0x002c 00044 (/home/dominikh/prj/src/example.com/foo.go:5)      ORL     CX, AX
        0x002e 00046 (/home/dominikh/prj/src/example.com/foo.go:5)      MOVBLZX command-line-arguments.arr+6(SP), CX
        0x0033 00051 (/home/dominikh/prj/src/example.com/foo.go:5)      ORL     CX, AX
        0x0035 00053 (/home/dominikh/prj/src/example.com/foo.go:5)      MOVL    $5, CX
        0x003a 00058 (/home/dominikh/prj/src/example.com/foo.go:5)      MOVBLZX CL, CX
        0x003d 00061 (/home/dominikh/prj/src/example.com/foo.go:5)      ORL     CX, AX
        0x003f 00063 (/home/dominikh/prj/src/example.com/foo.go:5)      MOVQ    8(SP), BP
        0x0044 00068 (/home/dominikh/prj/src/example.com/foo.go:5)      ADDQ    $16, SP
        0x0048 00072 (/home/dominikh/prj/src/example.com/foo.go:5)      RET
        0x0000 48 83 ec 10 48 89 6c 24 08 48 8d 6c 24 08 c7 44  H...H.l$.H.l$..D
        0x0010 24 03 01 02 03 04 c6 44 24 07 05 0f b6 44 24 03  $......D$....D$.
        0x0020 0f b6 4c 24 04 09 c8 0f b6 4c 24 05 09 c8 0f b6  ..L$.....L$.....
        0x0030 4c 24 06 09 c8 b9 05 00 00 00 0f b6 c9 09 c8 48  L$.............H
        0x0040 8b 6c 24 08 48 83 c4 10 c3                       .l$.H....
command-line-arguments.fn2 STEXT nosplit size=121 args=0x0 locals=0x20 funcid=0x0 align=0x0
        0x0000 00000 (/home/dominikh/prj/src/example.com/foo.go:8)      TEXT    command-line-arguments.fn2(SB), NOSPLIT|ABIInternal, $32-0
        0x0000 00000 (/home/dominikh/prj/src/example.com/foo.go:8)      SUBQ    $32, SP
        0x0004 00004 (/home/dominikh/prj/src/example.com/foo.go:8)      MOVQ    BP, 24(SP)
        0x0009 00009 (/home/dominikh/prj/src/example.com/foo.go:8)      LEAQ    24(SP), BP
        0x000e 00014 (/home/dominikh/prj/src/example.com/foo.go:8)      FUNCDATA        $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        0x000e 00014 (/home/dominikh/prj/src/example.com/foo.go:8)      FUNCDATA        $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        0x000e 00014 (/home/dominikh/prj/src/example.com/foo.go:9)      MOVL    $67305985, command-line-arguments.arr1+19(SP)
        0x0016 00022 (/home/dominikh/prj/src/example.com/foo.go:9)      MOVB    $5, command-line-arguments.arr1+23(SP)
        0x001b 00027 (/home/dominikh/prj/src/example.com/foo.go:10)     MOVL    command-line-arguments.arr1+19(SP), CX
        0x001f 00031 (/home/dominikh/prj/src/example.com/foo.go:10)     MOVBLZX command-line-arguments.arr1+23(SP), DX
        0x0024 00036 (/home/dominikh/prj/src/example.com/foo.go:10)     MOVL    CX, command-line-arguments.arr2+14(SP)
        0x0028 00040 (/home/dominikh/prj/src/example.com/foo.go:10)     MOVB    DL, command-line-arguments.arr2+18(SP)
        0x002c 00044 (/home/dominikh/prj/src/example.com/foo.go:11)     MOVL    command-line-arguments.arr1+19(SP), CX
        0x0030 00048 (/home/dominikh/prj/src/example.com/foo.go:11)     MOVBLZX command-line-arguments.arr1+23(SP), DX
        0x0035 00053 (/home/dominikh/prj/src/example.com/foo.go:11)     MOVL    CX, command-line-arguments.arr3+9(SP)
        0x0039 00057 (/home/dominikh/prj/src/example.com/foo.go:11)     MOVB    DL, command-line-arguments.arr3+13(SP)
        0x003d 00061 (/home/dominikh/prj/src/example.com/foo.go:12)     MOVL    command-line-arguments.arr1+19(SP), CX
        0x0041 00065 (/home/dominikh/prj/src/example.com/foo.go:12)     MOVBLZX command-line-arguments.arr1+23(SP), DX
        0x0046 00070 (/home/dominikh/prj/src/example.com/foo.go:12)     MOVL    CX, command-line-arguments.arr4+4(SP)
        0x004a 00074 (/home/dominikh/prj/src/example.com/foo.go:12)     MOVB    DL, command-line-arguments.arr4+8(SP)
        0x004e 00078 (/home/dominikh/prj/src/example.com/foo.go:13)     MOVBLZX command-line-arguments.arr1+23(SP), AX
        0x0053 00083 (/home/dominikh/prj/src/example.com/foo.go:14)     MOVBLZX command-line-arguments.arr1+19(SP), CX
        0x0058 00088 (/home/dominikh/prj/src/example.com/foo.go:14)     MOVBLZX command-line-arguments.arr2+15(SP), DX
        0x005d 00093 (/home/dominikh/prj/src/example.com/foo.go:14)     ORL     CX, DX
        0x005f 00095 (/home/dominikh/prj/src/example.com/foo.go:14)     MOVBLZX command-line-arguments.arr3+11(SP), CX
        0x0064 00100 (/home/dominikh/prj/src/example.com/foo.go:14)     ORL     DX, CX
        0x0066 00102 (/home/dominikh/prj/src/example.com/foo.go:14)     MOVBLZX command-line-arguments.arr4+7(SP), DX
        0x006b 00107 (/home/dominikh/prj/src/example.com/foo.go:14)     ORL     CX, DX
        0x006d 00109 (/home/dominikh/prj/src/example.com/foo.go:14)     ORL     DX, AX
        0x006f 00111 (/home/dominikh/prj/src/example.com/foo.go:14)     MOVQ    24(SP), BP
        0x0074 00116 (/home/dominikh/prj/src/example.com/foo.go:14)     ADDQ    $32, SP
        0x0078 00120 (/home/dominikh/prj/src/example.com/foo.go:14)     RET
```