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 <jorropo.pgm@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Jorropo 2025-08-12 12:49:13 +02:00 committed by Gopher Robot
parent 9763ece873
commit 9fcb87c352
2 changed files with 22 additions and 1 deletions

View file

@ -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)
}