diff --git a/Source/Mosa.Compiler.Common.xUnit/Mosa.Compiler.Common.xUnit.csproj b/Source/Mosa.Compiler.Common.xUnit/Mosa.Compiler.Common.xUnit.csproj index d01e217745..7921cd4d8c 100644 --- a/Source/Mosa.Compiler.Common.xUnit/Mosa.Compiler.Common.xUnit.csproj +++ b/Source/Mosa.Compiler.Common.xUnit/Mosa.Compiler.Common.xUnit.csproj @@ -5,18 +5,18 @@ - - + + - - - - - - + + + + + + all - + all diff --git a/Source/Mosa.Compiler.Framework.xUnit/Mosa.Compiler.Framework.xUnit.csproj b/Source/Mosa.Compiler.Framework.xUnit/Mosa.Compiler.Framework.xUnit.csproj index d01e217745..7921cd4d8c 100644 --- a/Source/Mosa.Compiler.Framework.xUnit/Mosa.Compiler.Framework.xUnit.csproj +++ b/Source/Mosa.Compiler.Framework.xUnit/Mosa.Compiler.Framework.xUnit.csproj @@ -5,18 +5,18 @@ - - + + - - - - - - + + + + + + all - + all diff --git a/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs index 74e22a152b..71322620d5 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs @@ -74,7 +74,7 @@ private static void PopulateLoopNodes(BasicBlocks basicBlocks, Loop loop) continue; visited.Add(node); - loop.LoopBlocks.Add(node); + loop.AddNode(node); foreach (var previous in node.PreviousBlocks) { diff --git a/Source/Mosa.Compiler.Framework/Loop.cs b/Source/Mosa.Compiler.Framework/Loop.cs index ee940e4afd..4f0bf8cec9 100644 --- a/Source/Mosa.Compiler.Framework/Loop.cs +++ b/Source/Mosa.Compiler.Framework/Loop.cs @@ -9,7 +9,6 @@ public sealed class Loop public BasicBlock Header { get; set; } public readonly List Backedges = new(); public readonly List LoopBlocks = new(); - //private readonly HashSet LoopBlocksSet = new(); public Loop(BasicBlock header, BasicBlock backedge) { @@ -26,11 +25,5 @@ public void AddNode(BasicBlock block) { Debug.Assert(!LoopBlocks.Contains(block)); LoopBlocks.Add(block); - //LoopBlocksSet.Add(block); } - - //public bool Contains(BasicBlock block) - //{ - // return LoopBlocksSet.Contains(block); - //} } diff --git a/Source/Mosa.Tool.Explorer/Stages/DebugInfoStage.cs b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/DebugInfoStage.cs similarity index 97% rename from Source/Mosa.Tool.Explorer/Stages/DebugInfoStage.cs rename to Source/Mosa.Compiler.Framework/Stages/Diagnostic/DebugInfoStage.cs index 971276a98e..b55502c8f4 100644 --- a/Source/Mosa.Tool.Explorer/Stages/DebugInfoStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/DebugInfoStage.cs @@ -1,8 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using Mosa.Compiler.Framework; - -namespace Mosa.Tool.Explorer.Stages; +namespace Mosa.Compiler.Framework.Stages.Diagnostic; public class DebugInfoStage : BaseMethodCompilerStage { diff --git a/Source/Mosa.Tool.Explorer/Stages/DominanceOutputStage.cs b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/DominanceAnalysisStage.cs similarity index 94% rename from Source/Mosa.Tool.Explorer/Stages/DominanceOutputStage.cs rename to Source/Mosa.Compiler.Framework/Stages/Diagnostic/DominanceAnalysisStage.cs index 45ade82e39..40e31d7513 100644 --- a/Source/Mosa.Tool.Explorer/Stages/DominanceOutputStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/DominanceAnalysisStage.cs @@ -1,12 +1,11 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using System.Text; -using Mosa.Compiler.Framework; using Mosa.Compiler.Framework.Analysis; -namespace Mosa.Tool.Explorer.Stages; +namespace Mosa.Compiler.Framework.Stages.Diagnostic; -public class DominanceOutputStage : BaseMethodCompilerStage +public class DominanceAnalysisStage : BaseMethodCompilerStage { private const int TraceLevel = 5; diff --git a/Source/Mosa.Tool.Explorer/Stages/GraphVizStage.cs b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/GraphVizStage.cs similarity index 87% rename from Source/Mosa.Tool.Explorer/Stages/GraphVizStage.cs rename to Source/Mosa.Compiler.Framework/Stages/Diagnostic/GraphVizStage.cs index 7d832d167c..863531b5c8 100644 --- a/Source/Mosa.Tool.Explorer/Stages/GraphVizStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/GraphVizStage.cs @@ -1,8 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using Mosa.Compiler.Framework; - -namespace Mosa.Tool.Explorer.Stages; +namespace Mosa.Compiler.Framework.Stages.Diagnostic; public class GraphVizStage : BaseMethodCompilerStage { diff --git a/Source/Mosa.Compiler.Framework/Stages/Diagnostic/LoopAnalysisStage.cs b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/LoopAnalysisStage.cs new file mode 100644 index 0000000000..db6f5dc986 --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/LoopAnalysisStage.cs @@ -0,0 +1,63 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using Mosa.Compiler.Framework.Analysis; + +namespace Mosa.Compiler.Framework.Stages.Diagnostic; + +/// +/// Loop Analysis Stage +/// +public sealed class LoopAnalysisStage : BaseMethodCompilerStage +{ + private readonly Counter LoopCount = new("LoopAnalysis.LoopCount"); + private readonly Counter LoopSize1 = new("LoopAnalysis.LoopSize-1"); + private readonly Counter LoopSize2 = new("LoopAnalysis.LoopSize-2"); + private readonly Counter LoopSize3 = new("LoopAnalysis.LoopSize-3"); + private readonly Counter LoopSize4 = new("LoopAnalysis.LoopSize-4"); + private readonly Counter LoopSize5Plus = new("LoopAnalysis.LoopSize-5+"); + + protected override void Initialize() + { + Register(LoopCount); + Register(LoopSize1); + Register(LoopSize2); + Register(LoopSize3); + Register(LoopSize4); + Register(LoopSize5Plus); + } + + protected override void Run() + { + if (HasProtectedRegions) + return; + + // Method is empty - must be a plugged method + if (BasicBlocks.HeadBlocks.Count != 1) + return; + + if (BasicBlocks.PrologueBlock == null) + return; + + if (!MethodCompiler.IsInSSAForm) + return; + + var loops = LoopDetector.FindLoops(BasicBlocks); + + LoopCount.Set(loops.Count); + + foreach (var loop in loops) + { + var size = loop.LoopBlocks.Count; + + switch (size) + { + case 1: LoopSize1.Increment(); break; + case 2: LoopSize2.Increment(); break; + case 3: LoopSize3.Increment(); break; + case 4: LoopSize4.Increment(); break; + default: + LoopSize5Plus.Increment(); break; + } + } + } +} diff --git a/Source/Mosa.Compiler.MosaTypeSystem.CLR/Mosa.Compiler.MosaTypeSystem.CLR.csproj b/Source/Mosa.Compiler.MosaTypeSystem.CLR/Mosa.Compiler.MosaTypeSystem.CLR.csproj index 7ecc00d32a..d2c6de2bb1 100644 --- a/Source/Mosa.Compiler.MosaTypeSystem.CLR/Mosa.Compiler.MosaTypeSystem.CLR.csproj +++ b/Source/Mosa.Compiler.MosaTypeSystem.CLR/Mosa.Compiler.MosaTypeSystem.CLR.csproj @@ -5,7 +5,7 @@ - + diff --git a/Source/Mosa.Tool.Bootstrap/Mosa.Tool.Bootstrap.csproj b/Source/Mosa.Tool.Bootstrap/Mosa.Tool.Bootstrap.csproj index cea38dff74..36f56ff657 100644 --- a/Source/Mosa.Tool.Bootstrap/Mosa.Tool.Bootstrap.csproj +++ b/Source/Mosa.Tool.Bootstrap/Mosa.Tool.Bootstrap.csproj @@ -8,9 +8,9 @@ - - - + + + diff --git a/Source/Mosa.Tool.Debugger/Mosa.Tool.Debugger.csproj b/Source/Mosa.Tool.Debugger/Mosa.Tool.Debugger.csproj index a5908aa2e6..ef2712c32c 100644 --- a/Source/Mosa.Tool.Debugger/Mosa.Tool.Debugger.csproj +++ b/Source/Mosa.Tool.Debugger/Mosa.Tool.Debugger.csproj @@ -164,7 +164,7 @@ - + diff --git a/Source/Mosa.Tool.Explorer/MainForm.cs b/Source/Mosa.Tool.Explorer/MainForm.cs index ec1530c0d1..d5f8dde7fe 100644 --- a/Source/Mosa.Tool.Explorer/MainForm.cs +++ b/Source/Mosa.Tool.Explorer/MainForm.cs @@ -8,6 +8,7 @@ using Mosa.Compiler.Framework; using Mosa.Compiler.Framework.CompilerStages; using Mosa.Compiler.Framework.Stages; +using Mosa.Compiler.Framework.Stages.Diagnostic; using Mosa.Compiler.MosaTypeSystem; using Mosa.Compiler.MosaTypeSystem.CLR; using Mosa.Tool.Explorer.Stages; @@ -573,12 +574,8 @@ private void ExtendMethodCompilerPipeline(Pipeline pipe pipeline.Add(new DisassemblyStage()); pipeline.Add(new DebugInfoStage()); - //pipeline.InsertBefore(new StopStage()); - //pipeline.InsertBefore(new DominanceOutputStage()); - //pipeline.InsertBefore(new GraphVizStage()); - //pipeline.InsertAfterLast(new GraphVizStage()); - - //pipeline.InsertAfterFirst(new StopStage()); + pipeline.InsertAfterLast(new LoopAnalysisStage()); + pipeline.InsertAfterLast(new DominanceAnalysisStage()); if (cbEnableDebugDiagnostic.Checked) { diff --git a/Source/Mosa.Tool.Explorer/Mosa.Tool.Explorer.csproj b/Source/Mosa.Tool.Explorer/Mosa.Tool.Explorer.csproj index ecc7a3cdbb..89c342b78d 100644 --- a/Source/Mosa.Tool.Explorer/Mosa.Tool.Explorer.csproj +++ b/Source/Mosa.Tool.Explorer/Mosa.Tool.Explorer.csproj @@ -35,7 +35,7 @@ - + diff --git a/Source/Mosa.Tool.Launcher/Mosa.Tool.Launcher.csproj b/Source/Mosa.Tool.Launcher/Mosa.Tool.Launcher.csproj index 5a6f758f9d..63994d2faf 100644 --- a/Source/Mosa.Tool.Launcher/Mosa.Tool.Launcher.csproj +++ b/Source/Mosa.Tool.Launcher/Mosa.Tool.Launcher.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/Source/Mosa.Utility.Disassembler/Mosa.Utility.Disassembler.csproj b/Source/Mosa.Utility.Disassembler/Mosa.Utility.Disassembler.csproj index 609cb12454..b4b89b9282 100644 --- a/Source/Mosa.Utility.Disassembler/Mosa.Utility.Disassembler.csproj +++ b/Source/Mosa.Utility.Disassembler/Mosa.Utility.Disassembler.csproj @@ -1,7 +1,7 @@  - +