mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.simd] cmd/compile: track which CPU features are in scope
analysis for - is this block only reached through feature checks? - does the function signature imply AVX-something? - is there an instruction in this block which implies AVX-something? and keep track of which features those are. Features = AVX, AVX2, AVX512, etc. Has a test. Change-Id: I0b6f2e87d01ec587818db11cf71fac1e4d500650 Reviewed-on: https://go-review.googlesource.com/c/go/+/706337 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Junyang Shao <shaojunyang@google.com>
This commit is contained in:
parent
48756abd3a
commit
d2270bccbd
6 changed files with 417 additions and 1 deletions
97
test/simd.go
Normal file
97
test/simd.go
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
// errorcheck -0 -d=ssa/cpufeatures/debug=1
|
||||
|
||||
//go:build goexperiment.simd && amd64
|
||||
|
||||
// Copyright 2025 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package foo
|
||||
|
||||
import "simd"
|
||||
|
||||
func f1(x simd.Int8x16) {
|
||||
return // ERROR "has features avx"
|
||||
}
|
||||
|
||||
func g1() simd.Int8x16 {
|
||||
var x simd.Int8x16
|
||||
return x // ERROR "has features avx$"
|
||||
}
|
||||
|
||||
type T1 simd.Int8x16
|
||||
|
||||
func (x T1) h() {
|
||||
return // ERROR "has features avx$"
|
||||
}
|
||||
|
||||
func f2(x simd.Int8x64) {
|
||||
return // ERROR "has features avx[+]avx2[+]avx512$"
|
||||
}
|
||||
|
||||
func g2() simd.Int8x64 {
|
||||
var x simd.Int8x64
|
||||
return x // ERROR "has features avx[+]avx2[+]avx512$"
|
||||
}
|
||||
|
||||
type T2 simd.Int8x64
|
||||
|
||||
func (x T2) h() {
|
||||
return // ERROR "has features avx[+]avx2[+]avx512$"
|
||||
}
|
||||
|
||||
var a int
|
||||
|
||||
func f() {
|
||||
if a == 0 {
|
||||
if !simd.HasAVX512() {
|
||||
return
|
||||
}
|
||||
println("has avx512") // ERROR "has features avx[+]avx2[+]avx512$"
|
||||
} else {
|
||||
if !simd.HasAVX2() {
|
||||
return
|
||||
}
|
||||
println("has avx2") // ERROR "has features avx[+]avx2$"
|
||||
}
|
||||
println("has something")
|
||||
} // ERROR "has features avx[+]avx2$"
|
||||
|
||||
func g() {
|
||||
if simd.HasAVX2() { // ERROR "has features avx[+]avx2$"
|
||||
for range 5 { // ERROR "has features avx[+]avx2$"
|
||||
if a < 0 { // ERROR "has features avx[+]avx2$"
|
||||
a++ // ERROR "has features avx[+]avx2$"
|
||||
}
|
||||
}
|
||||
}
|
||||
println("ahoy!") // ERROR "has features avx[+]avx2$" // this is an artifact of flaky block numbering and why isn't it fused?
|
||||
if a > 0 {
|
||||
a--
|
||||
}
|
||||
}
|
||||
|
||||
//go:noinline
|
||||
func p() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func hasIrreducibleLoop() {
|
||||
if simd.HasAVX2() {
|
||||
goto a // ERROR "has features avx[+]avx2$"
|
||||
} else {
|
||||
goto b
|
||||
}
|
||||
a:
|
||||
println("a")
|
||||
if p() {
|
||||
goto c
|
||||
}
|
||||
b:
|
||||
println("b")
|
||||
if p() {
|
||||
goto a
|
||||
}
|
||||
c:
|
||||
println("c")
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue