aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2025-08-01 07:38:55 -0700
committerKeith Randall <khr@golang.org>2025-08-01 08:57:29 -0700
commiteef5f8d93016147718afba8a05282d2ba7332c51 (patch)
tree758ad8a47cfbdeac24716e7408ac9a35c2c8642a /src/cmd/compile
parente071617222e373f59db8995ce171bae708e0dcef (diff)
downloadgo-eef5f8d93016147718afba8a05282d2ba7332c51.tar.xz
cmd/compile: enforce that locals are always accessed with SP base register
After CL 678937, we could have a situation where the value of the stack pointer is in both SP and another register. We need to make sure that regalloc picks SP when issuing a reference to local variables; the assembler expects that. Fixes #74836 Change-Id: I2ac73ece6eb44b4a78c1369f8a69e51ab9748754 Reviewed-on: https://go-review.googlesource.com/c/go/+/692395 Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Mark Freeman <mark@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/cmd/compile')
-rw-r--r--src/cmd/compile/internal/ssa/regalloc.go6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go
index de49bb40c5..fb9642cfed 100644
--- a/src/cmd/compile/internal/ssa/regalloc.go
+++ b/src/cmd/compile/internal/ssa/regalloc.go
@@ -1583,6 +1583,12 @@ func (s *regAllocState) regalloc(f *Func) {
mask &^= desired.avoid
}
}
+ if mask&s.values[v.Args[i.idx].ID].regs&(1<<s.SPReg) != 0 {
+ // Prefer SP register. This ensures that local variables
+ // use SP as their base register (instead of a copy of the
+ // stack pointer living in another register). See issue 74836.
+ mask = 1 << s.SPReg
+ }
args[i.idx] = s.allocValToReg(v.Args[i.idx], mask, true, v.Pos)
}