aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/gostaticanalysis/analysisutil/ssa.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/gostaticanalysis/analysisutil/ssa.go')
-rw-r--r--vendor/github.com/gostaticanalysis/analysisutil/ssa.go14
1 files changed, 10 insertions, 4 deletions
diff --git a/vendor/github.com/gostaticanalysis/analysisutil/ssa.go b/vendor/github.com/gostaticanalysis/analysisutil/ssa.go
index 517f6b9b4..2e22bbe79 100644
--- a/vendor/github.com/gostaticanalysis/analysisutil/ssa.go
+++ b/vendor/github.com/gostaticanalysis/analysisutil/ssa.go
@@ -20,7 +20,8 @@ func IfInstr(b *ssa.BasicBlock) *ssa.If {
}
// Phi returns phi values which are contained in the block b.
-func Phi(b *ssa.BasicBlock) (phis []*ssa.Phi) {
+func Phi(b *ssa.BasicBlock) []*ssa.Phi {
+ var phis []*ssa.Phi
for _, instr := range b.Instrs {
if phi, ok := instr.(*ssa.Phi); ok {
phis = append(phis, phi)
@@ -29,7 +30,7 @@ func Phi(b *ssa.BasicBlock) (phis []*ssa.Phi) {
break
}
}
- return
+ return phis
}
// Returns returns a slice of *ssa.Return in the function.
@@ -54,10 +55,14 @@ func Returns(v ssa.Value) []*ssa.Return {
func returnsInBlock(b *ssa.BasicBlock, done map[*ssa.BasicBlock]bool) (rets []*ssa.Return) {
if done[b] {
- return
+ return nil
}
done[b] = true
+ if b.Index != 0 && len(b.Preds) == 0 {
+ return nil
+ }
+
if len(b.Instrs) != 0 {
switch instr := b.Instrs[len(b.Instrs)-1].(type) {
case *ssa.Return:
@@ -68,7 +73,8 @@ func returnsInBlock(b *ssa.BasicBlock, done map[*ssa.BasicBlock]bool) (rets []*s
for _, s := range b.Succs {
rets = append(rets, returnsInBlock(s, done)...)
}
- return
+
+ return rets
}
// BinOp returns binary operator values which are contained in the block b.