private void CollectLoopBody(GraphNode gn) { if (gn == Cutpoint) { return; } if (!LoopNodes.Contains(gn)) { if (gn.IsCutpoint) // nested loop found { Loop lo = new Loop(gn); foreach (GraphNode lgn in lo.LoopNodes) { if (!LoopNodes.Contains(lgn)) { LoopNodes.Add(lgn); } } NestedLoops.Add(lo); } else { LoopNodes.Add(gn); } foreach (GraphNode pre in gn.Pre) { if (!gn.LoopingPred.Contains(pre)) { CollectLoopBody(pre); } } } }
private void CollectLoopExitNodes() { foreach (GraphNode gn in LoopNodes) { foreach (GraphNode gn_ in gn.Suc) { if (!LoopNodes.Contains(gn_) && !LoopExitNodes.Contains(gn_)) { LoopExitNodes.Add(gn_); } } } }
public Loop(GraphNode cutpoint) { if (!cutpoint.IsCutpoint) { Debugger.Break(); } Cutpoint = cutpoint; LoopNodes.Add(Cutpoint); foreach (GraphNode gn in Cutpoint.LoopingPred) { CollectLoopBody(gn); } CollectLoopExitNodes(); }
// Copy Constructor public Loop(Loop l, GraphAnalyzer ga, string prefix) { Dictionary <GraphNode, GraphNode> clonemap = new Dictionary <GraphNode, GraphNode>(); GraphNode clonecutpoint = null; foreach (GraphNode gn in l.LoopNodes) { clonemap[gn] = ga.CloneGraphNode(gn, prefix); if (gn == l.Cutpoint) { clonecutpoint = clonemap[gn]; } } if (clonecutpoint == null) { Debugger.Break(); return; } // Replace the pre and post nodes by the corresponding clone foreach (GraphNode gn in l.LoopNodes) { List <GraphNode> newl = new List <GraphNode>(); foreach (GraphNode g in clonemap[gn].Pre) { if (clonemap.ContainsKey(g)) { newl.Add(clonemap[g]); } else { newl.Add(g); } } clonemap[gn].Pre = newl; newl = new List <GraphNode>(); foreach (GraphNode g in clonemap[gn].Suc) { if (clonemap.ContainsKey(g)) { newl.Add(clonemap[g]); } else { newl.Add(g); } } clonemap[gn].Suc = newl; newl = new List <GraphNode>(); foreach (GraphNode g in clonemap[gn].LoopingPred) { if (clonemap.ContainsKey(g)) { newl.Add(clonemap[g]); } else { newl.Add(g); } } clonemap[gn].LoopingPred = newl; } foreach (GraphNode gn in l.Cutpoint.LoopingPred) { clonecutpoint.LoopingPred.Remove(gn); clonecutpoint.LoopingPred.Add(clonemap[gn]); } SucLoops.AddRange(l.SucLoops); PreLoops.AddRange(l.PreLoops); Cutpoint = clonecutpoint; LoopNodes.Add(Cutpoint); foreach (GraphNode gn in Cutpoint.LoopingPred) { CollectLoopBody(gn); } CollectLoopExitNodes(); }