Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/compile: racewalk generates too many runtime.racewrite() calls #4332

Closed
dvyukov opened this issue Nov 2, 2012 · 8 comments
Closed

cmd/compile: racewalk generates too many runtime.racewrite() calls #4332

dvyukov opened this issue Nov 2, 2012 · 8 comments

Comments

@dvyukov
Copy link
Member

dvyukov commented Nov 2, 2012

For the following code
        t := []byte("hello world")
it generates 11 runtime.racewrite. Seemingly for each char in the string. I think we
need to do better.


func Encode() ([]byte, error) {
        t := []byte("hello world")
  400c25:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400c2c:       00 
  400c2d:       48 89 1c 24             mov    %rbx,(%rsp)
  400c31:       e8 2a cc 00 00          callq  40d860 <runtime.racewrite>
  400c36:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400c3d:       00 
  400c3e:       48 ff c3                inc    %rbx
  400c41:       48 89 1c 24             mov    %rbx,(%rsp)
  400c45:       e8 16 cc 00 00          callq  40d860 <runtime.racewrite>
  400c4a:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400c51:       00 
  400c52:       48 83 c3 02             add    $0x2,%rbx
  400c56:       48 89 1c 24             mov    %rbx,(%rsp)
  400c5a:       e8 01 cc 00 00          callq  40d860 <runtime.racewrite>
  400c5f:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400c66:       00 
  400c67:       48 83 c3 03             add    $0x3,%rbx
  400c6b:       48 89 1c 24             mov    %rbx,(%rsp)
  400c6f:       e8 ec cb 00 00          callq  40d860 <runtime.racewrite>
  400c74:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400c7b:       00 
  400c7c:       48 83 c3 04             add    $0x4,%rbx
  400c80:       48 89 1c 24             mov    %rbx,(%rsp)
  400c84:       e8 d7 cb 00 00          callq  40d860 <runtime.racewrite>
  400c89:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400c90:       00 
  400c91:       48 83 c3 05             add    $0x5,%rbx
  400c95:       48 89 1c 24             mov    %rbx,(%rsp)
  400c99:       e8 c2 cb 00 00          callq  40d860 <runtime.racewrite>
  400c9e:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400ca5:       00 
  400ca6:       48 83 c3 06             add    $0x6,%rbx
  400caa:       48 89 1c 24             mov    %rbx,(%rsp)
  400cae:       e8 ad cb 00 00          callq  40d860 <runtime.racewrite>
  400cb3:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400cba:       00 
  400cbb:       48 83 c3 07             add    $0x7,%rbx
  400cbf:       48 89 1c 24             mov    %rbx,(%rsp)
  400cc3:       e8 98 cb 00 00          callq  40d860 <runtime.racewrite>
  400cc8:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400ccf:       00 
  400cd0:       48 83 c3 08             add    $0x8,%rbx
  400cd4:       48 89 1c 24             mov    %rbx,(%rsp)
  400cd8:       e8 83 cb 00 00          callq  40d860 <runtime.racewrite>
  400cdd:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400ce4:       00 
  400ce5:       48 83 c3 09             add    $0x9,%rbx
  400ce9:       48 89 1c 24             mov    %rbx,(%rsp)
  400ced:       e8 6e cb 00 00          callq  40d860 <runtime.racewrite>
  400cf2:       48 8d 1c 25 58 14 43    lea    0x431458,%rbx
  400cf9:       00 
  400cfa:       48 83 c3 0a             add    $0xa,%rbx
  400cfe:       48 89 1c 24             mov    %rbx,(%rsp)
  400d02:       e8 59 cb 00 00          callq  40d860 <runtime.racewrite>
  400d07:       48 c7 04 24 88 76 42    movq   $0x427688,(%rsp)
  400d0e:       00 
  400d0f:       e8 5c 1d 01 00          callq  412a70 <runtime.new>
  400d14:       48 8b 5c 24 08          mov    0x8(%rsp),%rbx
  400d19:       48 89 5c 24 28          mov    %rbx,0x28(%rsp)
  400d1e:       48 8b 5c 24 28          mov    0x28(%rsp),%rbx
  400d23:       48 89 1c 24             mov    %rbx,(%rsp)
  400d27:       e8 34 cb 00 00          callq  40d860 <runtime.racewrite>
  400d2c:       48 8b 7c 24 28          mov    0x28(%rsp),%rdi
  400d31:       48 8d 34 25 58 14 43    lea    0x431458,%rsi
  400d38:       00 
  400d39:       48 a5                   movsq  %ds:(%rsi),%es:(%rdi)
  400d3b:       a4                      movsb  %ds:(%rsi),%es:(%rdi)
  400d3c:       a4                      movsb  %ds:(%rsi),%es:(%rdi)
  400d3d:       a4                      movsb  %ds:(%rsi),%es:(%rdi)
  400d3e:       48 8d 5c 24 10          lea    0x10(%rsp),%rbx
  400d43:       48 89 1c 24             mov    %rbx,(%rsp)
  400d47:       e8 14 cb 00 00          callq  40d860 <runtime.racewrite>
  400d4c:       48 c7 44 24 18 0b 00    movq   $0xb,0x18(%rsp)
  400d53:       00 00 
  400d55:       48 c7 44 24 20 0b 00    movq   $0xb,0x20(%rsp)
  400d5c:       00 00 
  400d5e:       48 8b 5c 24 28          mov    0x28(%rsp),%rbx
  400d63:       48 89 5c 24 10          mov    %rbx,0x10(%rsp)
/tmp/test.go:5
        return t, nil
  400d68:       48 8d 5c 24 38          lea    0x38(%rsp),%rbx
  400d6d:       48 89 1c 24             mov    %rbx,(%rsp)
  400d71:       e8 ea ca 00 00          callq  40d860 <runtime.racewrite>
  400d76:       48 8d 5c 24 10          lea    0x10(%rsp),%rbx
  400d7b:       48 89 1c 24             mov    %rbx,(%rsp)
  400d7f:       e8 6c cb 00 00          callq  40d8f0 <runtime.raceread>
  400d84:       48 8b 5c 24 10          mov    0x10(%rsp),%rbx
  400d89:       48 89 5c 24 38          mov    %rbx,0x38(%rsp)
  400d8e:       48 8b 5c 24 18          mov    0x18(%rsp),%rbx
  400d93:       48 89 5c 24 40          mov    %rbx,0x40(%rsp)
  400d98:       48 8b 5c 24 20          mov    0x20(%rsp),%rbx
  400d9d:       48 89 5c 24 48          mov    %rbx,0x48(%rsp)
  400da2:       48 c7 44 24 50 00 00    movq   $0x0,0x50(%rsp)
  400da9:       00 00 
  400dab:       48 c7 44 24 58 00 00    movq   $0x0,0x58(%rsp)
  400db2:       00 00 
  400db4:       e8 57 cc 00 00          callq  40da10 <runtime.racefuncexit>
/tmp/test.go:6
}
  400db9:       48 83 c4 30             add    $0x30,%rsp
  400dbd:       c3                      retq
