blob: 8ffb4590744100ca84babd7ffbb6290cf1bc4d8c [file] [log] [blame]
// 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) {
n := 0
for _, b := range f.Blocks {
if b.Kind != BlockPlain || len(b.Values) != 0 || len(b.Preds) != 1 {
f.Blocks[n] = b
n++
continue
}
// TODO: handle len(b.Preds)>1 case.
// Splice b out of the graph.
p := b.Preds[0].b
i := b.Preds[0].i
s := b.Succs[0].b
j := b.Succs[0].i
p.Succs[i] = Edge{s, j}
s.Preds[j] = Edge{p, i}
}
tail := f.Blocks[n:]
for i := range tail {
tail[i] = nil
}
f.Blocks = f.Blocks[:n]
}