aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/trim.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/compile/internal/ssa/trim.go')
-rw-r--r--src/cmd/compile/internal/ssa/trim.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/trim.go b/src/cmd/compile/internal/ssa/trim.go
new file mode 100644
index 0000000000..594d2aa372
--- /dev/null
+++ b/src/cmd/compile/internal/ssa/trim.go
@@ -0,0 +1,37 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ssa
+
+// trim removes blocks with no code in them.
+// These blocks were inserted to remove critical edges.
+func trim(f *Func) {
+ i := 0
+ for _, b := range f.Blocks {
+ if b.Kind != BlockPlain || len(b.Values) != 0 || len(b.Preds) != 1 {
+ f.Blocks[i] = b
+ i++
+ continue
+ }
+ // TODO: handle len(b.Preds)>1 case.
+
+ // Splice b out of the graph.
+ pred := b.Preds[0]
+ succ := b.Succs[0]
+ for j, s := range pred.Succs {
+ if s == b {
+ pred.Succs[j] = succ
+ }
+ }
+ for j, p := range succ.Preds {
+ if p == b {
+ succ.Preds[j] = pred
+ }
+ }
+ }
+ for j := i; j < len(f.Blocks); j++ {
+ f.Blocks[j] = nil
+ }
+ f.Blocks = f.Blocks[:i]
+}