aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/cse.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2016-06-14 11:18:39 -0400
committerCherry Zhang <cherryyz@google.com>2016-06-24 17:33:39 +0000
commit8eadb89266a5a785e568f936b176d746a6d7de7c (patch)
tree113efa51d299e04bd131729c2ac95263bf23caae /src/cmd/compile/internal/ssa/cse.go
parent8086ce44c4ddaba03fe0edb62aed8ca723cf0cfe (diff)
downloadgo-8eadb89266a5a785e568f936b176d746a6d7de7c.tar.gz
go-8eadb89266a5a785e568f936b176d746a6d7de7c.zip
[dev.ssa] cmd/compile: move tuple selectors to generator's block in CSE
CSE may substitute a tuple generator with another one in a different block. In this case, since we want tuple selectors to stay together with the tuple generator, copy the selector to the new generator's block and rewrite its use. Op.isTupleGenerator and Op.isTupleSelector are introduced to assert tuple ops. Use it in tighten as well. Updates #15365. Change-Id: Ia9e8c734b9cc3bc9fca4a2750041eef9cdfac5a5 Reviewed-on: https://go-review.googlesource.com/24137 Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/cse.go')
-rw-r--r--src/cmd/compile/internal/ssa/cse.go23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/cse.go b/src/cmd/compile/internal/ssa/cse.go
index ad4e416159..dcb6eb86dd 100644
--- a/src/cmd/compile/internal/ssa/cse.go
+++ b/src/cmd/compile/internal/ssa/cse.go
@@ -163,6 +163,29 @@ func cse(f *Func) {
}
}
+ // if we rewrite a tuple generator to a new one in a different block,
+ // copy its selectors to the new generator's block, so tuple generator
+ // and selectors stay together.
+ for _, b := range f.Blocks {
+ for _, v := range b.Values {
+ if rewrite[v.ID] != nil {
+ continue
+ }
+ if !v.Op.isTupleSelector() {
+ continue
+ }
+ if !v.Args[0].Op.isTupleGenerator() {
+ f.Fatalf("arg of tuple selector %s is not a tuple: %s", v.String(), v.Args[0].LongString())
+ }
+ t := rewrite[v.Args[0].ID]
+ if t != nil && t.Block != b {
+ // v.Args[0] is tuple generator, CSE'd into a different block as t, v is left behind
+ c := v.copyInto(t.Block)
+ rewrite[v.ID] = c
+ }
+ }
+ }
+
rewrites := int64(0)
// Apply substitutions