Source file src/cmd/compile/internal/ssa/prove_test.go

     1  // Copyright 2025 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package ssa
     6  
     7  import (
     8  	"math"
     9  	"testing"
    10  )
    11  
    12  func testLimitUnaryOpSigned8(t *testing.T, opName string, op func(l limit, bitsize uint) limit, opImpl func(int8) int8) {
    13  	sizeLimit := noLimitForBitsize(8)
    14  	for min := math.MinInt8; min <= math.MaxInt8; min++ {
    15  		for max := min; max <= math.MaxInt8; max++ {
    16  			realSmallest, realBiggest := int8(math.MaxInt8), int8(math.MinInt8)
    17  			for i := min; i <= max; i++ {
    18  				result := opImpl(int8(i))
    19  				if result < realSmallest {
    20  					realSmallest = result
    21  				}
    22  				if result > realBiggest {
    23  					realBiggest = result
    24  				}
    25  			}
    26  
    27  			l := limit{int64(min), int64(max), 0, math.MaxUint64}
    28  			l = op(l, 8)
    29  			l = l.intersect(sizeLimit) // We assume this is gonna be used by newLimit which is seeded by the op size already.
    30  
    31  			if l.min != int64(realSmallest) || l.max != int64(realBiggest) {
    32  				t.Errorf("%s(%d..%d) = %d..%d; want %d..%d", opName, min, max, l.min, l.max, realSmallest, realBiggest)
    33  			}
    34  		}
    35  	}
    36  }
    37  
    38  func testLimitUnaryOpUnsigned8(t *testing.T, opName string, op func(l limit, bitsize uint) limit, opImpl func(uint8) uint8) {
    39  	sizeLimit := noLimitForBitsize(8)
    40  	for min := 0; min <= math.MaxUint8; min++ {
    41  		for max := min; max <= math.MaxUint8; max++ {
    42  			realSmallest, realBiggest := uint8(math.MaxUint8), uint8(0)
    43  			for i := min; i <= max; i++ {
    44  				result := opImpl(uint8(i))
    45  				if result < realSmallest {
    46  					realSmallest = result
    47  				}
    48  				if result > realBiggest {
    49  					realBiggest = result
    50  				}
    51  			}
    52  
    53  			l := limit{math.MinInt64, math.MaxInt64, uint64(min), uint64(max)}
    54  			l = op(l, 8)
    55  			l = l.intersect(sizeLimit) // We assume this is gonna be used by newLimit which is seeded by the op size already.
    56  
    57  			if l.umin != uint64(realSmallest) || l.umax != uint64(realBiggest) {
    58  				t.Errorf("%s(%d..%d) = %d..%d; want %d..%d", opName, min, max, l.umin, l.umax, realSmallest, realBiggest)
    59  			}
    60  		}
    61  	}
    62  }
    63  
    64  func TestLimitNegSigned(t *testing.T) {
    65  	testLimitUnaryOpSigned8(t, "neg", limit.neg, func(x int8) int8 { return -x })
    66  }
    67  func TestLimitNegUnsigned(t *testing.T) {
    68  	testLimitUnaryOpUnsigned8(t, "neg", limit.neg, func(x uint8) uint8 { return -x })
    69  }
    70  
    71  func TestLimitComSigned(t *testing.T) {
    72  	testLimitUnaryOpSigned8(t, "com", limit.com, func(x int8) int8 { return ^x })
    73  }
    74  func TestLimitComUnsigned(t *testing.T) {
    75  	testLimitUnaryOpUnsigned8(t, "com", limit.com, func(x uint8) uint8 { return ^x })
    76  }
    77  

View as plain text