Open
Description
What version of Go are you using (go version
)?
$ go version go version go1.17 linux/amd64
Does this issue reproduce with the latest release?
yes
What operating system and processor architecture are you using (go env
)?
centos8 & amd64
What did you do?
Given the code:
//go:noinline func test_loop(arr []int) (resp int){ max := 0 for i := 0; i < len(arr); i++ { if (arr[i] > max) { max = arr[i] } } return max }
What did you expect to see?
TEXT "".test_loop2(SB), ABIInternal 00001 (28) FUNCDATA $0, gclocals·1a65e721a2ccc325b382662e7ffee780(SB) 00002 (28) FUNCDATA $1, gclocals·69c1753bd5f81501d95132d08af04464(SB) 00003 (28) FUNCDATA $5, "".test_loop2.arginfo1(SB) 00004 (31) XORL CX, CX 00005 (31) XORL DX, DX 00006 (30) JMP 8 00007 (+30) INCQ CX 00008 (+30) CMPQ BX, CX 00009 (30) JLE 15 00010 (+31) MOVQ (AX)(CX*8), SI 00011 (31) CMPQ DX, SI 00012 (31) JGE 7 00013 (31) MOVQ SI, DX 00014 (+34) JMP 7 00015 (+36) MOVQ DX, AX 00016 (36) RET 00017 (?) END
What did you see instead?
00000 (40) TEXT "".test_loop3(SB), ABIInternal 00001 (40) FUNCDATA $0, gclocals·1a65e721a2ccc325b382662e7ffee780(SB) 00002 (40) FUNCDATA $1, gclocals·69c1753bd5f81501d95132d08af04464(SB) 00003 (40) FUNCDATA $5, "".test_loop3.arginfo1(SB) 00004 (43) XORL CX, CX 00005 (43) XORL DX, DX 00006 (42) JMP 9 00007 (+42) INCQ CX 00008 (43) MOVQ SI, DX 00009 (+42) CMPQ BX, CX 00010 (42) JLE 16 00011 (+43) MOVQ (AX)(CX*8), SI 00012 (43) CMPQ DX, SI 00013 (43) JLE 7 00014 (43) MOVQ DX, SI 00015 (43) JMP 7 00016 (+47) MOVQ DX, AX 00017 (47) RET 00018 (?) END
The above assembly code has 2 more invalid move operations than the first code. Can someone help explain the reason?