Пример #1
0
        private static bool IsVersionToBeReplaced(VarVersionPair usedvar, Dictionary <int
                                                                                      , HashSet <VarVersionPair> > mapVars, SSAUConstructorSparseEx ssau, VarVersionPair
                                                  leftpaar)
        {
            VarVersionsGraph    ssuversions = ssau.GetSsuversions();
            SFormsFastMapDirect mapLiveVars = ssau.GetLiveVarVersionsMap(usedvar);

            if (mapLiveVars == null)
            {
                // dummy version, predecessor of a phi node
                return(false);
            }
            // compare protected ranges
            if (!InterpreterUtil.EqualObjects(ssau.GetMapVersionFirstRange().GetOrNullable(leftpaar
                                                                                           ), ssau.GetMapVersionFirstRange().GetOrNullable(usedvar)))
            {
                return(false);
            }
            foreach (KeyValuePair <int, HashSet <VarVersionPair> > ent in mapVars)
            {
                FastSparseSetFactory <int> .FastSparseSet <int> liveverset = mapLiveVars.Get(ent.Key);
                if (liveverset == null)
                {
                    return(false);
                }
                HashSet <VarVersionNode> domset = new HashSet <VarVersionNode>();
                foreach (VarVersionPair verpaar in ent.Value)
                {
                    domset.Add(ssuversions.nodes.GetWithKey(verpaar));
                }
                bool isdom = false;
                foreach (int livever in liveverset)
                {
                    VarVersionNode node = ssuversions.nodes.GetWithKey(new VarVersionPair(ent.Key, livever
                                                                                          ));
                    if (ssuversions.IsDominatorSet(node, domset))
                    {
                        isdom = true;
                        break;
                    }
                }
                if (!isdom)
                {
                    return(false);
                }
            }
            return(true);
        }
Пример #2
0
        private static bool GetUsedVersions(SSAUConstructorSparseEx ssa, VarVersionPair
                                            var, List <VarVersionNode> res)
        {
            VarVersionsGraph            ssuversions = ssa.GetSsuversions();
            VarVersionNode              varnode     = ssuversions.nodes.GetWithKey(var);
            HashSet <VarVersionNode>    setVisited  = new HashSet <VarVersionNode>();
            HashSet <VarVersionNode>    setNotDoms  = new HashSet <VarVersionNode>();
            LinkedList <VarVersionNode> stack       = new LinkedList <VarVersionNode>();

            stack.AddLast(varnode);
            while (!(stack.Count == 0))
            {
                VarVersionNode nd = stack.RemoveAtReturningValue(0);
                setVisited.Add(nd);
                if (nd != varnode && (nd.flags & VarVersionNode.Flag_Phantom_Finexit) == 0)
                {
                    res.Add(nd);
                }
                foreach (VarVersionEdge edge in nd.succs)
                {
                    VarVersionNode succ = edge.dest;
                    if (!setVisited.Contains(edge.dest))
                    {
                        bool isDominated = true;
                        foreach (VarVersionEdge prededge in succ.preds)
                        {
                            if (!setVisited.Contains(prededge.source))
                            {
                                isDominated = false;
                                break;
                            }
                        }
                        if (isDominated)
                        {
                            stack.AddLast(succ);
                        }
                        else
                        {
                            setNotDoms.Add(succ);
                        }
                    }
                }
            }
            setNotDoms.RemoveAll(setVisited);
            return(!(setNotDoms.Count == 0));
        }