mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
38 lines
815 B
Go
38 lines
815 B
Go
|
|
// 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]
|
||
|
|
}
|