private ReachingSet AnalyzeNode(TaggedEdge <CFGBlock, EdgeTag> edge) { if (ReachingSetDictionary[edge.Source] == null) { ReachingSetDictionary = ReachingSetDictionary.SetItem(edge.Source, new ReachingSet()); } if (ReachingSetDictionary[edge.Target] == null) { ReachingSetDictionary = ReachingSetDictionary.SetItem(edge.Target, new ReachingSet()); } var node = edge.Target; // IN: // U RD_OUT(l') // (l'~>l) ReachingSetDictionary = ReachingSetDictionary.SetItem(node, ReachingSetDictionary[node].AddInVarRange(ReachingSetDictionary[edge.Source].DefinedOutVars, true)); // OUT: // (RD_IN(l) \ kill(l)) U gen(l) var Out = ReachingSetDictionary[node]; Out = Out.AddOutVarRange(ReachingSetDictionary[node].DefinedInVars); XmlTraverser xmlTraverser = new XmlTraverser(); CFGASTNodeVisitor nodeVisitor = new CFGASTNodeVisitor(); xmlTraverser.AddVisitor(nodeVisitor); if (node.AstEntryNode != null) { var nodeToTraverse = Conditional.HasConditionNode(node.AstEntryNode) ? Conditional.GetCondNode(node.AstEntryNode) : node.AstEntryNode; xmlTraverser.Traverse(nodeToTraverse); foreach (var currNode in nodeVisitor.NodesOfInterest) { var varNode = AstNodeInfo.GetVarNameXmlNode(currNode); ValueInfo varInfo = new ValueInfo() { Block = node }; varInfo = VariableInfoComposer.AnalyzeBlock(varInfo); var gs = new Variable(AstNodeInfo.GetVarNameXmlNode(currNode).Name, VariableScope.Unknown); gs = gs.AddVarInfo(varInfo); Out = Out.AddOutVar(varNode.InnerText, gs); } } ReachingSetDictionary = ReachingSetDictionary.SetItem(node, ReachingSetDictionary[node].AddOutVarRange(Out.DefinedOutVars)); return(ReachingSetDictionary[node]); }