diff options
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/compile/internal/ssa/prove.go | 11 |
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) } |
