]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: move statement marks from jumps to targets
authorDavid Chase <drchase@google.com>
Mon, 28 Jan 2019 23:00:01 +0000 (18:00 -0500)
committerDavid Chase <drchase@google.com>
Wed, 13 Mar 2019 14:40:36 +0000 (14:40 +0000)
When a jump at the end of a block is about to be marked as
a statement, if the first real instruction in the target
block is also a statement for the same line, remove the
mark from the jump.

This is a first effort at a minimal-harm heuristic.
A better heuristic might skip over any "not-statement"
values preceding a definitely marked value.

Fixes #29443.

Change-Id: Ibd52783713b4936e0c2dfda8d708bf186f33b00a
Reviewed-on: https://go-review.googlesource.com/c/go/+/159977
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alessandro Arzilli <alessandro.arzilli@gmail.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/numberlines.go

index d6b2bd3137be5d24dbcd08e4c1c475a3bf849882..ecc449114d83eae2d629b12c9226314562ca7d6a 100644 (file)
@@ -5236,7 +5236,10 @@ func genssa(f *ssa.Func, pp *Progs) {
                br.P.To.Val = s.bstart[br.B.ID]
                if br.P.Pos.IsStmt() != src.PosIsStmt {
                        br.P.Pos = br.P.Pos.WithNotStmt()
+               } else if v0 := br.B.FirstPossibleStmtValue(); v0 != nil && v0.Pos.Line() == br.P.Pos.Line() && v0.Pos.IsStmt() == src.PosIsStmt {
+                       br.P.Pos = br.P.Pos.WithNotStmt()
                }
+
        }
 
        if e.log { // spew to stdout
index 3e14b9e3df38ac86e2fd116135cbac1fd6f8a6fa..ef5e13320680a1a1a2b6bc68945a03e3bce2b33e 100644 (file)
@@ -73,6 +73,16 @@ func notStmtBoundary(op Op) bool {
        return false
 }
 
+func (b *Block) FirstPossibleStmtValue() *Value {
+       for _, v := range b.Values {
+               if notStmtBoundary(v.Op) {
+                       continue
+               }
+               return v
+       }
+       return nil
+}
+
 func numberLines(f *Func) {
        po := f.Postorder()
        endlines := make(map[ID]src.XPos)