Skip to content

Commit

Permalink
Merge pull request #258 from stevehalliwell/optimiser-comm
Browse files Browse the repository at this point in the history
Merge optimiser-comm into main
  • Loading branch information
stevehalliwell committed Jun 20, 2024
2 parents c569f1a + c1a7070 commit 2463142
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 6 deletions.
12 changes: 6 additions & 6 deletions ulox/ulox.core.tests/OptimiserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ public void Optimiser_Registerise_For()
;");

Assert.AreEqual("01234", testEngine.InterpreterResult);
StringAssert.Contains("Instructions: 28 -> 19", _opt.OptimisationReporter.GetReport().GenerateStringReport());
StringAssert.Contains("Instructions: 28 -> 18", _opt.OptimisationReporter.GetReport().GenerateStringReport());
}

[Test]
Expand Down Expand Up @@ -405,7 +405,7 @@ public void Optimiser_Reorder_Loop_WhenGivenNumberArrayAndItemName_ShouldPrintIt
");

Assert.AreEqual("123", testEngine.InterpreterResult);
StringAssert.Contains("Instructions: 67 -> 44", _opt.OptimisationReporter.GetReport().GenerateStringReport());
StringAssert.Contains("Instructions: 67 -> 43", _opt.OptimisationReporter.GetReport().GenerateStringReport());
}

[Test]
Expand All @@ -425,7 +425,7 @@ fun DoIt()
DoIt();");

Assert.AreEqual("12345", testEngine.InterpreterResult);
StringAssert.Contains("Instructions: 27 -> 19", _opt.OptimisationReporter.GetReport().GenerateStringReport());
StringAssert.Contains("Instructions: 27 -> 18", _opt.OptimisationReporter.GetReport().GenerateStringReport());
}

[Test]
Expand Down Expand Up @@ -469,7 +469,7 @@ fun DoIt()
DoIt();");

Assert.AreEqual("1020304050111213141512122232425231323334353414243444545", testEngine.InterpreterResult);
StringAssert.Contains("Instructions: 59 -> 43", _opt.OptimisationReporter.GetReport().GenerateStringReport());
StringAssert.Contains("Instructions: 59 -> 41", _opt.OptimisationReporter.GetReport().GenerateStringReport());
}

[Test]
Expand Down Expand Up @@ -828,7 +828,7 @@ match target

Assert.AreEqual("", testEngine.InterpreterResult);
Assert.IsTrue(testEngine.MyEngine.Context.Vm.TestRunner.AllPassed);
StringAssert.Contains("Instructions: 812 -> 504", _opt.OptimisationReporter.GetReport().GenerateStringReport());
StringAssert.Contains("Instructions: 812 -> 496", _opt.OptimisationReporter.GetReport().GenerateStringReport());
}

[Test]
Expand Down Expand Up @@ -857,7 +857,7 @@ loop arr
");

Assert.AreEqual("pre13post", testEngine.InterpreterResult);
StringAssert.Contains("Instructions: 103 -> 73", _opt.OptimisationReporter.GetReport().GenerateStringReport());
StringAssert.Contains("Instructions: 103 -> 72", _opt.OptimisationReporter.GetReport().GenerateStringReport());
}

[Test]
Expand Down
1 change: 1 addition & 0 deletions ulox/ulox.core/Package/Runtime/Optimiser/Optimiser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public enum PassCompleteRequest
public bool Enabled { get; set; } = true;
public List<IOptimiserPass> OptimiserPasses { get; } = new List<IOptimiserPass>()
{
new OptimiserPreenGetLocalsPass(),
new OptimiserSimpleRegisterisePass(),
new OptimiserRegisterisePass(),
new OptimiserCollapseOpsPass(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using static ULox.Optimiser;

namespace ULox
{
public sealed class OptimiserPreenGetLocalsPass : IOptimiserPass
{
private int _lastModifiedIndex = -1;

public void Prepare(Optimiser optimiser, Chunk chunk)
{
_lastModifiedIndex = -1;
}

public void ProcessPacket(Optimiser optimiser, Chunk chunk, int inst, ByteCodePacket packet)
{
switch (packet.OpCode)
{
case OpCode.ADD:
case OpCode.MULTIPLY:
case OpCode.EQUAL:
if (inst < 2) return; //need at least 2 instructions to do anything

//these are commutative so we can swap the order of the operands if it might make future passes easier/possible
var prev = chunk.Instructions[inst - 1];
var prevPrev = chunk.Instructions[inst - 2];

if (prevPrev.OpCode == OpCode.GET_LOCAL && _lastModifiedIndex != inst - 2)
{
switch (prev.OpCode)
{
case OpCode.PUSH_VALUE:
case OpCode.PUSH_CONSTANT:
//we can swap those two instructions
chunk.Instructions[inst - 2] = prev;
chunk.Instructions[inst - 1] = prevPrev;
_lastModifiedIndex = inst - 1;
break;
}
}
break;
}
}

public PassCompleteRequest Complete(Optimiser optimiser, Chunk chunk)
{
return PassCompleteRequest.None;
}
}
}
1 change: 1 addition & 0 deletions ulox/ulox.core/ulox.core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<RootNamespace>ulox</RootNamespace>
<AssemblyName>ulox</AssemblyName>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>9.0</LangVersion>
<AssemblyTitle>ulox</AssemblyTitle>
<Product>ulox</Product>
<Copyright>Copyright © 2021</Copyright>
Expand Down

0 comments on commit 2463142

Please sign in to comment.