package main
+// test64BitConstMulti tests that rewrite rules don't fold 64 bit constants
+// into multiply instructions.
func test64BitConstMult(a, b int64) {
want := 34359738369*a + b*34359738370
if got := test64BitConstMult_ssa(a, b); want != got {
return 34359738369*a + b*34359738370
}
+// test64BitConstAdd tests that rewrite rules don't fold 64 bit constants
+// into add instructions.
func test64BitConstAdd(a, b int64) {
want := a + 575815584948629622 + b + 2991856197886747025
if got := test64BitConstAdd_ssa(a, b); want != got {
return a + 575815584948629622 + b + 2991856197886747025
}
+// testRegallocCVSpill tests that regalloc spills a value whose last use is the
+// current value.
+func testRegallocCVSpill(a, b, c, d int8) {
+ want := a + -32 + b + 63*c*-87*d
+ if got := testRegallocCVSpill_ssa(a, b, c, d); want != got {
+ println("testRegallocCVSpill failed, wanted", want, "got", got)
+ failed = true
+ }
+}
+func testRegallocCVSpill_ssa(a, b, c, d int8) int8 {
+ switch {
+ }
+ return a + -32 + b + 63*c*-87*d
+}
+
var failed = false
func main() {
test64BitConstMult(1, 2)
test64BitConstAdd(1, 2)
+ testRegallocCVSpill(1, 2, 3, 4)
if failed {
panic("failed")
if regs[r].v != nil {
x := regs[r].v
c := regs[r].c
- if regs[r].dirty && lastUse[x.ID] > idx {
+ if regs[r].dirty && lastUse[x.ID] >= idx {
// Write x back to home. Its value is currently held in c.
x.Op = OpStoreReg
x.Aux = nil
if regs[r].v != nil {
x := regs[r].v
c := regs[r].c
- if regs[r].dirty && lastUse[x.ID] > idx {
+ if regs[r].dirty && lastUse[x.ID] >= idx {
// Write x back to home. Its value is currently held in c.
x.Op = OpStoreReg
x.Aux = nil