test/loopbce: SSA-based compilation fails
Closed this issue · 2 comments
binarycrusader commented
test/loopbce.go currently fails to compile when SSA-built.
It is cross-compiled for sparc64 from an amd64 system using:
SSATEST=1 GOSSAHASH="" GOOS=solaris GOARCH=sparc64 go tool compile ddd.go
When compilation is attempted it fails as follows:
loopbce.go:254: illegal combination 01098 (loopbce.go:200) ADD $-9223372036854775757, O0, O1 ClassConst ClassReg ClassNone ClassReg, 9 15368 0 12
loopbce.go:254: illegal combination 00152 (loopbce.go:200) ADD $-9223372036854775757, O0, O1 ClassConst ClassReg ClassNone ClassReg, 9 15368 0 12
loopbce.go:254: illegal combination 01223 (loopbce.go:229) ADD $-9223372036854775808, CTXT, O0 ClassConst ClassReg ClassNone ClassReg, 9 15362 0 12
loopbce.go:254: illegal combination 00304 (loopbce.go:229) ADD $-9223372036854775808, CTXT, O0 ClassConst ClassReg ClassNone ClassReg, 9 15362 0 12
binarycrusader commented
minimal example based on a reduction of test/loopbce.go:
package main
//go:noinline
func k5(a [100]int) [100]int {
max := (1 << 63) - 1
for i := max - 50; i < max; i++ { // ERROR "Induction variable with minimum 9223372036854775757 and increment 1$"
a[i-max+50] = i
a[i-(max-70)] = i // ERROR "Found redundant \(IsInBounds ind 100\), ind < 70$"
}
return a
}
func main() {
}
binarycrusader commented
Constants encdoded into instructions generally have a limit of a signed 13-bit immediate value, so when rewriting operations into a *const form, so we need to update SPARC64.rules to ensure the constant value does not exceed that range.
Fixed.