Exemplo n.º 1
0
        public static void Compile(BlockNode prog, Options opt)
        {
            var threeAddressGenerationVisitor = new ThreeAddressGenerationVisitor();

            prog.Visit(threeAddressGenerationVisitor);


            var code   = threeAddressGenerationVisitor.Data;
            var codeSz = code.Count;

            var codeBlocks = BaseBlockHelper.GenBaseBlocks(threeAddressGenerationVisitor.Data);

            foreach (var block in codeBlocks)
            {
                Console.Write(block);
            }


            codeBlocks = BaseBlockHelper.GenBaseBlocks(code);
            Optimize(codeBlocks);

            var JoindCode = BaseBlockHelper.JoinBaseBlocks(codeBlocks);

            CodeIO CP = new CodeIO(opt.OutputFile, opt.OutBinary);

            CP.Write(JoindCode);

            foreach (var block in codeBlocks)
            {
                Console.Write(block);
            }
        }
Exemplo n.º 2
0
        public override bool Optimize(List <BaseBlock> codeBlocks)
        {
            //var CFG = new ControlFlowGraph(codeBlocks);

            //неиспользую
            //var active = CFG.GenerateInputOutputActiveDefs(codeBlocks).Item1;
            //var active1 = CFG.GenerateInputOutputActiveDefs(codeBlocks).Item2;

            HashSet <String> bInit    = new HashSet <String>();
            HashSet <String> bNotInit = new HashSet <string>();

            foreach (var l in BaseBlockHelper.JoinBaseBlocks(codeBlocks))
            {
                if ((l.LeftOp != null) && (l.LeftOp.Contains("v")) && (!bInit.Contains(l.LeftOp)))
                {
                    bNotInit.Add(l.LeftOp);
                }
                if ((l.RightOp != null) && (l.RightOp.Contains("v")) && (!bInit.Contains(l.RightOp)))
                {
                    bNotInit.Add(l.RightOp);
                }
                if (ThreeAddrOpType.IsDefinition(l.OpType))
                {
                    bInit.Add(l.Accum);
                }
            }

            if (bNotInit.Count() > 0)
            {
                throw new NotInitVariableException(bNotInit.ToList(), "Ошибка");
            }
            return(false);
        }
Exemplo n.º 3
0
        public override bool Optimize(List <BaseBlock> codeBlocks)
        {
            var CFG = new ControlFlowGraph(codeBlocks);

            var(InExprs, OutExpr) = CFG.GenerateInputOutputAvaliableExpr();


            var startToId = new Dictionary <int, int>();

            for (int i = 0; i < codeBlocks.Count; ++i)
            {
                startToId[codeBlocks[i].StartLabel] = i;
            }

            for (int i = 0; i < codeBlocks.Count; ++i)
            {
                if (TryOptimize(codeBlocks[i], InExprs[i], CFG.PrevBlocks(codeBlocks[i])))
                {
                    var code = BaseBlockHelper.JoinBaseBlocks(codeBlocks);
                    BaseBlockHelper.FixLabelsNumeration(code);
                    codeBlocks.Clear();
                    codeBlocks.InsertRange(0, BaseBlockHelper.GenBaseBlocks(code));

                    return(true);
                }
            }
            return(false);
        }
Exemplo n.º 4
0
        public static void Compile(BlockNode prog, Options opt)
        {
            var threeAddressGenerationVisitor = new ThreeAddressGenerationVisitor();

            prog.Visit(threeAddressGenerationVisitor);


            var code   = threeAddressGenerationVisitor.Data;
            var codeSz = code.Count;

            var codeBlocks = BaseBlockHelper.GenBaseBlocks(threeAddressGenerationVisitor.Data);

            foreach (var block in codeBlocks)
            {
                Console.Write(block);
            }


            codeBlocks = BaseBlockHelper.GenBaseBlocks(code);
            Optimize(codeBlocks);

            var JoindCode = BaseBlockHelper.JoinBaseBlocks(codeBlocks);

            CodeIO CP = new CodeIO(opt.OutputFile, opt.OutBinary);

            CP.Write(JoindCode);

            // Блоки с нумерацией
            Console.WriteLine();
            Console.WriteLine();


            // SSA


            var CFG = new ControlFlowGraph(codeBlocks);

            Console.WriteLine("Original");
            Console.Write(CFG);
            Console.Write(CFG.FindDommBlocks());



            var FOD = new FrontOnDominance(CFG); // Модифицирует CFG

            Console.Write(FOD);
            Console.Write(FOD.globalsToString());


            Console.WriteLine("Phi");
            Console.Write(CFG);
            Console.ReadLine();
        }
Exemplo n.º 5
0
        public (List <ValueSet>, List <ValueSet>) GenerateInputOutputValues()
        {
            var In  = new List <ValueSet>();
            var Out = new List <ValueSet>();

            var startToId = GetStartToId(_bblocks);

            var code = BaseBlockHelper.JoinBaseBlocks(_bblocks);

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


            bool change = true;

            while (change)
            {
                change = false;

                for (int i = 0; i < _bblocks.Count; ++i)
                {
                    var st = _bblocks[i].StartLabel;

                    if (Prev[st].Count() != 0)
                    {
                        In[i] = ReachingValues.Combine(Prev[st].Select(l => Out[startToId[l]]));
                    }

                    var nOut = ReachingValues.TransferByBBlock(In[i], _bblocks[i]);

                    foreach (var vk in nOut)
                    {
                        if (vk.Value != Out[i][vk.Key])
                        {
                            change = true;
                            break;
                        }
                    }

                    Out[i] = nOut;
                }
            }

            return(In, Out);
        }
        public override bool Optimize(List <BaseBlock> codeBlocks)
        {
            var code = BaseBlockHelper.JoinBaseBlocks(codeBlocks);

            int startsz = code.Count;

            BaseBlockHelper.FixLabelsNumeration(code);

            var ncodeBlocks = BaseBlockHelper.GenBaseBlocks(code);
            var CFG         = new ControlFlowGraph(ncodeBlocks);

            ncodeBlocks = CFG.GetAliveBlocks();

            code = BaseBlockHelper.JoinBaseBlocks(ncodeBlocks);
            BaseBlockHelper.FixLabelsNumeration(code);
            codeBlocks.Clear();
            codeBlocks.InsertRange(0, BaseBlockHelper.GenBaseBlocks(code));
            return(startsz != code.Count);
        }
Exemplo n.º 7
0
 public List <ThreeAddrLine> getJoinCode()
 {
     return(BaseBlockHelper.JoinBaseBlocks(_bblocks));
 }