コード例 #1
0
        private void CalculateInOut(ControlFlowGraph cfg, List <BasicBlock> blocks)
        {
            if (!Out.ContainsKey(cfg.start))
            {
                Out.Add(cfg.start, AvailableExpressionsTable.NewEmpty());
            }
            foreach (var block in blocks)
            {
                CreateGen(block);
                CreateKill(block);
                Out.Add(block, AvailableExpressionsTable.NewUniversal());
            }
            var changed = true;

            while (changed)
            {
                changed = false;
                foreach (var block in blocks)
                {
                    var prevOuts = new List <AvailableExpressionsTable>();
                    foreach (var prev in block.In)
                    {
                        prevOuts.Add(Out[prev]);
                    }
                    In[block] = AvailableExpressionsTable.Intersection(prevOuts);
                    var oldOut = Out[block];
                    Out[block] = CalculateOut(In[block], block);
                    if (!oldOut.Equals(Out[block]))
                    {
                        changed = true;
                    }
                }
            }
        }
コード例 #2
0
            public static AvailableExpressionsTable NewEmpty()
            {
                var res = new AvailableExpressionsTable();

                res.IsEmpty = true;
                return(res);
            }
コード例 #3
0
            public static AvailableExpressionsTable NewUniversal()
            {
                var res = new AvailableExpressionsTable();

                res.IsUniversal = true;
                return(res);
            }
コード例 #4
0
        public AvailableExpressionsTable CalculateOut(AvailableExpressionsTable inTable, BasicBlock block)
        {
            var newTable = inTable.Copy();
            var kill     = kills[block];

            foreach (var killVariable in kill.KillVariables)
            {
                newTable.RemoveExpressions(killVariable);
            }
            newTable.AddExpressions(kill.GenExpressions, kill.GenInstructions);
            return(newTable);
        }