// 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] | |
} |