Skip to content
This repository was archived by the owner on Jul 8, 2020. It is now read-only.

Commit 2d41d6d

Browse files
committed
havlak5
1 parent 245d899 commit 2d41d6d

File tree

1 file changed

+39
-11
lines changed

1 file changed

+39
-11
lines changed

‎havlak/havlak.go‎

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,18 @@ func appendUnique(a []int, x int) []int {
260260
return append(a, x)
261261
}
262262

263+
264+
var cache struct {
265+
size int
266+
nonBackPreds [][]int
267+
backPreds [][]int
268+
number []int
269+
header []int
270+
types []int
271+
last []int
272+
nodes []*UnionFindNode
273+
}
274+
263275
// FindLoops
264276
//
265277
// Find loops and build loop forest using Havlak's algorithm, which
@@ -273,19 +285,35 @@ func FindLoops(cfgraph *CFG, lsgraph *LSG) {
273285
}
274286

275287
size := cfgraph.NumNodes()
288+
289+
if cache.size < size {
290+
cache.size = size
291+
cache.nonBackPreds = make([][]int, size)
292+
cache.backPreds = make([][]int, size)
293+
cache.number = make([]int, size)
294+
cache.header = make([]int, size)
295+
cache.types = make([]int, size)
296+
cache.last = make([]int, size)
297+
cache.nodes = make([]*UnionFindNode, size)
298+
for i := range cache.nodes {
299+
cache.nodes[i] = new(UnionFindNode)
300+
}
301+
}
276302

277-
nonBackPreds := make([][]int, size)
278-
backPreds := make([][]int, size)
279-
280-
number := make([]int, size)
281-
header := make([]int, size, size)
282-
types := make([]int, size, size)
283-
last := make([]int, size, size)
284-
nodes := make([]*UnionFindNode, size, size)
285-
286-
for i := 0; i < size; i++ {
287-
nodes[i] = new(UnionFindNode)
303+
nonBackPreds := cache.nonBackPreds[:size]
304+
for i := range nonBackPreds {
305+
nonBackPreds[i] = nonBackPreds[i][:0]
288306
}
307+
backPreds := cache.backPreds[:size]
308+
for i := range nonBackPreds {
309+
backPreds[i] = backPreds[i][:0]
310+
}
311+
number := cache.number[:size]
312+
header := cache.header[:size]
313+
types := cache.types[:size]
314+
last := cache.last[:size]
315+
nodes := cache.nodes[:size]
316+
289317

290318
// Step a:
291319
// - initialize all nodes as unvisited.

0 commit comments

Comments
��(0)