public CoreValueContentAnalysisData MergeAnalysisDataForBackEdge(CoreValueContentAnalysisData forwardEdgeAnalysisData, CoreValueContentAnalysisData backEdgeAnalysisData) { Debug.Assert(forwardEdgeAnalysisData != null); Debug.Assert(backEdgeAnalysisData != null); // Stop tracking values present in both branches if their is an assignment to different literal values from the back edge. // Clone the input forwardEdgeAnalysisData to ensure we don't overwrite the input dictionary. using (forwardEdgeAnalysisData = new CoreValueContentAnalysisData(forwardEdgeAnalysisData)) { var keysInMap1 = forwardEdgeAnalysisData.Keys.ToList(); foreach (var key in keysInMap1) { var forwardEdgeValue = forwardEdgeAnalysisData[key]; if (backEdgeAnalysisData.TryGetValue(key, out var backEdgeValue) && backEdgeValue != forwardEdgeValue && backEdgeValue.NonLiteralState == forwardEdgeValue.NonLiteralState) { forwardEdgeAnalysisData[key] = ValueContentAbstractValue.MayBeContainsNonLiteralState; } } var resultMap = Merge(forwardEdgeAnalysisData, backEdgeAnalysisData); Debug.Assert(Compare(forwardEdgeAnalysisData, resultMap) <= 0); Debug.Assert(Compare(backEdgeAnalysisData, resultMap) <= 0); return(resultMap); } }
internal ValueContentAnalysisData( CoreValueContentAnalysisData mergedCoreAnalysisData, PredicatedAnalysisData <AnalysisEntity, ValueContentAbstractValue> predicatedData1, PredicatedAnalysisData <AnalysisEntity, ValueContentAbstractValue> predicatedData2, bool isReachableData, MapAbstractDomain <AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain) : base(mergedCoreAnalysisData, predicatedData1, predicatedData2, isReachableData, coreDataAnalysisDomain) { }