public SparseConditionalConstantPropagation(BasicBlocks basicBlocks, ITraceFactory traceFactory)
        {
            this.TraceFactory = traceFactory;
            this.BasicBlocks = basicBlocks;

            MainTrace = CreateTrace("SparseConditionalConstantPropagation");

            // 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;
        }
        public void NewTraceLog(TraceLog traceLog)
        {
            if (TraceListener == null)
                return;

            TraceListener.OnNewTraceLog(traceLog);
        }
        protected override void Run()
        {
            if (IsPlugged)
                return;

            trace = CreateTraceLog();

            CollectStackObjects();

            stackLocalRangeData = new RangeData[stack.Count];
            registerRangeData = new RangeData[Architecture.RegisterSet.Length];

            for (int i = 0; i < registerRangeData.Length; i++)
            {
                var range = new RangeData();
                range.Register = Architecture.RegisterSet[i];
                registerRangeData[i] = range;
            }

            foreach (var local in stack)
            {
                var range = new RangeData();
                range.StackLocal = local.Key;
                stackLocalRangeData[local.Value] = range;
            }

            CollectObjectAssignmentsAndUses();
        }
        public static void Run(CompilerTrace compilerTrace, string stage, MosaMethod method, BasicBlocks basicBlocks)
        {
            if (compilerTrace == null)
                return;

            if (!compilerTrace.TraceFilter.IsMatch(method, stage))
                return;

            var traceLog = new TraceLog(TraceType.InstructionList, method, stage, true);

            traceLog.Log(String.Format("IR representation of method {0} after stage {1}:", method.FullName, stage));
            traceLog.Log();

            if (basicBlocks.Count > 0)
            {
                foreach (var block in basicBlocks)
                {
                    traceLog.Log(String.Format("Block #{0} - Label L_{1:X4}", block.Sequence, block.Label)
                        + (basicBlocks.IsHeadBlock(block) ? " [Header]" : string.Empty));

                    traceLog.Log("  Prev: " + ListBlocks(block.PreviousBlocks));

                    LogInstructions(traceLog, block.First);

                    traceLog.Log("  Next: " + ListBlocks(block.NextBlocks));

                    traceLog.Log();
                }
            }
            else
            {
                traceLog.Log("No instructions.");
            }

            compilerTrace.NewTraceLog(traceLog);
        }
        protected override void Run()
        {
            if (!HasCode)
                return;

            trace = CreateTraceLog();

            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);
            }
        }
 protected override void Setup()
 {
     trace = CreateTraceLog();
 }
        private void SubmitTraceLog(TraceLog traceLog)
        {
            if (!traceLog.Active)
                return;

            MethodCompiler.Trace.NewTraceLog(traceLog);
        }
        protected TraceLog CreateTraceLog()
        {
            bool active = IsTraceable();

            var traceLog = new TraceLog(TraceType.DebugTrace, MethodCompiler.Method, GetFormattedStageName(), active);

            if (active)
                traceLogs.Add(traceLog);

            return traceLog;
        }
        /// <summary>
        /// Compiles the method referenced by this method compiler.
        /// </summary>
        public void Compile()
        {
            BeginCompile();

            foreach (IMethodCompilerStage stage in Pipeline)
            {
                //try
                {
                    stage.Initialize(this);
                    stage.Execute();

                    Mosa.Compiler.Trace.InstructionLogger.Run(this, stage);

                    if (stop)
                        break;
                }

                //catch (Exception e)
                //{
                //	//	Trace.TraceListener.SubmitDebugStageInformation(Method, stage.Name + "-Exception", e.ToString());
                //	Trace.TraceListener.OnNewCompilerTraceEvent(CompilerEvent.Exception, Method.FullName + " @ " + stage.Name, ThreadID);
                //	return;
                //}
            }

            InitializeType();

            var log = new TraceLog(TraceType.Counters, this.Method, string.Empty, Trace.TraceFilter.Active);
            log.Log(MethodData.Counters.Export());
            Trace.TraceListener.OnNewTraceLog(log);

            EndCompile();
        }
        protected override void Run()
        {
            // Method is empty - must be a plugged method
            if (!HasCode)
                return;

            trace = CreateTraceLog();

            debugRestrictOptimizationByCount = MethodCompiler.Compiler.CompilerOptions.DebugRestrictOptimizationByCount;

            transformations = CreateTransformationList();

            Optimize();

            UpdateCounter("IROptimizations.IRInstructionRemoved", instructionsRemovedCount);
            UpdateCounter("IROptimizations.ConstantFoldingIntegerOperations", constantFoldingIntegerOperationsCount);
            UpdateCounter("IROptimizations.ConstantFoldingIntegerCompare", constantFoldingIntegerCompareCount);
            UpdateCounter("IROptimizations.ConstantFoldingAdditionAndSubstraction", constantFoldingAdditionAndSubstractionCount);
            UpdateCounter("IROptimizations.ConstantFoldingMultiplication", constantFoldingMultiplicationCount);
            UpdateCounter("IROptimizations.ConstantFoldingDivision", constantFoldingDivisionCount);
            UpdateCounter("IROptimizations.ConstantFoldingLogicalOr", constantFoldingLogicalOrCount);
            UpdateCounter("IROptimizations.ConstantFoldingLogicalAnd", constantFoldingLogicalAndCount);
            UpdateCounter("IROptimizations.ConstantFoldingPhi", constantFoldingPhiCount);
            UpdateCounter("IROptimizations.ConstantMoveToRight", constantMoveToRightCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationSubtraction", arithmeticSimplificationSubtractionCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationMultiplication", arithmeticSimplificationMultiplicationCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationDivision", arithmeticSimplificationDivisionCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationAdditionAndSubstraction", arithmeticSimplificationAdditionAndSubstractionCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationLogicalOperators", arithmeticSimplificationLogicalOperatorsCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationShiftOperators", arithmeticSimplificationShiftOperators);
            UpdateCounter("IROptimizations.SimpleConstantPropagation", simpleConstantPropagationCount);
            UpdateCounter("IROptimizations.SimpleForwardCopyPropagation", simpleForwardCopyPropagationCount);
            UpdateCounter("IROptimizations.FoldIntegerCompareBranch", foldIntegerCompareBranchCount);
            UpdateCounter("IROptimizations.FoldIntegerCompare", foldIntegerCompareCount);
            UpdateCounter("IROptimizations.FoldLoadStoreOffsets", foldLoadStoreOffsetsCount);
            UpdateCounter("IROptimizations.DeadCodeElimination", deadCodeEliminationCount);
            UpdateCounter("IROptimizations.DeadCodeEliminationPhi", deadCodeEliminationPhi);
            UpdateCounter("IROptimizations.ReduceTruncationAndExpansion", reduceTruncationAndExpansionCount);
            UpdateCounter("IROptimizations.CombineIntegerCompareBranch", combineIntegerCompareBranchCount);
            UpdateCounter("IROptimizations.ReduceZeroExtendedMove", reduceZeroExtendedMoveCount);
            UpdateCounter("IROptimizations.SimplifyExtendedMove", simplifyExtendedMoveCount);
            UpdateCounter("IROptimizations.SimplifyExtendedMoveWithConstant", simplifyExtendedMoveWithConstantCount);
            UpdateCounter("IROptimizations.SimplifyPhi", simplifyPhiCount);
            UpdateCounter("IROptimizations.BlockRemoved", blockRemovedCount);
            UpdateCounter("IROptimizations.PromoteLocalVariable", promoteLocalVariableCount);
            UpdateCounter("IROptimizations.Reduce64BitOperationsTo32Bit", reduce64BitOperationsTo32BitCount);
            UpdateCounter("IROptimizations.RemoveUselessIntegerCompareBranch", removeUselessIntegerCompareBranch);

            worklist = null;
        }
        /// <summary>
        /// Logs the instructions in the given enumerable to the trace.
        /// </summary>
        /// <param name="traceLog">The trace log.</param>
        /// <param name="node">The context.</param>
        private static void LogInstructions(TraceLog traceLog, InstructionNode node)
        {
            for (; !node.IsBlockEndInstruction; node = node.Next)
            {
                if (node.IsEmpty)
                    continue;

                traceLog.Log(node.ToString());

                if (node.IsBlockEndInstruction)
                    return;
            }
        }
        protected override void Run()
        {
            // Method is empty - must be a plugged method
            if (!HasCode)
                return;

            if (HasProtectedRegions)
                return;

            //if (MethodCompiler.Method.FullName.Contains(" Mosa.Platform.Internal.x86.Runtime::GetProtectedRegionEntryByAddress"))
            //	return;

            trace = CreateTraceLog();

            if (MethodCompiler.Compiler.CompilerOptions.EnableVariablePromotion)
                PromoteLocalVariable();

            // initialize worklist
            foreach (var block in BasicBlocks)
            {
                for (var node = block.First; !node.IsBlockEndInstruction; node = node.Next)
                {
                    if (node.IsEmpty)
                        continue;

                    if (node.ResultCount == 0 && node.OperandCount == 0)
                        continue;

                    Do(node);

                    ProcessWorkList();

                    // Collect virtual registers
                    if (node.IsEmpty)
                        continue;

                    // add virtual registers
                    foreach (var op in node.Results)
                    {
                        if (op.IsVirtualRegister)
                            virtualRegisters.AddIfNew(op);
                    }

                    foreach (var op in node.Operands)
                    {
                        if (op.IsVirtualRegister)
                            virtualRegisters.AddIfNew(op);
                    }
                }
            }

            bool change = true;
            while (change)
            {
                change = false;

                if (MethodCompiler.Compiler.CompilerOptions.EnableVariablePromotion)
                    if (PromoteLocalVariable())
                        change = true;

                //if (Reduce64BitOperationsTo32Bit())
                //	change = true;

                if (change)
                {
                    ProcessWorkList();
                }
            }

            UpdateCounter("IROptimizations.IRInstructionRemoved", instructionsRemovedCount);
            UpdateCounter("IROptimizations.ConstantFoldingIntegerOperations", constantFoldingIntegerOperationsCount);
            UpdateCounter("IROptimizations.ConstantMoveToRight", constantMoveToRightCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationSubtraction", arithmeticSimplificationSubtractionCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationMultiplication", arithmeticSimplificationMultiplicationCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationDivision", arithmeticSimplificationDivisionCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationAdditionAndSubstraction", arithmeticSimplificationAdditionAndSubstractionCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationLogicalOperators", arithmeticSimplificationLogicalOperatorsCount);
            UpdateCounter("IROptimizations.ArithmeticSimplificationShiftOperators", arithmeticSimplificationShiftOperators);
            UpdateCounter("IROptimizations.SimpleConstantPropagation", simpleConstantPropagationCount);
            UpdateCounter("IROptimizations.SimpleForwardCopyPropagation", simpleForwardCopyPropagationCount);
            UpdateCounter("IROptimizations.ConstantFoldingIntegerCompare", constantFoldingIntegerCompareCount);
            UpdateCounter("IROptimizations.ConstantFoldingAdditionAndSubstraction", constantFoldingAdditionAndSubstractionCount);
            UpdateCounter("IROptimizations.ConstantFoldingMultiplication", constantFoldingMultiplicationCount);
            UpdateCounter("IROptimizations.ConstantFoldingDivision", constantFoldingDivisionCount);
            UpdateCounter("IROptimizations.ConstantFoldingLogicalOr", constantFoldingLogicalOrCount);
            UpdateCounter("IROptimizations.ConstantFoldingLogicalAnd", constantFoldingLogicalAndCount);
            UpdateCounter("IROptimizations.StrengthReductionIntegerCompareBranch", strengthReductionIntegerCompareBranchCount);
            UpdateCounter("IROptimizations.DeadCodeElimination", deadCodeEliminationCount);
            UpdateCounter("IROptimizations.ReduceTruncationAndExpansion", reduceTruncationAndExpansionCount);
            UpdateCounter("IROptimizations.FoldIntegerCompareBranch", foldIntegerCompareBranchCount);
            UpdateCounter("IROptimizations.FoldIntegerCompare", foldIntegerCompareCount);
            UpdateCounter("IROptimizations.FoldLoadStoreOffsets", foldLoadStoreOffsetsCount);
            UpdateCounter("IROptimizations.FoldConstantPhi", foldConstantPhiCount);
            UpdateCounter("IROptimizations.ReduceZeroExtendedMove", reduceZeroExtendedMoveCount);
            UpdateCounter("IROptimizations.SimplifyExtendedMove", simplifyExtendedMoveCount);
            UpdateCounter("IROptimizations.SimplifyExtendedMoveWithConstant", simplifyExtendedMoveWithConstantCount);
            UpdateCounter("IROptimizations.SimplifyPhi", simplifyPhiCount);
            UpdateCounter("IROptimizations.BlockRemoved", blockRemovedCount);
            UpdateCounter("IROptimizations.RemoveUselessPhi", removeUselessPhiCount);
            UpdateCounter("IROptimizations.PromoteLocalVariable", promoteLocalVariableCount);
            UpdateCounter("IROptimizations.Reduce64BitOperationsTo32Bit", reduce64BitOperationsTo32BitCount);

            worklist = null;
        }
Exemple #13
0
 void ITraceListener.OnNewTraceLog(TraceLog traceLog)
 {
 }
        /// <summary>
        /// Compiles the method referenced by this method compiler.
        /// </summary>
        public void Compile()
        {
            BeginCompile();

            foreach (IMethodCompilerStage stage in Pipeline)
            {
                {
                    stage.Initialize(this);
                    stage.Execute();

                    InstructionLogger.Run(this, stage);

                    if (stop)
                        break;
                }
            }

            InitializeType();

            var log = new TraceLog(TraceType.Counters, this.Method, string.Empty, Trace.TraceFilter.Active);
            log.Log(MethodData.Counters.Export());
            Trace.TraceListener.OnNewTraceLog(log);

            EndCompile();
        }