aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/compile/internal/ssa/prove.go11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go
index b9b5d3386d..309229b4d7 100644
--- a/src/cmd/compile/internal/ssa/prove.go
+++ b/src/cmd/compile/internal/ssa/prove.go
@@ -1619,7 +1619,16 @@ func initLimit(v *Value) limit {
lim = lim.unsignedMax(1)
// length operations
- case OpStringLen, OpSliceLen, OpSliceCap:
+ case OpSliceLen, OpSliceCap:
+ f := v.Block.Func
+ elemSize := uint64(v.Args[0].Type.Elem().Size())
+ if elemSize > 0 {
+ heapSize := uint64(1)<<(uint64(f.Config.PtrSize)*8) - 1
+ maximumElementsFittingInHeap := heapSize / elemSize
+ lim = lim.unsignedMax(maximumElementsFittingInHeap)
+ }
+ fallthrough
+ case OpStringLen:
lim = lim.signedMin(0)
}