示例#1
0
        protected override void Run()
        {
            if (!HasCode)
            {
                return;
            }

            if (HasProtectedRegions)
            {
                return;
            }

            trace = CreateTraceLog(8);

            foreach (var headBlock in BasicBlocks.HeadBlocks)
            {
                var analysis = new SimpleFastDominance(BasicBlocks, headBlock);
                blockAnalysis.Add(headBlock, analysis);
            }

            CollectAssignments2();

            PlacePhiFunctionsMinimal();

            EnterSSA();

            RemoveUselessPhiInstructions();

            MethodCompiler.IsInSSAForm = true;
        }
        private void OutputDiagram()
        {
            var trace = CreateTraceLog("Diagram");
            var sb    = new StringBuilder();

            trace.Log("digraph blocks {");

            foreach (var headBlock in BasicBlocks.HeadBlocks)
            {
                var dominance = new SimpleFastDominance(BasicBlocks, headBlock);

                for (int i = 0; i < BasicBlocks.Count; i++)
                {
                    var block = BasicBlocks[i];

                    var children = dominance.GetChildren(block);
                    if (children != null && children.Count != 0)
                    {
                        foreach (var child in children)
                        {
                            trace.Log("\t" + block + " -> " + child);
                        }
                    }
                }
            }

            trace.Log("}");
        }
        private void OutputDominanceBlock()
        {
            var trace = CreateTraceLog("DominanceBlock");
            var sb    = new StringBuilder();

            foreach (var headBlock in BasicBlocks.HeadBlocks)
            {
                trace.Log("Head: " + headBlock);
                var dominance = new SimpleFastDominance(BasicBlocks, headBlock);

                for (int i = 0; i < BasicBlocks.Count; i++)
                {
                    var block = BasicBlocks[i];

                    sb.Clear();
                    sb.Append("  Block ");
                    sb.Append(block);
                    sb.Append(" : ");

                    var dom = dominance.GetImmediateDominator(block);

                    sb.Append((dom != null) ? dom.ToString() : string.Empty);

                    trace.Log(sb.ToString());
                }

                trace.Log();
            }
        }
示例#4
0
        protected override void Run()
        {
            // Method is empty - must be a plugged method
            if (BasicBlocks.HeadBlocks.Count == 0)
            {
                return;
            }

            if (HasProtectedRegions)
            {
                return;
            }

            trace = CreateTraceLog(6);

            foreach (var headBlock in BasicBlocks.HeadBlocks)
            {
                var analysis = new SimpleFastDominance(BasicBlocks, headBlock);
                blockAnalysis.Add(headBlock, analysis);
            }

            CollectAssignments();

            PlacePhiFunctionsMinimal();

            EnterSSA();
        }
示例#5
0
        public static void DominanceCalculation1()
        {
            var basicBlocks = BlockTests.Scenario3;

            var dominance = new SimpleFastDominance(basicBlocks, basicBlocks[0]);

            var provider = dominance as IDominanceAnalysis;

            Assert.Same(provider.GetImmediateDominator(basicBlocks[0]), null);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[1]), basicBlocks[0]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[2]), basicBlocks[0]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[3]), basicBlocks[2]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[4]), basicBlocks[2]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[5]), basicBlocks[2]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[6]), basicBlocks[0]);

            Assert.Equal(provider.GetDominators(basicBlocks[0]), new[] { basicBlocks[0] });
            //Assert.Equal(provider.GetDominators(basicBlocks[1]), new[] { basicBlocks[0], basicBlocks[1] });
            //Assert.Equal(provider.GetDominators(basicBlocks[2]), new[] { basicBlocks[0], basicBlocks[2] });
            //Assert.Equal(provider.GetDominators(basicBlocks[3]), new[] { basicBlocks[0], basicBlocks[2], basicBlocks[3] });
            //Assert.Equal(provider.GetDominators(basicBlocks[4]), new[] { basicBlocks[0], basicBlocks[2], basicBlocks[4] });
            //Assert.Equal(provider.GetDominators(basicBlocks[5]), new[] { basicBlocks[0], basicBlocks[2], basicBlocks[5] });
            //Assert.Equal(provider.GetDominators(basicBlocks[6]), new[] { basicBlocks[0], basicBlocks[6] });

            Dump(basicBlocks, dominance);
        }
        protected override void Run()
        {
            if (HasProtectedRegions)
            {
                return;
            }

            // Method is empty - must be a plugged method
            if (BasicBlocks.HeadBlocks.Count != 1)
            {
                return;
            }

            if (BasicBlocks.PrologueBlock == null)
            {
                return;
            }

            trace = CreateTraceLog(5);

            MapToValueNumber = new Dictionary <Operand, Operand>(MethodCompiler.VirtualRegisters.Count);
            Expressions      = new Dictionary <int, List <Expression> >();
            Processed        = new BitArray(BasicBlocks.Count, false);

            AnalysisDominance = new SimpleFastDominance(BasicBlocks, BasicBlocks.PrologueBlock);

            ReversePostOrder = AnalysisDominance.GetReversePostOrder();

            DetermineReadOnlyParameters();

            ValueNumber();
        }
