Example #1
0
 public void Optimize(IR.MethodEntry method, OptimizationLevel level)
 {
     foreach (var op in method.FlatInstructionList)
     {
         op.IsIndexChecked = true;
     }
 }
Example #2
0
        public List <int> AllocateRegisters(Stack <int> registers, IR.MethodEntry method)
        {
            List <int>            used       = new List <int>();
            Dictionary <int, int> usageCount = new Dictionary <int, int>();

            foreach (IR.InstructionElement i in method.Childnodes)
            {
                AllocateRegistersRecursive(i, registers, method, used, usageCount);
            }

            return(used);
        }
Example #3
0
        public void AllocateRegistersRecursive(IR.InstructionElement current, Stack <int> registers, IR.MethodEntry method, List <int> used, Dictionary <int, int> usageCount)
        {
            //Does this instruction have an output?
            if (current.Register != null)
            {
                //Have we already assigned a register?
                if (current.Register.RegisterNumber < 0 && registers.Count > 0)
                {
                    int regno = registers.Pop();
                    used.Add(regno);

                    usageCount.Add(regno, 0);

                    current.Register.RegisterNumber = regno;
                }

                if (current.Register.RegisterNumber > 0 && usageCount.ContainsKey(current.Register.RegisterNumber))
                {
                    usageCount[current.Register.RegisterNumber]++;
                }

                //Assign the target register to the child node
                if (current.Register.RegisterNumber > 0 && current.Childnodes.Length != 0 && current.Childnodes[0].Register != null)
                {
                    current.Childnodes[0].Register = current.Register;
                }
            }

            foreach (IR.InstructionElement i in current.Childnodes)
            {
                AllocateRegistersRecursive(i, registers, method, used, usageCount);
            }

            foreach (IR.InstructionElement i in current.Childnodes)
            {
                if (i.Register != null && usageCount.ContainsKey(i.Register.RegisterNumber))
                {
                    usageCount[i.Register.RegisterNumber]--;
                    if (usageCount[i.Register.RegisterNumber] == 0)
                    {
                        usageCount.Remove(i.Register.RegisterNumber);
                        registers.Push(i.Register.RegisterNumber);
                    }
                }
            }

            /*if (current.Register != null && current.Register.RegisterNumber > 0 && usageCount.ContainsKey(current.Register.RegisterNumber))
             * {
             *  usageCount[current.Register.RegisterNumber]--;
             *  if (usageCount[current.Register.RegisterNumber] == 0)
             *  {
             *      usageCount.Remove(current.Register.RegisterNumber);
             *      registers.Push(current.Register.RegisterNumber);
             *  }
             * }*/
        }
Example #4
0
 public void Optimize(IR.MethodEntry method, OptimizationLevel level)
 {
     throw new InvalidOperationException("The register allocator must be invoked via the IRegisterAllocator interface instead of the IOptimizer interface");
 }