@remyoudompheng
Copy link
Contributor

Comment 1:

Is this the same as issue #4250 ?

@dvyukov
Copy link
Member Author

dvyukov commented Nov 2, 2012

Comment 2:

4250 is for runtime library and operations like slicecopy.
This one is for compiler instrumentation. If the compiler generates 100 separate call,
there is nothing runtime can do.

@dvyukov
Copy link
Member Author

dvyukov commented Jan 8, 2013

Comment 3:

Labels changed: added performance.

@robpike
Copy link
Contributor

robpike commented Mar 7, 2013

Comment 4:

Labels changed: removed go1.1maybe.

@rsc
Copy link
Contributor

rsc commented Nov 27, 2013

Comment 5:

Labels changed: added go1.3maybe.

@rsc
Copy link
Contributor

rsc commented Dec 4, 2013

Comment 6:

Labels changed: added release-none, removed go1.3maybe.

@rsc
Copy link
Contributor

rsc commented Dec 4, 2013

Comment 7:

Labels changed: added repo-main.

@rsc rsc added this to the Unplanned milestone Apr 10, 2015
@rsc rsc changed the title cmd/gc: racewalk generates too many runtime.racewrite() calls cmd/compile: racewalk generates too many runtime.racewrite() calls Jun 8, 2015
@josharian
Copy link
Contributor

package p

func f() {
	t := []byte("hello world")
	_ = t
}

now compiles to:

"".f STEXT size=100 args=0x0 locals=0x58
	0x0000 00000 (x.go:3)	TEXT	"".f(SB), $88-0
	0x0000 00000 (x.go:3)	MOVQ	(TLS), CX
	0x0009 00009 (x.go:3)	CMPQ	SP, 16(CX)
	0x000d 00013 (x.go:3)	JLS	93
	0x000f 00015 (x.go:3)	SUBQ	$88, SP
	0x0013 00019 (x.go:3)	MOVQ	BP, 80(SP)
	0x0018 00024 (x.go:3)	LEAQ	80(SP), BP
	0x001d 00029 (x.go:3)	FUNCDATA	$0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
	0x001d 00029 (x.go:3)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
	0x001d 00029 (x.go:3)	MOVQ	""..fp+88(SP), AX
	0x0022 00034 (x.go:5)	MOVQ	AX, (SP)
	0x0026 00038 (x.go:5)	PCDATA	$0, $0
	0x0026 00038 (x.go:5)	CALL	runtime.racefuncenter(SB)
	0x002b 00043 (x.go:5)	LEAQ	""..autotmp_2+48(SP), AX
	0x0030 00048 (x.go:4)	MOVQ	AX, (SP)
	0x0034 00052 (x.go:4)	LEAQ	go.string."hello world"(SB), AX
	0x003b 00059 (x.go:4)	MOVQ	AX, 8(SP)
	0x0040 00064 (x.go:4)	MOVQ	$11, 16(SP)
	0x0049 00073 (x.go:4)	PCDATA	$0, $0
	0x0049 00073 (x.go:4)	CALL	runtime.stringtoslicebyte(SB)
	0x004e 00078 (x.go:5)	PCDATA	$0, $0
	0x004e 00078 (x.go:5)	CALL	runtime.racefuncexit(SB)
	0x0053 00083 (x.go:6)	MOVQ	80(SP), BP
	0x0058 00088 (x.go:6)	ADDQ	$88, SP
	0x005c 00092 (x.go:6)	RET
	0x005d 00093 (x.go:6)	NOP
	0x005d 00093 (x.go:3)	PCDATA	$0, $-1
	0x005d 00093 (x.go:3)	CALL	runtime.morestack_noctxt(SB)
	0x0062 00098 (x.go:3)	JMP	0

Calling this fixed. If we find cases other than converting a byte slice to a string, we can open new issues for them.

@golang golang locked and limited conversation to collaborators Jun 1, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

6 participants