示例#7
0
        /// <summary>
        /// Renames the variables.
        /// </summary>
        /// <param name="headBlock">The head block.</param>
        /// <param name="dominanceAnalysis">The dominance analysis.</param>
        private void RenameVariables(BasicBlock headBlock, SimpleFastDominance dominanceAnalysis)
        {
            var worklist = new Stack <BasicBlock>();

            worklist.Push(headBlock);

            while (worklist.Count != 0)
            {
                var block = worklist.Pop();

                if (block != null)
                {
                    if (trace.Active)
                    {
                        trace.Log("Processing: " + block);
                    }

                    UpdateOperands(block);
                    UpdatePHIs(block);

                    worklist.Push(block);
                    worklist.Push(null);

                    if (trace.Active)
                    {
                        trace.Log("  >Pushed: " + block + " (Return)");
                    }

                    // Repeat for all children of the dominance block, if any
                    var children = dominanceAnalysis.GetChildren(block);
                    if (children != null && children.Count > 0)
                    {
                        foreach (var s in children)
                        {
                            worklist.Push(s);

                            if (trace.Active)
                            {
                                trace.Log("  >Pushed: " + s);
                            }
                        }
                    }
                }
                else
                {
                    block = worklist.Pop();

                    if (trace.Active)
                    {
                        trace.Log("Processing: " + block + " (Back)");
                    }
                    UpdateResultOperands(block);
                }
            }
        }
        protected override void Run()
        {
            if (!MethodCompiler.IsInSSAForm)
            {
                return;
            }

            if (HasProtectedRegions)
            {
                return;
            }

            // Method is empty - must be a plugged method
            if (BasicBlocks.HeadBlocks.Count != 1)
            {
                return;
            }

            if (BasicBlocks.PrologueBlock == null)
            {
                return;
            }

            trace = CreateTraceLog(5);

            ParamStoreSet = CollectParamStores();

            AnalysisDominance = new SimpleFastDominance(BasicBlocks, BasicBlocks.PrologueBlock);

            var loops = FindLoops();

            if (loops.Count == 0)
            {
                return;
            }

            if (trace != null)
            {
                DumpLoops(loops);
            }

            SortLoops(loops);

            FindLoopInvariantInstructions(loops);

            if (CodeMotionCount.Count != 0)
            {
                Methods.Increment();
            }

            if (CompilerSettings.FullCheckMode)
            {
                CheckAllPhiInstructions();
            }
        }
        protected override void Finish()
        {
            MapToValueNumber = null;
            Expressions      = null;
            Processed        = null;

            AnalysisDominance = null;
            ReversePostOrder  = null;
            ParamReadOnly     = null;

            trace = null;
        }
示例#10
0
        protected override void Run()
        {
            if (HasProtectedRegions)
            {
                return;
            }

            // Method is empty - must be a plugged method
            if (BasicBlocks.HeadBlocks.Count != 1)
            {
                return;
            }

            if (BasicBlocks.PrologueBlock == null)
            {
                return;
            }

            trace = CreateTraceLog(5);

            AnalysisDominance = new SimpleFastDominance(BasicBlocks, BasicBlocks.PrologueBlock);

            var loops = FindLoops();

            if (loops.Count == 0)
            {
                return;
            }

            if (trace != null)
            {
                DumpLoops(loops);
            }

            SortLoops(loops);

            FindLoopInvariantInstructions(loops);

            if (CodeMotionCount.Count != 0)
            {
                Methods++;
            }
        }
示例#11
0
        /// <summary>
        /// Renames the variables.
        /// </summary>
        /// <param name="block">The block.</param>
        /// <param name="dominanceAnalysis">The dominance analysis.</param>
        private void RenameVariables2(BasicBlock block, SimpleFastDominance dominanceAnalysis)
        {
            trace?.Log($"Processing: {block}");

            UpdateOperands(block);
            UpdatePHIs(block);

            // Repeat for all children of the dominance block, if any
            var children = dominanceAnalysis.GetChildren(block);

            if (children != null && children.Count != 0)
            {
                foreach (var s in children)
                {
                    RenameVariables2(s, dominanceAnalysis);
                }
            }

            UpdateResultOperands(block);
        }
