]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: always mark atColumn1 results as statements
authorKeith Randall <keithr@alum.mit.edu>
Tue, 23 Apr 2019 01:21:37 +0000 (18:21 -0700)
committerKeith Randall <khr@golang.org>
Tue, 23 Apr 2019 17:39:11 +0000 (17:39 +0000)
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>
src/cmd/compile/internal/gc/inl.go
src/cmd/compile/internal/gc/ssa.go
src/cmd/internal/src/pos.go
test/codegen/issue31618.go [new file with mode: 0644]

index 35cbadafd73ccff34235078c4b9b929a7fa7535d..5013c556631b38e02fab3c4863d008772184f387 100644 (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)
 
index 930779045ab9d18895326f61fa58e769a5f2c77f..0f043d8b5e2a5552c9db8820a91518e8ceed87c6 100644 (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
index 0e8973fe90510e70e46a7288079b40eff75ef69c..c9d3d347dbdaf22e5ccaaaf27cecb2c33de42f6e 100644 (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()
 }
diff --git a/test/codegen/issue31618.go b/test/codegen/issue31618.go
new file mode 100644 (file)
index 0000000..8effe29
--- /dev/null
@@ -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
+}