From 23b8c7b4eab0375b3d59cf4b2a1f3d7356515f95 Mon Sep 17 00:00:00 2001 From: Joseph Richey Date: Sun, 11 Feb 2018 20:34:07 -0800 Subject: vendor: include source for tools This change vendors the source for all our build, formatting, and linting tools. Generated by running "dep ensure". --- vendor/honnef.co/go/tools/functions/loops.go | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 vendor/honnef.co/go/tools/functions/loops.go (limited to 'vendor/honnef.co/go/tools/functions/loops.go') diff --git a/vendor/honnef.co/go/tools/functions/loops.go b/vendor/honnef.co/go/tools/functions/loops.go new file mode 100644 index 0000000..63011cf --- /dev/null +++ b/vendor/honnef.co/go/tools/functions/loops.go @@ -0,0 +1,50 @@ +package functions + +import "honnef.co/go/tools/ssa" + +type Loop map[*ssa.BasicBlock]bool + +func findLoops(fn *ssa.Function) []Loop { + if fn.Blocks == nil { + return nil + } + tree := fn.DomPreorder() + var sets []Loop + for _, h := range tree { + for _, n := range h.Preds { + if !h.Dominates(n) { + continue + } + // n is a back-edge to h + // h is the loop header + if n == h { + sets = append(sets, Loop{n: true}) + continue + } + set := Loop{h: true, n: true} + for _, b := range allPredsBut(n, h, nil) { + set[b] = true + } + sets = append(sets, set) + } + } + return sets +} + +func allPredsBut(b, but *ssa.BasicBlock, list []*ssa.BasicBlock) []*ssa.BasicBlock { +outer: + for _, pred := range b.Preds { + if pred == but { + continue + } + for _, p := range list { + // TODO improve big-o complexity of this function + if pred == p { + continue outer + } + } + list = append(list, pred) + list = allPredsBut(pred, but, list) + } + return list +} -- cgit v1.3