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:
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
|
||||
// (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)
|
||||
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
|
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…
Reference in New Issue
Block a user