Skip to content

cmd/compile: loads combining regression #18946

Closed
@ALTree

Description

@ALTree

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions