예제 #1
0
        static IterativeAlgorithmOutput <ISet <V> > ApplyDescendingPart <V>(List <Region> regions,
                                                                            TransferFunctionStorage <ISet <V> > functions, SetIterativeAlgorithmParameters <V> param, Graph graph)
        {
            Dictionary <int, ISet <V> >          regionsInputs = new Dictionary <int, ISet <V> >();
            IterativeAlgorithmOutput <ISet <V> > result        = new IterativeAlgorithmOutput <ISet <V> >();

            regionsInputs[regions.Count - 1] = param.FirstValue;

            Dictionary <Region, Region> parents = new Dictionary <Region, Region>();

            for (int i = regions.Count - 1; i >= 0; --i)
            {
                BodyRegion body = regions[i] as BodyRegion;
                if (body != null)
                {
                    foreach (Region r in body.Regions)
                    {
                        parents[r] = body;
                    }
                }

                LoopRegion loop = regions[i] as LoopRegion;
                if (loop != null)
                {
                    parents[loop.Body] = loop;
                }
                if (parents.ContainsKey(regions[i]))
                {
                    Region parent = parents[regions[i]];
                    regionsInputs[i] = functions[parent, RegionDirection.In, regions[i]](regionsInputs[regions.IndexOf(parent)]);
                }
            }

            int numOfBlocks = graph.Count();

            for (int i = 0; i < numOfBlocks; ++i)
            {
                var curBlock   = regions[i].Header;
                int curBlockId = curBlock.BlockId;

                result.In[curBlockId]  = regionsInputs[i];
                result.Out[curBlockId] = param.TransferFunction(regionsInputs[i], curBlock);
            }

            return(result);
        }
예제 #2
0
        static TransferFunctionStorage <ISet <V> > ApplyAscendingPart <V>(Graph graph, List <Region> regions, SetIterativeAlgorithmParameters <V> param)
        {
            TransferFunctionStorage <ISet <V> > result = new TransferFunctionStorage <ISet <V> >();

            foreach (Region r in regions)
            {
                LeafRegion leaf = r as LeafRegion;
                TransferFunctionStorage <ISet <V> > clone = result.Clone();
                if (leaf != null)
                {
                    //////
                    for (int i = graph.Count(); i < regions.Count; ++i)
                    {
                        result[regions[i], RegionDirection.Out, leaf] = input => param.TransferFunction(input, leaf.Block);
                    }
                    /////
                    result[leaf, RegionDirection.In, leaf]  = Identity;
                    result[leaf, RegionDirection.Out, leaf] = input => param.TransferFunction(input, leaf.Block);
                }
                BodyRegion body = r as BodyRegion;
                if (body != null)
                {
                    foreach (Region s in body.Regions)
                    {
                        LeafRegion header = s as LeafRegion;
                        if (header != null)
                        {
                            result[body, RegionDirection.In, s] = Identity;
                        }
                        else
                        {
                            result[body, RegionDirection.In, s] = input => GatherFunctionsResults(input, clone, body, s.Header.InputBlocks, graph, param);
                        }
                        CalculateForOutputBlocks(result, body, s, s.OutputBlocks, graph);
                    }
                }
                LoopRegion loop = r as LoopRegion;
                if (loop != null)
                {
                    result[loop, RegionDirection.In, loop.Body] = input => SetFactory.GetSet <V>(input.Union(GatherFunctionsResults(input, clone, loop.Body, loop.Header.InputBlocks, graph, param)));
                    CalculateForOutputBlocks(result, loop, loop.Body, loop.OutputBlocks, graph);
                }
            }
            return(result);
        }
        public List <Region> CreateSequence(Graph g)
        {
            if (!CheckRetreatingIsReverse.CheckRetreatingIsReverse.CheckReverseEdges(g))
            {
                Console.WriteLine("there are some retreating edges which aren't reverse");
                Environment.Exit(0);
            }
            var basicBlockLastRegion = new Dictionary <BasicBlock, Region>();

            foreach (var v in g.GetVertices())
            {
                var newReg = new LeafRegion(v);
                regionList.Add(newReg);
                basicBlockLastRegion[v] = newReg;
            }

            var loops = SearchNaturalLoops.FindAllNaturalLoops(g);

            var regionMade = new Dictionary <Edge <BasicBlock>, bool>();

            foreach (var loop in loops)
            {
                regionMade[loop.Key] = false;
            }

            while (regionMade.ContainsValue(false))
            {
                foreach (var loop in loops)
                {
                    bool anyInsideLoops = false;
                    foreach (var loopOther in loops)
                    {
                        anyInsideLoops = anyInsideLoops || checkLoopInclusion(loop, loopOther, regionMade[loopOther.Key]);
                    }
                    if (!anyInsideLoops)
                    {
                        continue;
                    }

                    regionMade[loop.Key] = true;

                    var header = loop.Key.Target;

                    var curRegions   = new List <Region>();
                    var outputBlocks = new List <int>();
                    foreach (var blockId in loop.Value)
                    {
                        var block = g.getBlockById(blockId);
                        if (!curRegions.Contains(basicBlockLastRegion[block]))
                        {
                            curRegions.Add(basicBlockLastRegion[block]);
                        }

                        foreach (var outputBlock in block.OutputBlocks)
                        {
                            if (!loop.Value.Contains(outputBlock))
                            {
                                outputBlocks.Add(block.BlockId);
                                break;
                            }
                        }
                    }

                    var bodyReg = new BodyRegion(header, outputBlocks, curRegions);
                    regionList.Add(bodyReg);

                    var loopReg = new LoopRegion(bodyReg);
                    regionList.Add(loopReg);

                    foreach (var blockId in loop.Value)
                    {
                        var block = g.getBlockById(blockId);
                        basicBlockLastRegion[block] = loopReg;
                    }
                }
            }


            // check if program has become one region
            foreach (var block in basicBlockLastRegion)
            {
                // if there are leaves not included in loops
                if (block.Value.GetType() == typeof(LeafRegion))
                {
                    var header       = g.getRoot();
                    var outputBlocks = new List <int>();
                    var curRegions   = new List <Region>();
                    foreach (var curblock in basicBlockLastRegion)
                    {
                        if (!curRegions.Contains(curblock.Value))
                        {
                            curRegions.Add(curblock.Value);
                        }
                    }
                    var newReg = new BodyRegion(header, outputBlocks, curRegions);
                    regionList.Add(newReg);
                    break;
                }
            }

            foreach (var reg in regionList)
            {
                if (reg.GetType() == typeof(LoopRegion))
                {
                    (reg as LoopRegion).Body.RegionParent = reg;
                }
                if (reg.GetType() == typeof(BodyRegion))
                {
                    foreach (var children in (reg as BodyRegion).Regions)
                    {
                        children.RegionParent = reg;
                    }
                }
            }

            return(regionList);
        }