Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
 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);
Ejemplo n.º 3
0
 protected sealed override GlobalFlowStateAnalysisData MergeAnalysisData(GlobalFlowStateAnalysisData value1, GlobalFlowStateAnalysisData value2)
 => GlobalFlowStateAnalysisDomainInstance.Merge(value1, value2);
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
 internal GlobalFlowStateBlockAnalysisResult(BasicBlock basicBlock, GlobalFlowStateAnalysisData blockAnalysisData)
     : base(basicBlock)
 {
     Data = blockAnalysisData?.ToImmutableDictionary() ?? ImmutableDictionary <AnalysisEntity, GlobalFlowStateAnalysisValueSet> .Empty;
 }