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