Yes, reproduces on Go 1.19.
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]
}
Both functions to compile the same.
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
What version of Go are you using (
go version)?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?
What did you expect to see?
Both functions to compile the same.
What did you see instead?
fn2really does copyarr4 times. The compiler could elide these copies, turning arr2–5 into aliases, without affecting the behavior of the program.