Skip to content

Commit

Permalink
cmd/internal/obj/{ppc64,s390x}: mark functions with small stacks NOSPLIT
Browse files Browse the repository at this point in the history
This change omits the stack check on ppc64 and s390x when the size of
a stack frame is less than obj.StackSmall. This is an optimization
x86 already performs.

The effect on s390x isn't huge because we were already omitting the
stack check when the frame size was 0 (it shaves about 1K from the
size of bin/go). On ppc64 however this change reduces the size of the
.text section in bin/go by 33K (1%).

Updates #13379 (for ppc64).

Change-Id: I6af0eb987646bea47fcaf0a812db3496bab0f680
Reviewed-on: https://go-review.googlesource.com/31357
Reviewed-by: David Chase <[email protected]>
  • Loading branch information
mundaym committed Oct 18, 2016
1 parent c1ab165 commit 430b820
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 3 deletions.
8 changes: 7 additions & 1 deletion src/cmd/internal/obj/ppc64/obj9.go
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
aoffset = 0
autosize = int32(textstksiz)

if p.Mark&LEAF != 0 && autosize == 0 && p.From3.Offset&obj.NOFRAME == 0 {
if p.Mark&LEAF != 0 && autosize == 0 {
// A leaf function with no locals has no frame.
p.From3.Offset |= obj.NOFRAME
}
Expand All @@ -468,6 +468,12 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
autosize += int32(ctxt.FixedFrameSize())
}

if p.Mark&LEAF != 0 && autosize < obj.StackSmall {
// A leaf function with a small stack can be marked
// NOSPLIT, avoiding a stack check.
p.From3.Offset |= obj.NOSPLIT
}

p.To.Offset = int64(autosize)

q = p
Expand Down
10 changes: 8 additions & 2 deletions src/cmd/internal/obj/s390x/objz.go
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
case obj.ATEXT:
autosize = int32(textstksiz)

if p.Mark&LEAF != 0 && autosize == 0 && p.From3.Offset&obj.NOFRAME == 0 {
if p.Mark&LEAF != 0 && autosize == 0 {
// A leaf function with no locals has no frame.
p.From3.Offset |= obj.NOFRAME
}
Expand All @@ -391,11 +391,17 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
autosize += int32(ctxt.FixedFrameSize())
}

if p.Mark&LEAF != 0 && autosize < obj.StackSmall {
// A leaf function with a small stack can be marked
// NOSPLIT, avoiding a stack check.
p.From3.Offset |= obj.NOSPLIT
}

p.To.Offset = int64(autosize)

q = p

if p.From3.Offset&obj.NOSPLIT == 0 && p.From3.Offset&obj.NOFRAME == 0 {
if p.From3.Offset&obj.NOSPLIT == 0 {
p, pPreempt = stacksplitPre(ctxt, p, autosize) // emit pre part of split check
pPre = p
wasSplit = true //need post part of split
Expand Down

0 comments on commit 430b820

Please sign in to comment.