Commit ff9481ec authored by Keith Randall's avatar Keith Randall Committed by Keith Randall

cmd/compile: order nil checks by source position

There's nothing enforcing ordering between redundant nil checks when
they may occur during the same memory state. Commit to using the
earliest one in source order.

Otherwise the choice of which to remove depends on the ordering of
values in a block (before scheduling). That's unfortunate when trying
to ensure that the compiler doesn't depend on that ordering for
anything.

Update #20178

Change-Id: I2cdd5be10618accd9d91fa07406c90cbd023ffba
Reviewed-on: https://go-review.googlesource.com/c/151517
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarDavid Chase <drchase@google.com>
Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
parent 71f9f4b8
...@@ -4,7 +4,10 @@ ...@@ -4,7 +4,10 @@
package ssa package ssa
import "container/heap" import (
"container/heap"
"sort"
)
const ( const (
ScorePhi = iota // towards top of block ScorePhi = iota // towards top of block
...@@ -447,5 +450,33 @@ func storeOrder(values []*Value, sset *sparseSet, storeNumber []int32) []*Value ...@@ -447,5 +450,33 @@ func storeOrder(values []*Value, sset *sparseSet, storeNumber []int32) []*Value
count[s-1]++ count[s-1]++
} }
// Order nil checks in source order. We want the first in source order to trigger.
// If two are on the same line, we don't really care which happens first.
// See issue 18169.
if hasNilCheck {
start := -1
for i, v := range order {
if v.Op == OpNilCheck {
if start == -1 {
start = i
}
} else {
if start != -1 {
sort.Sort(bySourcePos(order[start:i]))
start = -1
}
}
}
if start != -1 {
sort.Sort(bySourcePos(order[start:]))
}
}
return order return order
} }
type bySourcePos []*Value
func (s bySourcePos) Len() int { return len(s) }
func (s bySourcePos) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s bySourcePos) Less(i, j int) bool { return s[i].Pos.Before(s[j].Pos) }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment