From daafbb16354fc79f9a6482ded138ffce9b9e6f63 Mon Sep 17 00:00:00 2001 From: Phil Garcia Date: Tue, 7 Sep 2021 19:06:43 -0700 Subject: [PATCH] X86 Optimizations (#869) * - Slight optimization that merges more empty block * - New x86 optimizations (add 1 -> inc, sub 1 -> dec) - Added SetNop() method on Context and Node --- Source/Data/X86-Instructions.json | 4 +- .../BaseMethodCompilerStage.cs | 2 +- Source/Mosa.Compiler.Framework/Context.cs | 5 ++ .../InstructionNode.cs | 5 ++ .../Stages/BitTrackerStage.cs | 4 +- .../Stages/CILTransformationStage.cs | 4 +- ...arseConditionalConstantPropagationStage.cs | 4 +- .../Stages/ValueNumberingStage.cs | 8 +-- .../Manual/ConstantFolding/Branch32.cs | 4 +- .../Manual/ConstantFolding/Branch64.cs | 4 +- .../Manual/ConstantFolding/BranchObject.cs | 4 +- .../Manual/Memory/DoubleStoreParam32.cs | 2 +- .../Manual/Memory/DoubleStoreParam64.cs | 2 +- .../Manual/Memory/DoubleStoreParamR4.cs | 2 +- .../Manual/Memory/DoubleStoreParamR8.cs | 2 +- .../Manual/Memory/StoreLoadParam32.cs | 2 +- .../Manual/Memory/StoreLoadParam64.cs | 2 +- .../Manual/Memory/StoreLoadParamR4.cs | 2 +- .../Manual/Memory/StoreLoadParamR8.cs | 2 +- .../Simplification/Branch32OnlyOneExit.cs | 2 +- .../Simplification/Branch64OnlyOneExit.cs | 2 +- .../Simplification/BranchObjectOnlyOneExit.cs | 2 +- .../Transform/Manual/Special/Deadcode.cs | 2 +- .../Manual/Special/Move32Propagate.cs | 2 +- .../Manual/Special/Move32PropagateConstant.cs | 2 +- .../Manual/Special/Move64Propagate.cs | 2 +- .../Manual/Special/Move64PropagateConstant.cs | 2 +- .../Manual/Special/MoveCompoundPropagate.cs | 2 +- .../Manual/Special/MoveObjectPropagate.cs | 2 +- .../Special/MoveObjectPropagateConstant.cs | 2 +- .../Manual/Special/MoveR4Propagate.cs | 2 +- .../Manual/Special/MoveR8Propagate.cs | 2 +- .../Transform/Manual/Special/Phi32Dead.cs | 2 +- .../Manual/Special/Phi32Propagate.cs | 2 +- .../Transform/Manual/Special/Phi64Dead.cs | 2 +- .../Manual/Special/Phi64Propagate.cs | 2 +- .../Manual/Special/PhiObjectPropagate.cs | 2 +- .../Transform/Manual/Special/PhiR4Dead.cs | 2 +- .../Manual/Special/PhiR4Propagate.cs | 2 +- .../Transform/Manual/Special/PhiR8Dead.cs | 2 +- .../Manual/Special/PhiR8Propagate.cs | 2 +- .../Mosa.Platform.x86/Instructions/Dec32.cs | 4 +- .../Mosa.Platform.x86/Instructions/Inc32.cs | 4 +- .../Stages/EarlyOptimizationStage.cs | 18 ++--- .../Stages/PostOptimizationStage.cs | 11 ++- .../Transform/Manual/Add32ToInc32.cs | 10 +-- .../Transform/Manual/Add32ToLea32.cs | 3 + .../Transform/Manual/Stack/Add32.cs | 72 +++++++++++++++++++ .../Transform/Manual/Sub32ToDec32.cs | 13 ++-- .../Transform/Manual/Sub32ToLea32.cs | 3 + Source/Mosa.UnitTests/SpecificTests.cs | 12 ++++ 51 files changed, 180 insertions(+), 78 deletions(-) create mode 100644 Source/Mosa.Platform.x86/Transform/Manual/Stack/Add32.cs diff --git a/Source/Data/X86-Instructions.json b/Source/Data/X86-Instructions.json index e1fd5524f9..c6793a499c 100644 --- a/Source/Data/X86-Instructions.json +++ b/Source/Data/X86-Instructions.json @@ -563,7 +563,7 @@ "FlagsUnchanged": "C", "FlagsUndefined": "", "FlagsUsed": "", - "OperandCount": 2, + "OperandCount": 1, "ResultCount": 1, "ThreeTwoAddressConversion": "true", "OpcodeEncoding": [ @@ -792,7 +792,7 @@ "FlagsUnchanged": "C", "FlagsUndefined": "", "FlagsUsed": "", - "OperandCount": 2, + "OperandCount": 1, "ResultCount": 1, "ThreeTwoAddressConversion": "false", "OpcodeEncoding": [ diff --git a/Source/Mosa.Compiler.Framework/BaseMethodCompilerStage.cs b/Source/Mosa.Compiler.Framework/BaseMethodCompilerStage.cs index 1ebea03b27..877c1827c8 100644 --- a/Source/Mosa.Compiler.Framework/BaseMethodCompilerStage.cs +++ b/Source/Mosa.Compiler.Framework/BaseMethodCompilerStage.cs @@ -564,7 +564,7 @@ protected static bool EmptyBlockOfAllInstructions(BasicBlock block, bool useNop continue; } - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); found = true; } diff --git a/Source/Mosa.Compiler.Framework/Context.cs b/Source/Mosa.Compiler.Framework/Context.cs index ab1aa5e2d4..f67cfeaafa 100644 --- a/Source/Mosa.Compiler.Framework/Context.cs +++ b/Source/Mosa.Compiler.Framework/Context.cs @@ -206,6 +206,11 @@ public Context(BasicBlock block) #region Methods + public void SetNop() + { + Node.SetNop(); + } + /// /// Clones this instance. /// diff --git a/Source/Mosa.Compiler.Framework/InstructionNode.cs b/Source/Mosa.Compiler.Framework/InstructionNode.cs index cdcd65f432..6d1129f6b9 100644 --- a/Source/Mosa.Compiler.Framework/InstructionNode.cs +++ b/Source/Mosa.Compiler.Framework/InstructionNode.cs @@ -1082,6 +1082,11 @@ public InstructionNode(BaseInstruction instruction, Operand result, Operand oper #region SetInstructions + public void SetNop() + { + SetInstruction(IRInstruction.Nop); + } + /// /// Sets the instruction. /// diff --git a/Source/Mosa.Compiler.Framework/Stages/BitTrackerStage.cs b/Source/Mosa.Compiler.Framework/Stages/BitTrackerStage.cs index 2587e41f6b..209c7c9c06 100644 --- a/Source/Mosa.Compiler.Framework/Stages/BitTrackerStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/BitTrackerStage.cs @@ -561,7 +561,7 @@ private void UpdateInstruction(Operand virtualRegister, Value value) Debug.Assert(virtualRegister.Uses.Count == 0); trace?.Log($"REMOVED:\t{node}"); - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); trace?.Log(); InstructionsRemovedCount++; @@ -595,7 +595,7 @@ private void UpdateBranchInstructions() var newBranch = node.BranchTargets[0]; trace?.Log($"REMOVED:\t{node}"); - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); InstructionsRemovedCount++; BranchesRemovedCount++; diff --git a/Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs b/Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs index b5551e7a9b..0c115d6053 100644 --- a/Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs @@ -1242,7 +1242,7 @@ private void Newobj(Context context) /// The context. private void Nop(InstructionNode node) { - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); } /// @@ -1280,7 +1280,7 @@ private void Pop(InstructionNode node) private void PreReadOnly(Context context) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } /// diff --git a/Source/Mosa.Compiler.Framework/Stages/SparseConditionalConstantPropagationStage.cs b/Source/Mosa.Compiler.Framework/Stages/SparseConditionalConstantPropagationStage.cs index cd2b5f7630..361cc1975e 100644 --- a/Source/Mosa.Compiler.Framework/Stages/SparseConditionalConstantPropagationStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/SparseConditionalConstantPropagationStage.cs @@ -124,7 +124,7 @@ protected void ReplaceVirtualRegisterWithConstant(Operand target, ulong value) var defNode = target.Definitions[0]; trace?.Log($"REMOVED:\t{defNode}"); - defNode.SetInstruction(IRInstruction.Nop); + defNode.SetNop(); InstructionsRemovedCount++; } @@ -159,7 +159,7 @@ protected void RemoveBranchesToDeadBlocks(BasicBlock deadBlock) { trace?.Log("*** RemoveBranchesToDeadBlocks"); trace?.Log($"REMOVED:\t{node}"); - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); InstructionsRemovedCount++; continue; } diff --git a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs index 5eaa626f64..a0c7b140cf 100644 --- a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs @@ -246,7 +246,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out trace?.Log($"Removed Unless PHI: {node}"); - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); InstructionRemovalCount++; continue; } @@ -261,7 +261,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out trace?.Log($"Removed Redundant PHI: {node}"); - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); InstructionRemovalCount++; continue; } @@ -297,7 +297,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out } SetValueNumber(node.Result, node.Operand1); - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); InstructionRemovalCount++; continue; } @@ -332,7 +332,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out if (node.Instruction.IsParameterLoad) ParameterLoadEliminationCount++; - node.SetInstruction(IRInstruction.Nop); + node.SetNop(); InstructionRemovalCount++; SubexpressionEliminationCount++; continue; diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch32.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch32.cs index 977e6805da..833faaac76 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch32.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch32.cs @@ -56,7 +56,7 @@ public override void Transform(Context context, TransformContext transformContex if (!compare) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } else { @@ -68,7 +68,7 @@ public override void Transform(Context context, TransformContext transformContex { if (!context.IsEmptyOrNop) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } context.GotoNext(); } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch64.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch64.cs index 0d7484f432..cfebedf7cc 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch64.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch64.cs @@ -55,7 +55,7 @@ public override void Transform(Context context, TransformContext transformContex if (!compare) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } else { @@ -67,7 +67,7 @@ public override void Transform(Context context, TransformContext transformContex { if (!context.IsEmptyOrNop) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } context.GotoNext(); } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/BranchObject.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/BranchObject.cs index 35984c8364..98f29c5b02 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/BranchObject.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/BranchObject.cs @@ -55,7 +55,7 @@ public override void Transform(Context context, TransformContext transformContex if (!compare) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } else { @@ -67,7 +67,7 @@ public override void Transform(Context context, TransformContext transformContex { if (!context.IsEmptyOrNop) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } context.GotoNext(); } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam32.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam32.cs index ca12aaa49e..239f2642f8 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam32.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam64.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam64.cs index 6b37745602..2b1dc66c84 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam64.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR4.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR4.cs index eb018c85ae..137e9d3fb1 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR4.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR4.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR8.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR8.cs index 7ab81f52f2..2578528e27 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR8.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR8.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam32.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam32.cs index 6c1e4ba053..3c982ae2c9 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam32.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam64.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam64.cs index dd65f23a9f..d67c18032c 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam64.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR4.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR4.cs index cf89fc1564..5097ad9cb5 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR4.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR4.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR8.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR8.cs index 9fef07cb62..7263b4d01b 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR8.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR8.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch32OnlyOneExit.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch32OnlyOneExit.cs index f4b7e26cbb..59325ab62e 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch32OnlyOneExit.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch32OnlyOneExit.cs @@ -21,7 +21,7 @@ public override void Transform(Context context, TransformContext transformContex var target = context.BranchTargets[0]; var block = context.Block; - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); TransformContext.RemoveBlockFromPHIInstructions(block, target); } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch64OnlyOneExit.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch64OnlyOneExit.cs index ee15d3002e..3fd884a9c3 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch64OnlyOneExit.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch64OnlyOneExit.cs @@ -21,7 +21,7 @@ public override void Transform(Context context, TransformContext transformContex var target = context.BranchTargets[0]; var block = context.Block; - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); TransformContext.RemoveBlockFromPHIInstructions(block, target); } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/BranchObjectOnlyOneExit.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/BranchObjectOnlyOneExit.cs index f8c8063fb1..078c2a2782 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/BranchObjectOnlyOneExit.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/BranchObjectOnlyOneExit.cs @@ -18,7 +18,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); //context.SetInstruction(IRInstruction.Branch64, context.ConditionCode.GetReverse(), context.Result, context.Operand2, context.Operand1, context.BranchTargets[0]); } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Deadcode.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Deadcode.cs index 5ceda7e25d..318c417247 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Deadcode.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Deadcode.cs @@ -48,7 +48,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32Propagate.cs index 8cbaa98f9e..73825f2af0 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32Propagate.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32PropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32PropagateConstant.cs index b97cb268a6..121cfb4f8a 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32PropagateConstant.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32PropagateConstant.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64Propagate.cs index 64ef88ad7b..84af1e2d60 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64Propagate.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64PropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64PropagateConstant.cs index e38294de5c..50ddb7b8a8 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64PropagateConstant.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64PropagateConstant.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveCompoundPropagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveCompoundPropagate.cs index 292ee5a23d..f45445b8d7 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveCompoundPropagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveCompoundPropagate.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagate.cs index 7ff22c5b7f..a1b2038add 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagate.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagateConstant.cs index d5e5d2d5b9..aa537374de 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagateConstant.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagateConstant.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR4Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR4Propagate.cs index 6ef3841c3e..bf01f6e8d6 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR4Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR4Propagate.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR8Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR8Propagate.cs index f62492e6d6..5592e05317 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR8Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR8Propagate.cs @@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Dead.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Dead.cs index 128691ea87..220df18117 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Dead.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Dead.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Propagate.cs index bf416f493e..85bd0cf599 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Propagate.cs @@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Dead.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Dead.cs index 6630ae9e0a..871ec8f0ce 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Dead.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Dead.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Propagate.cs index 51ce632e61..2f33a7212d 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Propagate.cs @@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiObjectPropagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiObjectPropagate.cs index 6cb402e19a..b1f6187078 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiObjectPropagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiObjectPropagate.cs @@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Dead.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Dead.cs index eba08247f6..d168558a05 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Dead.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Dead.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Propagate.cs index f1b8bea3fc..6fe9e26ebd 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Propagate.cs @@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Dead.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Dead.cs index de5ffa293f..61d6a29f77 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Dead.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Dead.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, TransformContext transformContext) public override void Transform(Context context, TransformContext transformContext) { - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Propagate.cs index 313ef4b8b9..c9a759dd5a 100644 --- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Propagate.cs @@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex } } - context.SetInstruction(IRInstruction.Nop); + context.SetNop(); } } } diff --git a/Source/Mosa.Platform.x86/Instructions/Dec32.cs b/Source/Mosa.Platform.x86/Instructions/Dec32.cs index bfdde85079..39286cacb0 100644 --- a/Source/Mosa.Platform.x86/Instructions/Dec32.cs +++ b/Source/Mosa.Platform.x86/Instructions/Dec32.cs @@ -13,7 +13,7 @@ namespace Mosa.Platform.x86.Instructions public sealed class Dec32 : X86Instruction { internal Dec32() - : base(1, 2) + : base(1, 1) { } @@ -30,7 +30,7 @@ internal Dec32() public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); - System.Diagnostics.Debug.Assert(node.OperandCount == 2); + System.Diagnostics.Debug.Assert(node.OperandCount == 1); System.Diagnostics.Debug.Assert(node.Result.IsCPURegister); System.Diagnostics.Debug.Assert(node.Operand1.IsCPURegister); System.Diagnostics.Debug.Assert(node.Result.Register == node.Operand1.Register); diff --git a/Source/Mosa.Platform.x86/Instructions/Inc32.cs b/Source/Mosa.Platform.x86/Instructions/Inc32.cs index 195e5f80e3..acdefff227 100644 --- a/Source/Mosa.Platform.x86/Instructions/Inc32.cs +++ b/Source/Mosa.Platform.x86/Instructions/Inc32.cs @@ -13,7 +13,7 @@ namespace Mosa.Platform.x86.Instructions public sealed class Inc32 : X86Instruction { internal Inc32() - : base(1, 2) + : base(1, 1) { } @@ -28,7 +28,7 @@ internal Inc32() public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); - System.Diagnostics.Debug.Assert(node.OperandCount == 2); + System.Diagnostics.Debug.Assert(node.OperandCount == 1); opcodeEncoder.Append4Bits(0b0100); opcodeEncoder.Append1Bit(0b0); diff --git a/Source/Mosa.Platform.x86/Stages/EarlyOptimizationStage.cs b/Source/Mosa.Platform.x86/Stages/EarlyOptimizationStage.cs index 4b757a21ec..78411c9fb0 100644 --- a/Source/Mosa.Platform.x86/Stages/EarlyOptimizationStage.cs +++ b/Source/Mosa.Platform.x86/Stages/EarlyOptimizationStage.cs @@ -1,8 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using Mosa.Compiler.Framework.Stages; -using Mosa.Platform.x86.Transform.Manual; -using Mosa.Platform.x86.Transform.Manual.Special; namespace Mosa.Platform.x86.Stages { @@ -12,22 +10,24 @@ namespace Mosa.Platform.x86.Stages /// public sealed class EarlyOptimizationStage : BaseOptimizationStage { - public override string Name { get { return "X86." + GetType().Name; } } + public override string Name { get { return "x86." + GetType().Name; } } public EarlyOptimizationStage() : base(false) { //AddTranformations(AutoTransforms.List); - AddTranformation(new Deadcode()); + AddTranformation(new Transform.Manual.Special.Deadcode()); - //AddTranformation(new Add32ToInc32()); - //AddTranformation(new Sub32ToDec32()); + AddTranformation(new Transform.Manual.Add32ToInc32()); + AddTranformation(new Transform.Manual.Sub32ToDec32()); - AddTranformation(new Add32ToLea32()); - AddTranformation(new Sub32ToLea32()); + AddTranformation(new Transform.Manual.Add32ToLea32()); + AddTranformation(new Transform.Manual.Sub32ToLea32()); - //AddTranformation(new Mov32Propagate()); + //AddTranformation(new Transform.Manual.Special.Mov32Propagate()); + + AddTranformation(new Transform.Manual.Stack.Add32()); } protected override void CustomizeTransformationContract() diff --git a/Source/Mosa.Platform.x86/Stages/PostOptimizationStage.cs b/Source/Mosa.Platform.x86/Stages/PostOptimizationStage.cs index 551209e57f..3d1bb77e73 100644 --- a/Source/Mosa.Platform.x86/Stages/PostOptimizationStage.cs +++ b/Source/Mosa.Platform.x86/Stages/PostOptimizationStage.cs @@ -1,8 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using Mosa.Compiler.Framework.Stages; -using Mosa.Platform.x86.Transform.Manual; -using Mosa.Platform.x86.Transform.Manual.Special; namespace Mosa.Platform.x86.Stages { @@ -12,17 +10,18 @@ namespace Mosa.Platform.x86.Stages /// public sealed class PostOptimizationStage : BaseOptimizationStage { - public override string Name { get { return "X86." + GetType().Name; } } + public override string Name { get { return "x86." + GetType().Name; } } public PostOptimizationStage() : base(false) { //AddTranformations(AutoTransforms.List); - //AddTranformation(new Add32ToInc32()); + AddTranformation(new Transform.Manual.Special.Deadcode()); + AddTranformation(new Transform.Manual.Mov32ToXor32()); - AddTranformation(new Deadcode()); - AddTranformation(new Mov32ToXor32()); + AddTranformation(new Transform.Manual.Add32ToInc32()); + AddTranformation(new Transform.Manual.Sub32ToDec32()); } protected override void CustomizeTransformationContract() diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Add32ToInc32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Add32ToInc32.cs index 10fbd3954f..f64bcab3a3 100644 --- a/Source/Mosa.Platform.x86/Transform/Manual/Add32ToInc32.cs +++ b/Source/Mosa.Platform.x86/Transform/Manual/Add32ToInc32.cs @@ -7,9 +7,6 @@ namespace Mosa.Platform.x86.Transform.Manual { - /// - /// Inc32 - /// public sealed class Add32ToInc32 : BaseTransformation { public Add32ToInc32() : base(X86.Add32, true) @@ -24,7 +21,10 @@ public override bool Match(Context context, TransformContext transformContext) if (context.Operand2.ConstantUnsigned64 != 1) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, true, false, true, true, true) == TriState.No)) + if (context.Operand1 != context.Result) + return false; + + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) return false; return true; @@ -36,7 +36,7 @@ public override void Transform(Context context, TransformContext transformContex var t1 = context.Operand1; - context.SetInstruction(X86.Inc32, result, t1, t1); + context.SetInstruction(X86.Inc32, result, t1); } } } diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Add32ToLea32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Add32ToLea32.cs index 7514625481..f9c31b02fb 100644 --- a/Source/Mosa.Platform.x86/Transform/Manual/Add32ToLea32.cs +++ b/Source/Mosa.Platform.x86/Transform/Manual/Add32ToLea32.cs @@ -25,6 +25,9 @@ public override bool Match(Context context, TransformContext transformContext) if (context.Operand2.IsCPURegister) return false; + if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result) + return false; + if (!(AreStatusFlagsUsed(context.Node) == TriState.No)) return false; diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Stack/Add32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Stack/Add32.cs new file mode 100644 index 0000000000..49d8508e99 --- /dev/null +++ b/Source/Mosa.Platform.x86/Transform/Manual/Stack/Add32.cs @@ -0,0 +1,72 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +// This code was generated by an automated template. + +using Mosa.Compiler.Framework; +using Mosa.Compiler.Framework.Transform; +using Mosa.Platform.Intel; +using System.Diagnostics; + +namespace Mosa.Platform.x86.Transform.Manual.Stack +{ + /// + /// Add32 + /// + public sealed class Add32 : BaseTransformation + { + public Add32() : base(X86.Add32, true) + { + } + + public override bool Match(Context context, TransformContext transformContext) + { + if (!context.Operand1.IsCPURegister) + return false; + + if (context.Operand1.Register != GeneralPurposeRegister.ESP) + return false; + + if (!context.Operand2.IsConstant) + return false; + + var next = GetNextNode(context); + + if (next == null) + return false; + + if (next.Instruction != X86.Sub32) + return false; + + if (!next.Operand2.IsConstant) + return false; + + return true; + } + + public override void Transform(Context context, TransformContext transformContext) + { + var next = GetNextNode(context); + + var value1 = context.Operand2.ConstantSigned32; + var value2 = next.Operand2.ConstantSigned32; + + var value = value1 - value2; + + next.SetNop(); + + if (value > 0) + { + context.SetInstruction(X86.Add32, context.Result, context.Operand1, transformContext.CreateConstant(value)); + } + else if (value < 0) + { + context.SetInstruction(X86.Sub32, context.Result, context.Operand1, transformContext.CreateConstant(-value)); + } + else // if (value == 0) + { + Debug.Assert(value == 0); + context.SetNop(); + } + } + } +} diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToDec32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToDec32.cs index 899e2836f5..54242253f0 100644 --- a/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToDec32.cs +++ b/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToDec32.cs @@ -7,9 +7,6 @@ namespace Mosa.Platform.x86.Transform.Manual { - /// - /// Dec32 - /// public sealed class Sub32ToDec32 : BaseTransformation { public Sub32ToDec32() : base(X86.Sub32, true) @@ -24,7 +21,13 @@ public override bool Match(Context context, TransformContext transformContext) if (context.Operand2.ConstantUnsigned64 != 1) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, true, false, true, true, true) == TriState.No)) + if (context.Operand1.IsCPURegister) + return false; + + if (context.Operand1 != context.Result) + return false; + + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) return false; return true; @@ -36,7 +39,7 @@ public override void Transform(Context context, TransformContext transformContex var t1 = context.Operand1; - context.SetInstruction(X86.Dec32, result, t1, t1); + context.SetInstruction(X86.Dec32, result, t1); } } } diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToLea32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToLea32.cs index b82ae0ce58..4fe96bec51 100644 --- a/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToLea32.cs +++ b/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToLea32.cs @@ -25,6 +25,9 @@ public override bool Match(Context context, TransformContext transformContext) if (!context.Operand2.IsResolvedConstant) return false; + if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result) + return false; + if (!(AreStatusFlagsUsed(context.Node) == TriState.No)) return false; diff --git a/Source/Mosa.UnitTests/SpecificTests.cs b/Source/Mosa.UnitTests/SpecificTests.cs index 89a17cb38c..f10e30379e 100644 --- a/Source/Mosa.UnitTests/SpecificTests.cs +++ b/Source/Mosa.UnitTests/SpecificTests.cs @@ -4,6 +4,18 @@ namespace Mosa.UnitTests { public static class SpecificTests { + [MosaUnitTest(Series = "I4")] + public static int IncBy1(int a) + { + return a + 1; + } + + [MosaUnitTest(Series = "I4")] + public static int DecBy1(int a) + { + return a - 1; + } + [MosaUnitTest((byte)0)] [MosaUnitTest((byte)1)] [MosaUnitTest((byte)2)]