public SparseConditionalConstantPropagation(BasicBlocks basicBlocks, InstructionSet instructionSet, SectionTrace trace)
        {
            this.Trace = trace;
            this.BasicBlocks = basicBlocks;
            this.InstructionSet = instructionSet;

            MainTrace = CreateTrace("ConditionalConstantPropagation");

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

            blockStates = new bool[BasicBlocks.Count];

            for (int i = 0; i < BasicBlocks.Count; i++)
            {
                blockStates[i] = false;
            }

            // Initialize
            foreach (var block in BasicBlocks.HeadBlocks)
            {
                AddExecutionBlock(block);
            }

            while (blockWorklist.Count > 0 || instructionWorkList.Count > 0)
            {
                ProcessBlocks();
                ProcessInstructions();
            }

            DumpTrace();

            // Release
            phiStatements = null;
        }
 private SectionTrace CreateTrace(string name)
 {
     var sectionTrace = new SectionTrace(Trace, name);
     return sectionTrace;
 }
 public BasicRegisterAllocator(BasicBlocks basicBlocks, VirtualRegisters compilerVirtualRegisters, InstructionSet instructionSet, StackLayout stackLayout, BaseArchitecture architecture, SectionTrace trace)
     : base(basicBlocks, compilerVirtualRegisters, instructionSet, stackLayout, architecture, trace)
 {
 }
        protected override void Run()
        {
            if (!HasCode)
                return;

            trace = CreateTrace();

            foreach (var local in MethodCompiler.LocalVariables)
            {
                if (local.IsVirtualRegister)
                    continue;

                if (local.Definitions.Count != 1)
                    continue;

                if (!local.IsReferenceType && !local.IsInteger && !local.IsR && !local.IsChar && !local.IsBoolean && !local.IsPointer)
                    continue;

                if (ContainsAddressOf(local))
                    continue;

                Promote(local);
            }
        }
        private void TraceMoveHints()
        {
            if (!Trace.Active)
                return;

            var moveHintTrace = new SectionTrace(Trace, "MoveHints");

            foreach (var moveHint in moveHints)
            {
                moveHintTrace.Log(moveHint.Value.ToString());
            }
        }