From 9fcb87c352b398aa650310160346c8d9bfcdcc45 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Tue, 12 Aug 2025 12:49:13 +0200 Subject: cmd/compile: teach prove about len's & cap's max based on the element size Change-Id: I88056fada1ff488c199fce54cf737dbdd091214d Reviewed-on: https://go-review.googlesource.com/c/go/+/695095 Auto-Submit: Jorropo LUCI-TryBot-Result: Go LUCI Reviewed-by: David Chase Reviewed-by: Keith Randall Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/prove.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src') 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) } -- cgit v1.3