]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.simd] test: add some trickier cases to ternary-boolean simd test
authorDavid Chase <drchase@google.com>
Fri, 24 Oct 2025 21:25:46 +0000 (17:25 -0400)
committerDavid Chase <drchase@google.com>
Mon, 27 Oct 2025 19:57:33 +0000 (12:57 -0700)
These new tests check a hypothesis about interactions
between CPU features and common subexpressions.  Happily,
they hypothesis was not (yet) correct and the test did not
fail.

These are probably good to have in the corpus in case we
decide to tinker with the rewrite in the future, or if
someone wants to write a fuzzer and needs a little
inspiration.

Change-Id: I8ea6e1655a293c22e39bf53e4d2c5afd3dcb2510
Reviewed-on: https://go-review.googlesource.com/c/go/+/714803
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

test/simd.go

index 32ed70d39a2c53178d4e6ef3ad21b7adc91daba8..307e98e0e7f861866d3203620d163ad98a668afe 100644 (file)
@@ -105,3 +105,41 @@ func ternRewrite(m, w, x, y, z simd.Int32x16) (t0, t1, t2 simd.Int32x16) {
        t2 = x.Xor(y).Xor(z).And(x.Xor(y).Xor(z.Not())) // ERROR "Rewriting.*ternInt"
        return                                          // ERROR "has features avx[+]avx2[+]avx512$"
 }
+
+func ternTricky1(x, y, z simd.Int32x8) simd.Int32x8 {
+       // Int32x8 is a 256-bit vector and does not guarantee AVX-512
+       // a is a 3-variable logical expression occurring outside AVX-512 feature check
+       a := x.Xor(y).Xor(z)
+       var w simd.Int32x8
+       if !simd.HasAVX512() { // ERROR "has features avx$"
+               // do nothing
+       } else {
+               w = y.AndNot(a) // ERROR "has features avx[+]avx2[+]avx512" "Rewriting.*ternInt"
+       }
+       // a is a common subexpression
+       return a.Or(w) // ERROR "has features avx$"
+}
+
+func ternTricky2(x, y, z simd.Int32x8) simd.Int32x8 {
+       // Int32x8 is a 256-bit vector and does not guarantee AVX-512
+       var a, w simd.Int32x8
+       if !simd.HasAVX512() { // ERROR "has features avx$"
+               // do nothing
+       } else {
+               a = x.Xor(y).Xor(z)
+               w = y.AndNot(a) // ERROR "has features avx[+]avx2[+]avx512" "Rewriting.*ternInt"
+       }
+       // a is a common subexpression
+       return a.Or(w) // ERROR "has features avx$"
+}
+
+func ternTricky3(x, y, z simd.Int32x8) simd.Int32x8 {
+       // Int32x8 is a 256-bit vector and does not guarantee AVX-512
+       a := x.Xor(y).Xor(z)
+       w := y.AndNot(a)
+       if !simd.HasAVX512() { // ERROR "has features avx$"
+               return a // ERROR "has features avx$"
+       }
+       // a is a common subexpression
+       return a.Or(w) // ERROR "has features avx[+]avx2[+]avx512"  // This does not rewrite, do we want it to?
+}