aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/sparsetree.go
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2017-06-14 17:28:28 -0400
committerDavid Chase <drchase@google.com>2017-07-14 15:54:13 +0000
commit9664bc1d1ff8ee2ddcea37d335ca4510a57a1e0c (patch)
treea757b1e8a0c01c125839edea6770a014de83d755 /src/cmd/compile/internal/ssa/sparsetree.go
parent26f0a7af456b3743e718002534576c6ef1ad99a3 (diff)
downloadgo-9664bc1d1ff8ee2ddcea37d335ca4510a57a1e0c.tar.gz
go-9664bc1d1ff8ee2ddcea37d335ca4510a57a1e0c.zip
cmd/compile: fix phi-function updates for preemptible loops
Previous code failed to account for particular control flow involving nested loops when updating phi function inputs. Fix involves: 1) remove incorrect shortcut 2) generate a "better" order for children in dominator tree 3) note inner-loop updates and check before applying outer-loop updates. Fixes #20675. Change-Id: I2fe21470604b5c259e777ad8b15de95f7706894d Reviewed-on: https://go-review.googlesource.com/45791 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/sparsetree.go')
-rw-r--r--src/cmd/compile/internal/ssa/sparsetree.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/sparsetree.go b/src/cmd/compile/internal/ssa/sparsetree.go
index 8e5b9f3e5b..f7af85446b 100644
--- a/src/cmd/compile/internal/ssa/sparsetree.go
+++ b/src/cmd/compile/internal/ssa/sparsetree.go
@@ -70,6 +70,24 @@ func newSparseTree(f *Func, parentOf []*Block) SparseTree {
return t
}
+// newSparseOrderedTree creates a SparseTree from a block-to-parent map (array indexed by Block.ID)
+// children will appear in the reverse of their order in reverseOrder
+// in particular, if reverseOrder is a dfs-reversePostOrder, then the root-to-children
+// walk of the tree will yield a pre-order.
+func newSparseOrderedTree(f *Func, parentOf, reverseOrder []*Block) SparseTree {
+ t := make(SparseTree, f.NumBlocks())
+ for _, b := range reverseOrder {
+ n := &t[b.ID]
+ if p := parentOf[b.ID]; p != nil {
+ n.parent = p
+ n.sibling = t[p.ID].child
+ t[p.ID].child = b
+ }
+ }
+ t.numberBlock(f.Entry, 1)
+ return t
+}
+
// treestructure provides a string description of the dominator
// tree and flow structure of block b and all blocks that it
// dominates.