Skip to content

Commit

Permalink
cmd/compile: always mark atColumn1 results as statements
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: David Chase <[email protected]>
  • Loading branch information
randall77 committed Apr 23, 2019
1 parent a152dd0 commit fd788a8
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/gc/inl.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
1 change: 1 addition & 0 deletions src/cmd/compile/internal/gc/ssa.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/internal/src/pos.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 22 additions & 0 deletions test/codegen/issue31618.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit fd788a8

Please sign in to comment.