mirror of
https://github.com/golang/go
synced 2024-11-17 21:14:44 -07:00
cmd/compile: move statement marks from jumps to targets
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>
This commit is contained in:
parent
bd680d94a0
commit
82af9e6749
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user