From 40649e697907d928316efac47902a1c7554c3196 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 25 Oct 2017 13:46:38 -0700 Subject: [PATCH] cmd/compile: make sure not to use SP as an index register ...because that's an illegal addressing mode. I double-checked handling of this code, and 387 is the only place where this check is missing. Fixes #22429 Change-Id: I2284fe729ea86251c6af2f04076ddf7a5e66367c Reviewed-on: https://go-review.googlesource.com/73551 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/compile/internal/x86/387.go | 6 ++++++ test/fixedbugs/issue22429.go | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/fixedbugs/issue22429.go diff --git a/src/cmd/compile/internal/x86/387.go b/src/cmd/compile/internal/x86/387.go index cdac000648..7a3622405c 100644 --- a/src/cmd/compile/internal/x86/387.go +++ b/src/cmd/compile/internal/x86/387.go @@ -46,6 +46,9 @@ func ssaGenValue387(s *gc.SSAGenState, v *ssa.Value) { case ssa.Op386MOVSSloadidx1, ssa.Op386MOVSDloadidx1: p.From.Scale = 1 p.From.Index = v.Args[1].Reg() + if p.From.Index == x86.REG_SP { + p.From.Reg, p.From.Index = p.From.Index, p.From.Reg + } case ssa.Op386MOVSSloadidx4: p.From.Scale = 4 p.From.Index = v.Args[1].Reg() @@ -95,6 +98,9 @@ func ssaGenValue387(s *gc.SSAGenState, v *ssa.Value) { case ssa.Op386MOVSSstoreidx1, ssa.Op386MOVSDstoreidx1: p.To.Scale = 1 p.To.Index = v.Args[1].Reg() + if p.To.Index == x86.REG_SP { + p.To.Reg, p.To.Index = p.To.Index, p.To.Reg + } case ssa.Op386MOVSSstoreidx4: p.To.Scale = 4 p.To.Index = v.Args[1].Reg() diff --git a/test/fixedbugs/issue22429.go b/test/fixedbugs/issue22429.go new file mode 100644 index 0000000000..289b434a74 --- /dev/null +++ b/test/fixedbugs/issue22429.go @@ -0,0 +1,18 @@ +// compile + +// Copyright 2017 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. + +// Make sure SSA->assembly pass can handle SP as an index register. + +package p + +type T struct { + a,b,c,d float32 +} + +func f(a *[8]T, i,j,k int) float32 { + b := *a + return b[i].a + b[j].b + b[k].c +} -- 2.48.1