protected override void SetAbstractValue(GlobalFlowStateAnalysisData analysisData, AnalysisEntity analysisEntity, GlobalFlowStateAnalysisValueSet value) { // PERF: Avoid creating an entry if the value is the default unknown value. if (value.Kind != GlobalFlowStateAnalysisValueSetKind.Known && !analysisData.ContainsKey(analysisEntity)) { return; } analysisData[analysisEntity] = value; }
protected sealed override GlobalFlowStateAnalysisData MergeAnalysisData(GlobalFlowStateAnalysisData value1, GlobalFlowStateAnalysisData value2, BasicBlock forBlock) => HasPredicatedGlobalState && forBlock.DominatesPredecessors(DataFlowAnalysisContext.ControlFlowGraph) ? GlobalFlowStateAnalysisDomainInstance.Intersect(value1, value2, GlobalFlowStateAnalysisValueSetDomain.Intersect) : GlobalFlowStateAnalysisDomainInstance.Merge(value1, value2);
protected sealed override GlobalFlowStateAnalysisData MergeAnalysisData(GlobalFlowStateAnalysisData value1, GlobalFlowStateAnalysisData value2) => GlobalFlowStateAnalysisDomainInstance.Merge(value1, value2);
public sealed override (GlobalFlowStateAnalysisData output, bool isFeasibleBranch) FlowBranch(BasicBlock fromBlock, BranchWithInfo branch, GlobalFlowStateAnalysisData input) { var result = base.FlowBranch(fromBlock, branch, input); if (HasPredicatedGlobalState && branch.ControlFlowConditionKind != ControlFlowConditionKind.None && branch.BranchValue != null && result.isFeasibleBranch) { var branchValue = GetCachedAbstractValue(branch.BranchValue); var negate = branch.ControlFlowConditionKind == ControlFlowConditionKind.WhenFalse; MergeAndSetGlobalState(branchValue, negate); } return(result); }
protected sealed override GlobalFlowStateAnalysisData MergeAnalysisDataForBackEdge(GlobalFlowStateAnalysisData value1, GlobalFlowStateAnalysisData value2, BasicBlock forBlock) { // If we are merging analysis data for back edge, we have done at least one analysis pass for the block // and should replace 'Unset' value with 'Empty' value for the next pass. if (value1.TryGetValue(GlobalEntity, out var value) && value == GlobalFlowStateAnalysisValueSet.Unset) { value1[GlobalEntity] = GlobalFlowStateAnalysisValueSet.Empty; } if (value2.TryGetValue(GlobalEntity, out value) && value == GlobalFlowStateAnalysisValueSet.Unset) { value2[GlobalEntity] = GlobalFlowStateAnalysisValueSet.Empty; } return(base.MergeAnalysisDataForBackEdge(value1, value2, forBlock)); }
internal GlobalFlowStateBlockAnalysisResult(BasicBlock basicBlock, GlobalFlowStateAnalysisData blockAnalysisData) : base(basicBlock) { Data = blockAnalysisData?.ToImmutableDictionary() ?? ImmutableDictionary <AnalysisEntity, GlobalFlowStateAnalysisValueSet> .Empty; }