Esempio n. 1
0
        public (List <VarsSet>, List <VarsSet>) GenerateInputOutputActiveDefs()
        {
            var In  = new List <VarsSet>();
            var Out = new List <VarsSet>();

            var startToId = GetStartToId(_bblocks);

            for (int i = 0; i < _bblocks.Count(); ++i)
            {
                In.Add(new VarsSet());
                Out.Add(new VarsSet());
            }

            bool change = true;

            while (change)
            {
                change = false;

                for (int i = 0; i < _bblocks.Count(); ++i)
                {
                    var st = _bblocks[i].StartLabel;
                    Out[i] = new VarsSet(Next[st].SelectMany(p => In[startToId[p]]));
                    int sz = In[i].Count;

                    In[i] = ActiveDefinitions.TransferByUseAndDef(Out[i], _useByStart[st], _defByStart[st]);

                    change |= sz != In[i].Count;
                }
            }

            return(In, Out);
        }
Esempio n. 2
0
 public static VarsSet TransferByUseAndDef(VarsSet X, VarsSet use, VarsSet def)
 {
     if (X == null)
     {
         return(use);
     }
     return(new VarsSet(X.Except(def).Union(use)));
 }
Esempio n. 3
0
        public static VarsSet GetUseSet(BaseBlock bblock)
        {
            var ret = new VarsSet();

            foreach (var line in bblock.Code)
            {
                if (line.LeftOp != null && !IsConst(line.LeftOp))
                {
                    ret.Add(line.LeftOp);
                }
                if (line.RightOp != null && !IsConst(line.RightOp))
                {
                    ret.Add(line.RightOp);
                }
            }

            return(ret);
        }