public static IMap <BasicBlock, IMSet <BasicBlock> > Dominators(BasicBlock root) { var preorder = PreOrder(root); var map = new Map <BasicBlock, IntSet>(preorder.Count); for (var i = 0; i < preorder.Count; i++) { var vec = new IntSet(preorder.Count); if (preorder[i].Equals(root)) { vec[i] = true; } else { vec.SetAll(true); } map.Add(preorder[i], vec); } var change = default(bool); do { change = false; for (var i = 0; i < preorder.Count; i++) { var bb = preorder[i]; if (!bb.Equals(root)) { var vec = new IntSet(preorder.Count); vec.SetAll(true); foreach (var s in bb.Sources) { vec.IntersectInPlace(map[s]); } vec[i] = true; if (!vec.Equals(map[bb])) { map[bb] = vec; change = true; } } } }while (change); var res = new Map <BasicBlock, IMSet <BasicBlock> >(); for (var i = 0; i < preorder.Count; i++) { var set = new Set <BasicBlock>(); var vec = map[preorder[i]]; foreach (var j in vec) { set.Add(preorder[j]); } res.Add(preorder[i], set); } return(res); }
public static IMap<BasicBlock, IMSet<BasicBlock>> Dominators(BasicBlock root) { var preorder = PreOrder(root); var map = new Map<BasicBlock, IntSet>(preorder.Count); for (var i = 0; i < preorder.Count; i++) { var vec = new IntSet(preorder.Count); if (preorder[i].Equals(root)) vec[i] = true; else vec.SetAll(true); map.Add(preorder[i], vec); } var change = default(bool); do { change = false; for (var i = 0; i < preorder.Count; i++) { var bb = preorder[i]; if (!bb.Equals(root)) { var vec = new IntSet(preorder.Count); vec.SetAll(true); foreach (var s in bb.Sources) vec.IntersectInPlace(map[s]); vec[i] = true; if (!vec.Equals(map[bb])) { map[bb] = vec; change = true; } } } } while (change); var res = new Map<BasicBlock, IMSet<BasicBlock>>(); for (var i = 0; i < preorder.Count; i++) { var set = new Set<BasicBlock>(); var vec = map[preorder[i]]; foreach (var j in vec) set.Add(preorder[j]); res.Add(preorder[i], set); } return res; }