예제 #1
0
        /// <summary>
        /// Collect the usage range of each temp register used in the given method body.
        /// </summary>
        private static Dictionary <Register, RegisterRange> CollectTempRegisterUsageRanges(IEnumerable <BasicBlock> blocks)
        {
            var ranges = new Dictionary <Register, RegisterRange>();

            foreach (var block in blocks)
            {
                foreach (var inst in block.Instructions)
                {
                    foreach (var reg in inst.Registers)
                    {
                        if (reg.Category == RCategory.Temp)
                        {
                            RegisterRange range;
                            if (ranges.TryGetValue(reg, out range))
                            {
                                // Extend range
                                range.Range = new InstructionRange(range.Range.First, inst);
                                range.InstructionCount++;
                            }
                            else
                            {
                                // Create range
                                range = new RegisterRange(reg, new InstructionRange(inst, inst))
                                {
                                    InstructionCount = 1
                                };
                                ranges.Add(reg, range);
                            }
                            range.AddBlock(block);
                        }
                    }
                }
            }
            return(ranges);
        }
예제 #2
0
        /// <summary>
        /// Collect the usage range of each temp register used in the given method body.
        /// </summary>
        private static Dictionary<Register, RegisterRange> CollectTempRegisterUsageRanges(IEnumerable<BasicBlock> blocks)
        {
            var ranges = new Dictionary<Register, RegisterRange>();

            foreach (var block in blocks)
            {
                foreach (var inst in block.Instructions)
                {
                    foreach (var reg in inst.Registers)
                    {
                        if (reg.Category == RCategory.Temp)
                        {
                            RegisterRange range;
                            if (ranges.TryGetValue(reg, out range))
                            {
                                // Extend range
                                range.Range = new InstructionRange(range.Range.First, inst);
                                range.InstructionCount++;
                            }
                            else
                            {
                                // Create range
                                range = new RegisterRange(reg, new InstructionRange(inst, inst)) { InstructionCount = 1 };
                                ranges.Add(reg, range);
                            }
                            range.AddBlock(block);
                        }
                    }
                }
            }
            return ranges;
        }