@@ -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