示例#12
0
        public static void DominanceCalculation2()
        {
            var basicBlocks = BlockTests.Scenario4;

            SimpleFastDominance dominance = new SimpleFastDominance(basicBlocks, basicBlocks[0]);

            IDominanceAnalysis provider = dominance as IDominanceAnalysis;

            Assert.Same(provider.GetImmediateDominator(basicBlocks[0]), null);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[1]), basicBlocks[0]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[2]), basicBlocks[1]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[3]), basicBlocks[0]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[4]), basicBlocks[0]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[5]), basicBlocks[4]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[6]), basicBlocks[4]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[7]), basicBlocks[4]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[8]), basicBlocks[0]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[9]), basicBlocks[8]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[10]), basicBlocks[8]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[11]), basicBlocks[0]);
            Assert.Same(provider.GetImmediateDominator(basicBlocks[12]), basicBlocks[0]);

            Assert.Equal(provider.GetDominators(basicBlocks[0]), new[] { basicBlocks[0] });
            //Assert.Equal(provider.GetDominators(basicBlocks[1]), new[] { basicBlocks[0], basicBlocks[1] });
            //Assert.Equal(provider.GetDominators(basicBlocks[2]), new[] { basicBlocks[0], basicBlocks[1], basicBlocks[2] });
            //Assert.Equal(provider.GetDominators(basicBlocks[3]), new[] { basicBlocks[0], basicBlocks[3] });
            //Assert.Equal(provider.GetDominators(basicBlocks[4]), new[] { basicBlocks[0], basicBlocks[4] });
            //Assert.Equal(provider.GetDominators(basicBlocks[5]), new[] { basicBlocks[0], basicBlocks[4], basicBlocks[5] });
            //Assert.Equal(provider.GetDominators(basicBlocks[6]), new[] { basicBlocks[0], basicBlocks[4], basicBlocks[6] });
            //Assert.Equal(provider.GetDominators(basicBlocks[7]), new[] { basicBlocks[0], basicBlocks[4], basicBlocks[7] });
            //Assert.Equal(provider.GetDominators(basicBlocks[8]), new[] { basicBlocks[0], basicBlocks[8] });
            //Assert.Equal(provider.GetDominators(basicBlocks[9]), new[] { basicBlocks[0], basicBlocks[8], basicBlocks[9] });
            //Assert.Equal(provider.GetDominators(basicBlocks[10]), new[] { basicBlocks[0], basicBlocks[8], basicBlocks[10] });
            //Assert.Equal(provider.GetDominators(basicBlocks[11]), new[] { basicBlocks[0], basicBlocks[11] });
            //Assert.Equal(provider.GetDominators(basicBlocks[12]), new[] { basicBlocks[0], basicBlocks[12] });

            //Assert.Equal(provider.GetDominanceFrontier(basicBlocks[4]), new[] { basicBlocks[3], basicBlocks[4], basicBlocks[11], basicBlocks[12] });

            Dump(basicBlocks, dominance);
        }
        protected override void Run()
        {
            if (HasProtectedRegions)
            {
                return;
            }

            // Method is empty - must be a plugged method
            if (BasicBlocks.HeadBlocks.Count != 1)
            {
                return;
            }

            if (BasicBlocks.PrologueBlock == null)
            {
                return;
            }

            trace = CreateTraceLog(5);

            AnalysisDominance = new SimpleFastDominance(BasicBlocks, BasicBlocks.PrologueBlock);
        }
        private void OutputList()
        {
            var trace = CreateTraceLog("List");
            var sb    = new StringBuilder();

            foreach (var headBlock in BasicBlocks.HeadBlocks)
            {
                trace.Log("Head: " + headBlock);
                var dominance = new SimpleFastDominance(BasicBlocks, headBlock);

                for (int i = 0; i < BasicBlocks.Count; i++)
                {
                    var block = BasicBlocks[i];

                    sb.Clear();
                    sb.Append("  Block ");
                    sb.Append(block);
                    sb.Append(" : ");

                    var children = dominance.GetChildren(block);

                    if (children != null && children.Count != 0)
                    {
                        foreach (var child in children)
                        {
                            sb.Append(child);
                            sb.Append(", ");
                        }

                        sb.Length -= 2;
                    }

                    trace.Log(sb.ToString());
                }

                trace.Log();
            }
        }
 protected override void Finish()
 {
     ParamStoreSet     = null;
     AnalysisDominance = null;
 }
示例#16
0
 protected override void Finish()
 {
     AnalysisDominance = null;
 }