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 @@
-
+