4ad/go

test/loopbce: SSA-based compilation fails

Closed this issue · 2 comments

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

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() {
}

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.