private void TraceOutsideFunctionBoundsRec(InstructionNode currentNode, Dictionary <InstructionNode, MergeNodeTraceData> mergingNodesData, InstructionNode lastNode = null, StateProviderCollection stateProviders = null, List <InstructionNode> visited = null) { if (visited == null) { visited = new List <InstructionNode>(); lastNode = currentNode; stateProviders = new StateProviderCollection(); GlobalVisited.Clear(); } while (true) { if (visited.Contains(currentNode)) { if (!currentNode.BranchProperties.MergingNodeProperties.IsMergingNode) { return; } } visited.Add(currentNode); GlobalVisited.Add(currentNode); bool reachedMergeNodeNotLast; int stateProviderCount = stateProviders.Count; ActOnCurrentNode(currentNode, mergingNodesData, lastNode, stateProviders, out reachedMergeNodeNotLast); if (reachedMergeNodeNotLast) { return; } lastNode = currentNode; if (currentNode.ProgramFlowForwardRoutes.Count == 1) { currentNode = currentNode.ProgramFlowForwardRoutes[0]; } else { break; } } if (currentNode.ProgramFlowForwardRoutes.Count == 0) { return; } if (!(currentNode is ConditionalJumpNode)) { Console.WriteLine("Splitting without a conditional"); } foreach (var node in currentNode.ProgramFlowForwardRoutes) { TraceOutsideFunctionBoundsRec(node, mergingNodesData, currentNode, stateProviders, visited); } }
private static void ActOnCurrentNode(InstructionNode currentNode, Dictionary <InstructionNode, MergeNodeTraceData> mergingNodesData, InstructionNode lastNode, StateProviderCollection stateProviders, out bool reachedMergeNodeNotLast) { if (currentNode.BranchProperties.MergingNodeProperties.IsMergingNode) { lock (mergingNodesData) { mergingNodesData[currentNode].ReachedNodes.Add(lastNode); mergingNodesData[currentNode].AccumelatedStateProviders.AddNewProviders(stateProviders); bool allBranchesReached = !currentNode.ProgramFlowBackRoutes.Except(mergingNodesData[currentNode].ReachedNodes).Any(); if (allBranchesReached) { mergingNodesData[currentNode].AllBranchesReached = true; mergingNodesData[currentNode].AccumelatedStateProviders.MergeBranches(currentNode); stateProviders.AddNewProviders(mergingNodesData[currentNode].AccumelatedStateProviders); } else { reachedMergeNodeNotLast = true; return; } } } var newStoreState = StoreDynamicDataStateProvider.GetMatchingStateProvider(currentNode); if (newStoreState != null) { stateProviders.AddNewProvider(newStoreState); } IDynamicDataLoadNode loadNode = currentNode as IDynamicDataLoadNode; if (loadNode != null) { foreach (var storeNode in stateProviders.MatchLoadToStore(currentNode)) { currentNode.DataFlowBackRelated.AddTwoWay(storeNode, loadNode.DataFlowDataProdivderIndex); } } reachedMergeNodeNotLast = false; }