Open
Description
What version of Go are you using (go version
)?
$ go version go version devel go1.20-8d57f4dcef Sat Aug 20 00:56:30 2022 +0000 linux/amd64
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
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
Todo