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; }
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(); }