mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00: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:
parent
a152dd0438
commit
fd788a86b6
@ -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
|
// 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).
|
// (in which case it could go at the end of the function instead).
|
||||||
inlMark := nod(OINLMARK, nil, nil)
|
inlMark := nod(OINLMARK, nil, nil)
|
||||||
inlMark.Pos = n.Pos.WithDefaultStmt()
|
inlMark.Pos = n.Pos.WithIsStmt()
|
||||||
inlMark.Xoffset = int64(newIndex)
|
inlMark.Xoffset = int64(newIndex)
|
||||||
ninit.Append(inlMark)
|
ninit.Append(inlMark)
|
||||||
|
|
||||||
|
@ -5369,6 +5369,7 @@ func genssa(f *ssa.Func, pp *Progs) {
|
|||||||
// We found an instruction with the same source position as
|
// We found an instruction with the same source position as
|
||||||
// some of the inline marks.
|
// some of the inline marks.
|
||||||
// Use this instruction instead.
|
// Use this instruction instead.
|
||||||
|
p.Pos = p.Pos.WithIsStmt() // promote position to a statement
|
||||||
pp.curfn.Func.lsym.Func.AddInlMark(p, inlMarks[m])
|
pp.curfn.Func.lsym.Func.AddInlMark(p, inlMarks[m])
|
||||||
// Make the inline mark a real nop, so it doesn't generate any code.
|
// Make the inline mark a real nop, so it doesn't generate any code.
|
||||||
m.As = obj.ANOP
|
m.As = obj.ANOP
|
||||||
|
@ -445,5 +445,5 @@ func (x lico) lineNumberHTML() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (x lico) atColumn1() lico {
|
func (x lico) atColumn1() lico {
|
||||||
return makeLico(x.Line(), 1) | (x & (isStmtMask | xlogueMask))
|
return makeLico(x.Line(), 1).withIsStmt()
|
||||||
}
|
}
|
||||||
|
22
test/codegen/issue31618.go
Normal file
22
test/codegen/issue31618.go
Normal 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
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user