1
0
mirror of https://github.com/golang/go synced 2024-11-26 10:58:16 -07:00

cmd/compile: always mark atColumn1 results as statements

In 31618, we end up comparing the is-stmt-ness of positions
to repurpose real instructions as inline marks. If the is-stmt-ness
doesn't match, we end up not being able to remove the inline mark.

Always use statement-full positions to do the matching, so we
always find a match if there is one.

Also always use positions that are statements for inline marks.

Fixes #31618

Change-Id: Idaf39bdb32fa45238d5cd52973cadf4504f947d5
Reviewed-on: https://go-review.googlesource.com/c/go/+/173324
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
Keith Randall 2019-04-22 18:21:37 -07:00 committed by Keith Randall
parent a152dd0438
commit fd788a86b6
4 changed files with 25 additions and 2 deletions

View File

@ -1055,7 +1055,7 @@ func mkinlcall(n, fn *Node, maxCost int32) *Node {
// to put a breakpoint. Not sure if that's really necessary or not
// (in which case it could go at the end of the function instead).
inlMark := nod(OINLMARK, nil, nil)
inlMark.Pos = n.Pos.WithDefaultStmt()
inlMark.Pos = n.Pos.WithIsStmt()
inlMark.Xoffset = int64(newIndex)
ninit.Append(inlMark)

View File

@ -5369,6 +5369,7 @@ func genssa(f *ssa.Func, pp *Progs) {
// We found an instruction with the same source position as
// some of the inline marks.
// Use this instruction instead.
p.Pos = p.Pos.WithIsStmt() // promote position to a statement
pp.curfn.Func.lsym.Func.AddInlMark(p, inlMarks[m])
// Make the inline mark a real nop, so it doesn't generate any code.
m.As = obj.ANOP

View File

@ -445,5 +445,5 @@ func (x lico) lineNumberHTML() string {
}
func (x lico) atColumn1() lico {
return makeLico(x.Line(), 1) | (x & (isStmtMask | xlogueMask))
return makeLico(x.Line(), 1).withIsStmt()
}

View File

@ -0,0 +1,22 @@
// asmcheck
// Copyright 2019 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.
package codegen
// Make sure we remove both inline marks in the following code.
// Both +5 and +6 should map to real instructions, which can
// be used as inline marks instead of explicit nops.
func f(x int) int {
// amd64:-"XCHGL"
x = g(x) + 5
// amd64:-"XCHGL"
x = g(x) + 6
return x
}
func g(x int) int {
return x >> 3
}