Commit 7e68f81d authored by Giovanni Bajo's avatar Giovanni Bajo

cmd/compile: in poset, refactor aliasnode

In preparation for allowing to make multiple nodes as aliases
in a single pass, refactor aliasnode splitting out the case
in which one of the nodes is not in the post into a new
funciton (aliasnewnode).

No functional changes, passes toolstash -cmp

Change-Id: I19ca6ef8426f8aec9f2622b6151c5c617dbb25b5
Reviewed-on: https://go-review.googlesource.com/c/go/+/200859Reviewed-by: default avatarKeith Randall <khr@golang.org>
Run-TryBot: Giovanni Bajo <rasky@develer.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent c3e8a20a
......@@ -407,7 +407,19 @@ func (po *poset) newconst(n *Value) {
po.upushconst(i, 0)
}
// aliasnode records that n2 is an alias of n1
// aliasnewnode records that a single node n2 (not in the poset yet) is an alias
// of the master node n1.
func (po *poset) aliasnewnode(n1, n2 *Value) {
i1, i2 := po.values[n1.ID], po.values[n2.ID]
if i1 == 0 || i2 != 0 {
panic("aliasnewnode invalid arguments")
}
po.values[n2.ID] = i1
po.upushalias(n2.ID, 0)
}
// aliasnode records that n2 (already in the poset) is an alias of n1
func (po *poset) aliasnode(n1, n2 *Value) {
i1 := po.values[n1.ID]
if i1 == 0 {
......@@ -415,7 +427,9 @@ func (po *poset) aliasnode(n1, n2 *Value) {
}
i2 := po.values[n2.ID]
if i2 != 0 {
if i2 == 0 {
panic("aliasnode for non-existing node")
}
// Rename all references to i2 into i1
// (do not touch i1 itself, otherwise we can create useless self-loops)
for idx, n := range po.nodes {
......@@ -452,12 +466,6 @@ func (po *poset) aliasnode(n1, n2 *Value) {
po.constants[val] = i1
po.upushconst(i1, i2)
}
} else {
// n2.ID wasn't seen before, so record it as alias to i1
po.values[n2.ID] = i1
po.upushalias(n2.ID, 0)
}
}
func (po *poset) isroot(r uint32) bool {
......@@ -1093,11 +1101,11 @@ func (po *poset) SetEqual(n1, n2 *Value) bool {
i1 = po.newnode(n1)
po.roots = append(po.roots, i1)
po.upush(undoNewRoot, i1, 0)
po.aliasnode(n1, n2)
po.aliasnewnode(n1, n2)
case f1 && !f2:
po.aliasnode(n1, n2)
po.aliasnewnode(n1, n2)
case !f1 && f2:
po.aliasnode(n2, n1)
po.aliasnewnode(n2, n1)
case f1 && f2:
if i1 == i2 {
// Already aliased, ignore
......
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