Commit 430b8200 authored by Michael Munday's avatar Michael Munday

cmd/internal/obj/{ppc64,s390x}: mark functions with small stacks NOSPLIT

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/31357Reviewed-by: 's avatarDavid Chase <drchase@google.com>
parent c1ab165f
...@@ -457,7 +457,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -457,7 +457,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
aoffset = 0 aoffset = 0
autosize = int32(textstksiz) 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. // A leaf function with no locals has no frame.
p.From3.Offset |= obj.NOFRAME p.From3.Offset |= obj.NOFRAME
} }
...@@ -468,6 +468,12 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -468,6 +468,12 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
autosize += int32(ctxt.FixedFrameSize()) 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) p.To.Offset = int64(autosize)
q = p q = p
......
...@@ -380,7 +380,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -380,7 +380,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
case obj.ATEXT: case obj.ATEXT:
autosize = int32(textstksiz) 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. // A leaf function with no locals has no frame.
p.From3.Offset |= obj.NOFRAME p.From3.Offset |= obj.NOFRAME
} }
...@@ -391,11 +391,17 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -391,11 +391,17 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
autosize += int32(ctxt.FixedFrameSize()) 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) p.To.Offset = int64(autosize)
q = p 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 p, pPreempt = stacksplitPre(ctxt, p, autosize) // emit pre part of split check
pPre = p pPre = p
wasSplit = true //need post part of split wasSplit = true //need post part of split
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment