Closed
Description
The following code:
package p
func Uint64(b []byte) uint64 {
_ = b[7]
return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
}
generates a single load on go1.7.3 and on go1.8rc3:
"".Uint64 t=1 size=52 args=0x20 locals=0x8
0x0000 00000 (prova.go:3) TEXT "".Uint64(SB), $8-32
0x0000 00000 (prova.go:3) SUBQ $8, SP
0x0004 00004 (prova.go:3) MOVQ BP, (SP)
0x0008 00008 (prova.go:3) LEAQ (SP), BP
0x000c 00012 (prova.go:3) FUNCDATA $0, gclocals·4032f753396f2012ad1784f398b170f4(SB)
0x000c 00012 (prova.go:3) FUNCDATA $1, gclocals·69c1753bd5f81501d95132d08af04464(SB)
0x000c 00012 (prova.go:4) MOVQ "".b+24(FP), AX
0x0011 00017 (prova.go:4) CMPQ AX, $7
0x0015 00021 (prova.go:4) JLS $0, 45
0x0017 00023 (prova.go:6) MOVQ "".b+16(FP), AX
0x001c 00028 (prova.go:6) MOVQ (AX), AX
0x001f 00031 (prova.go:6) MOVQ AX, "".~r1+40(FP)
0x0024 00036 (prova.go:6) MOVQ (SP), BP
0x0028 00040 (prova.go:6) ADDQ $8, SP
0x002c 00044 (prova.go:6) RET
0x002d 00045 (prova.go:4) PCDATA $0, $1
0x002d 00045 (prova.go:4) CALL runtime.panicindex(SB)
0x0032 00050 (prova.go:4) UNDEF
but it doesn't on tip
go version devel +b53f0f8c96 Sat Feb 4 16:46:11 2017 +0000 linux/amd64
"".Uint64 t=1 size=131 args=0x20 locals=0x8
0x0000 00000 (prova.go:3) TEXT "".Uint64(SB), $8-32
0x0000 00000 (prova.go:3) SUBQ $8, SP
0x0004 00004 (prova.go:3) MOVQ BP, (SP)
0x0008 00008 (prova.go:3) LEAQ (SP), BP
0x000c 00012 (prova.go:3) FUNCDATA $0, gclocals·4032f753396f2012ad1784f398b170f4(SB)
0x000c 00012 (prova.go:3) FUNCDATA $1, gclocals·69c1753bd5f81501d95132d08af04464(SB)
0x000c 00012 (prova.go:4) MOVQ "".b+24(FP), AX
0x0011 00017 (prova.go:4) CMPQ AX, $7
0x0015 00021 (prova.go:4) JLS $0, 124
0x0017 00023 (prova.go:5) MOVQ "".b+16(FP), AX
0x001c 00028 (prova.go:5) MOVBLZX (AX), CX
0x001f 00031 (prova.go:5) MOVBLZX 1(AX), DX
0x0023 00035 (prova.go:5) MOVBLZX 2(AX), BX
0x0027 00039 (prova.go:5) MOVBLZX 3(AX), SI
0x002b 00043 (prova.go:6) MOVBLZX 4(AX), DI
0x002f 00047 (prova.go:6) MOVBLZX 5(AX), R8
0x0034 00052 (prova.go:6) MOVBLZX 6(AX), R9
0x0039 00057 (prova.go:6) MOVBLZX 7(AX), AX
0x003d 00061 (prova.go:5) SHLQ $8, DX
0x0041 00065 (prova.go:5) ORQ CX, DX
0x0044 00068 (prova.go:5) SHLQ $16, BX
0x0048 00072 (prova.go:5) ORQ DX, BX
0x004b 00075 (prova.go:5) SHLQ $24, SI
0x004f 00079 (prova.go:5) ORQ BX, SI
0x0052 00082 (prova.go:6) SHLQ $32, DI
0x0056 00086 (prova.go:6) ORQ SI, DI
0x0059 00089 (prova.go:6) SHLQ $40, R8
0x005d 00093 (prova.go:6) ORQ DI, R8
0x0060 00096 (prova.go:6) SHLQ $48, R9
0x0064 00100 (prova.go:6) ORQ R8, R9
0x0067 00103 (prova.go:6) SHLQ $56, AX
0x006b 00107 (prova.go:6) ORQ R9, AX
0x006e 00110 (prova.go:6) MOVQ AX, "".~r1+40(FP)
0x0073 00115 (prova.go:6) MOVQ (SP), BP
0x0077 00119 (prova.go:6) ADDQ $8, SP
0x007b 00123 (prova.go:6) RET
0x007c 00124 (prova.go:4) PCDATA $0, $1
0x007c 00124 (prova.go:4) CALL runtime.panicindex(SB)
0x0081 00129 (prova.go:4) UNDEF
See: #14267