1. 12 Aug, 2015 7 commits
  2. 11 Aug, 2015 5 commits
  3. 10 Aug, 2015 3 commits
  4. 07 Aug, 2015 1 commit
  5. 06 Aug, 2015 12 commits
  6. 05 Aug, 2015 1 commit
    • Josh Bleecher Snyder's avatar
      [dev.ssa] cmd/compile: add SSA pass to move values closer to uses · f91ff1a5
      Josh Bleecher Snyder authored
      Even this very simple, restricted initial implementation helps.
      
      While running make.bash, it moves 84437 values
      to new, closer homes.
      
      As a concrete example:
      
      func f_ssa(i, j int, b bool) int {
      	if !b {
      		return 0
      	}
      	return i + j
      }
      
      It cuts off one stack slot and two instructions:
      
      Before:
      
      "".f_ssa t=1 size=96 value=0 args=0x20 locals=0x18
      	0x0000 00000 (x.go:3)	TEXT	"".f_ssa(SB), $24-32
      	0x0000 00000 (x.go:3)	SUBQ	$24, SP
      	0x0004 00004 (x.go:3)	FUNCDATA	$0, "".gcargs·0(SB)
      	0x0004 00004 (x.go:3)	FUNCDATA	$1, "".gclocals·1(SB)
      	0x0004 00004 (x.go:5)	MOVQ	$0, AX
      	0x0006 00006 (x.go:3)	MOVQ	32(SP), CX
      	0x000b 00011 (x.go:3)	MOVQ	40(SP), DX
      	0x0010 00016 (x.go:3)	LEAQ	48(SP), BX
      	0x0015 00021 (x.go:3)	MOVB	(BX), BPB
      	0x0018 00024 (x.go:3)	MOVQ	$0, SI
      	0x001a 00026 (x.go:3)	MOVQ	SI, 56(SP)
      	0x001f 00031 (x.go:3)	TESTB	BPB, BPB
      	0x0022 00034 (x.go:5)	MOVQ	AX, (SP)
      	0x0026 00038 (x.go:3)	MOVQ	CX, 8(SP)
      	0x002b 00043 (x.go:3)	MOVQ	DX, 16(SP)
      	0x0030 00048 (x.go:4)	JEQ	74
      	0x0032 00050 (x.go:3)	MOVQ	8(SP), AX
      	0x0037 00055 (x.go:3)	MOVQ	16(SP), CX
      	0x003c 00060 (x.go:7)	LEAQ	(AX)(CX*1), DX
      	0x0040 00064 (x.go:7)	MOVQ	DX, 56(SP)
      	0x0045 00069 (x.go:3)	ADDQ	$24, SP
      	0x0049 00073 (x.go:3)	RET
      	0x004a 00074 (x.go:5)	MOVQ	(SP), AX
      	0x004e 00078 (x.go:5)	MOVQ	AX, 56(SP)
      	0x0053 00083 (x.go:3)	JMP	69
      
      After:
      
      "".f_ssa t=1 size=80 value=0 args=0x20 locals=0x10
      	0x0000 00000 (x.go:3)	TEXT	"".f_ssa(SB), $16-32
      	0x0000 00000 (x.go:3)	SUBQ	$16, SP
      	0x0004 00004 (x.go:3)	FUNCDATA	$0, "".gcargs·0(SB)
      	0x0004 00004 (x.go:3)	FUNCDATA	$1, "".gclocals·1(SB)
      	0x0004 00004 (x.go:3)	MOVQ	32(SP), AX
      	0x0009 00009 (x.go:3)	MOVQ	24(SP), CX
      	0x000e 00014 (x.go:3)	LEAQ	40(SP), DX
      	0x0013 00019 (x.go:3)	MOVB	(DX), BL
      	0x0015 00021 (x.go:3)	MOVQ	$0, BP
      	0x0017 00023 (x.go:3)	MOVQ	BP, 48(SP)
      	0x001c 00028 (x.go:3)	TESTB	BL, BL
      	0x001e 00030 (x.go:3)	MOVQ	AX, (SP)
      	0x0022 00034 (x.go:3)	MOVQ	CX, 8(SP)
      	0x0027 00039 (x.go:4)	JEQ	64
      	0x0029 00041 (x.go:3)	MOVQ	8(SP), AX
      	0x002e 00046 (x.go:3)	MOVQ	(SP), CX
      	0x0032 00050 (x.go:7)	LEAQ	(AX)(CX*1), DX
      	0x0036 00054 (x.go:7)	MOVQ	DX, 48(SP)
      	0x003b 00059 (x.go:3)	ADDQ	$16, SP
      	0x003f 00063 (x.go:3)	RET
      	0x0040 00064 (x.go:5)	MOVQ	$0, AX
      	0x0042 00066 (x.go:5)	MOVQ	AX, 48(SP)
      	0x0047 00071 (x.go:3)	JMP	59
      
      Of course, the old backend is still well ahead:
      
      "".f_ssa t=1 size=48 value=0 args=0x20 locals=0x0
      	0x0000 00000 (x.go:3)	TEXT	"".f_ssa(SB), $0-32
      	0x0000 00000 (x.go:3)	NOP
      	0x0000 00000 (x.go:3)	NOP
      	0x0000 00000 (x.go:3)	FUNCDATA	$0, gclocals·a8eabfc4a4514ed6b3b0c61e9680e440(SB)
      	0x0000 00000 (x.go:3)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:4)	CMPB	"".b+24(FP), $0
      	0x0005 00005 (x.go:4)	JNE	17
      	0x0007 00007 (x.go:5)	MOVQ	$0, "".~r3+32(FP)
      	0x0010 00016 (x.go:5)	RET
      	0x0011 00017 (x.go:7)	MOVQ	"".i+8(FP), BX
      	0x0016 00022 (x.go:7)	MOVQ	"".j+16(FP), BP
      	0x001b 00027 (x.go:7)	ADDQ	BP, BX
      	0x001e 00030 (x.go:7)	MOVQ	BX, "".~r3+32(FP)
      	0x0023 00035 (x.go:7)	RET
      
      Some regalloc improvements should help considerably.
      
      Change-Id: I95bb5dd83e56afd70ae4e983f1d32dffd0c3d46a
      Reviewed-on: https://go-review.googlesource.com/13142Reviewed-by: default avatarKeith Randall <khr@golang.org>
      f91ff1a5
  7. 04 Aug, 2015 9 commits
  8. 03 Aug, 2015 2 commits
    • Todd Neal's avatar
      [dev.ssa] cmd/compile/ssa: speed up nilcheck · 4dcf8ea1
      Todd Neal authored
      Reworks nilcheck to be performed by a depth first traversal of the
      dominator tree, keeping an updated map of the values that have been
      nil-checked during the traversal.
      
      benchmark                           old ns/op     new ns/op     delta
      BenchmarkNilCheckDeep1-8            1242          1825          +46.94%
      BenchmarkNilCheckDeep10-8           2397          3942          +64.46%
      BenchmarkNilCheckDeep100-8          29105         24873         -14.54%
      BenchmarkNilCheckDeep1000-8         2742563       265760        -90.31%
      BenchmarkNilCheckDeep10000-8        335690119     3157995       -99.06%
      
      benchmark                           old MB/s     new MB/s     speedup
      BenchmarkNilCheckDeep1-8            0.81         0.55         0.68x
      BenchmarkNilCheckDeep10-8           4.17         2.54         0.61x
      BenchmarkNilCheckDeep100-8          3.44         4.02         1.17x
      BenchmarkNilCheckDeep1000-8         0.36         3.76         10.44x
      BenchmarkNilCheckDeep10000-8        0.03         3.17         105.67x
      
      benchmark                        old allocs     new allocs     delta
      BenchmarkNilCheckDeep1-8         9              14             +55.56%
      BenchmarkNilCheckDeep10-8        9              23             +155.56%
      BenchmarkNilCheckDeep100-8       9              113            +1155.56%
      BenchmarkNilCheckDeep1000-8      9              1015
      +11177.78%
      BenchmarkNilCheckDeep10000-8     9              10024
      +111277.78%
      
      benchmark                        old bytes     new bytes     delta
      BenchmarkNilCheckDeep1-8         432           608           +40.74%
      BenchmarkNilCheckDeep10-8        1008          1496          +48.41%
      BenchmarkNilCheckDeep100-8       8064          11656         +44.54%
      BenchmarkNilCheckDeep1000-8      73728         145240        +96.99%
      BenchmarkNilCheckDeep10000-8     737280        2144411       +190.85%
      
      Change-Id: I0f86010e9823aec04aac744fdb589b65ec8acefc
      Reviewed-on: https://go-review.googlesource.com/12332Reviewed-by: default avatarDavid Chase <drchase@google.com>
      4dcf8ea1
    • Todd Neal's avatar
      [dev.ssa] cmd/compile/ssa: test against known values · 4ac823ee
      Todd Neal authored
      Modify tests to use a known value instead of comparing the backends
      directly.
      
      Change-Id: I32e804e12515885bd94c4f83644cbca03b018fea
      Reviewed-on: https://go-review.googlesource.com/13042Reviewed-by: default avatarKeith Randall <khr@golang.org>
      4ac823ee