Skip to content

Commit

Permalink
Enabled ManagedPointer instructions + Fixes (#1055)
Browse files Browse the repository at this point in the history
* -Unwind ManagedPointer changes

* Squashed commit of the following:

commit 9fb6c36
Author: Phil <phil@thinkedge.com>
Date:   Sat May 20 08:08:32 2023 -0700

    - Fix

commit 06af252
Author: Phil <phil@thinkedge.com>
Date:   Sun May 14 10:26:04 2023 -0700

    - Fix

commit 7c1fdb9
Author: Phil <phil@thinkedge.com>
Date:   Sun May 14 09:49:43 2023 -0700

    - Fix

commit 5d6dce9
Author: Phil <phil@thinkedge.com>
Date:   Sun May 14 09:39:00 2023 -0700

    - Fix

commit 7dbf63d
Author: Phil <phil@thinkedge.com>
Date:   Sun May 14 07:53:22 2023 -0700

    -Merge

# Conflicts:
#	Source/Mosa.Runtime/Internal.cs

* - Merge

* - Fix

* - Cleanup
  • Loading branch information
tgiphil committed May 25, 2023
1 parent 07a02a9 commit 52abb63
Show file tree
Hide file tree
Showing 30 changed files with 450 additions and 566 deletions.
30 changes: 15 additions & 15 deletions Source/Data/IR-Optimizations-ConstantFolding-MemoryAccess.json
Original file line number Diff line number Diff line change
Expand Up @@ -399,119 +399,119 @@
"Type": "ConstantFolding",
"Name": "Load32",
"SubName": "AddressFold",
"Expression": "(IR.Load32 (IR.AddressOf parameter) 0)",
"Expression": "IR.Load32 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter) & !IsFloatingPoint(parameter)",
"Result": "(IR.LoadParam32 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "Load64",
"SubName": "AddressFold",
"Expression": "(IR.Load64 (IR.AddressOf parameter) 0)",
"Expression": "IR.Load64 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter) & !IsFloatingPoint(parameter)",
"Result": "(IR.LoadParam64 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadParamManagedPointer",
"SubName": "AddressFold",
"Expression": "(IR.LoadParamManagedPointer (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadParamManagedPointer (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter) & !IsFloatingPoint(parameter)",
"Result": "(IR.LoadParamManagedPointer parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadR4",
"SubName": "AddressFold",
"Expression": "(IR.LoadR4 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadR4 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter) & !IsInteger(parameter)",
"Result": "(IR.LoadParamR4 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadR8",
"SubName": "AddressFold",
"Expression": "(IR.LoadR8 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadR8 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter) & !IsInteger(parameter)",
"Result": "(IR.LoadParamR8 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadSignExtend8x32",
"SubName": "AddressFold",
"Expression": "(IR.LoadSignExtend8x32 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadSignExtend8x32 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamSignExtend8x32 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadSignExtend16x32",
"SubName": "AddressFold",
"Expression": "(IR.LoadSignExtend16x32 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadSignExtend16x32 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamSignExtend16x32 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadSignExtend8x64",
"SubName": "AddressFold",
"Expression": "(IR.LoadSignExtend8x64 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadSignExtend8x64 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamSignExtend8x64 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadSignExtend16x64",
"SubName": "AddressFold",
"Expression": "(IR.LoadSignExtend16x64 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadSignExtend16x64 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamSignExtend16x64 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadSignExtend32x64",
"SubName": "AddressFold",
"Expression": "(IR.LoadSignExtend32x64 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadSignExtend32x64 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamSignExtend32x64 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadZeroExtend8x32",
"SubName": "AddressFold",
"Expression": "(IR.LoadZeroExtend8x32 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadZeroExtend8x32 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamZeroExtend8x32 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadZeroExtend16x32",
"SubName": "AddressFold",
"Expression": "(IR.LoadZeroExtend16x32 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadZeroExtend16x32 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamZeroExtend16x32 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadZeroExtend8x64",
"SubName": "AddressFold",
"Expression": "(IR.LoadZeroExtend8x64 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadZeroExtend8x64 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamZeroExtend8x64 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadZeroExtend16x64",
"SubName": "AddressFold",
"Expression": "(IR.LoadZeroExtend16x64 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadZeroExtend16x64 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamZeroExtend16x64 parameter)"
},
{
"Type": "ConstantFolding",
"Name": "LoadZeroExtend32x64",
"SubName": "AddressFold",
"Expression": "(IR.LoadZeroExtend32x64 (IR.AddressOf parameter) 0)",
"Expression": "IR.LoadZeroExtend32x64 (IR.AddressOf parameter) 0",
"Filter": "IsParameter(parameter)",
"Result": "(IR.LoadParamZeroExtend32x64 parameter)"
}
Expand Down
3 changes: 2 additions & 1 deletion Source/Data/X64-Optimizations-Standard.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@
"Filter": "!IsCPURegister(a,%RSI) && !IsCPURegister(a,%RDI) && !AreStatusFlagUsed(@)",
"Result": "(X64.Movzx8To## a)",
"Variations": "Yes",
"Log": "No"
"Log": "Yes",
"Ignore": "Yes"
},
{
"Type": "StrengthReduction",
Expand Down
3 changes: 2 additions & 1 deletion Source/Data/X86-Optimizations-Standard.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@
"Filter": "!IsCPURegister(a,%ESI) && !IsCPURegister(a,%EDI) && !AreStatusFlagUsed(@)",
"Result": "(X86.Movzx8To32 a)",
"Variations": "Yes",
"Log": "No"
"Log": "Yes",
"Ignore": "Yes"
},
{
"Type": "StrengthReduction",
Expand Down
5 changes: 5 additions & 0 deletions Source/Mosa.Compiler.Framework/BaseTransform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ protected static bool IsSSAForm(Operand operand)
return operand.Definitions.Count == 1;
}

protected static bool IsSSAFormOrConstant(Operand operand)
{
return operand.IsConstant || operand.Definitions.Count == 1;
}

protected static bool AreSame(Operand operand1, Operand operand2)
{
if (operand1 == operand2)
Expand Down
1 change: 0 additions & 1 deletion Source/Mosa.Compiler.Framework/Compiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,6 @@ private static List<BaseMethodCompilerStage> GetDefaultMethodPipeline(CompilerSe
new IRTransformsStage(),

compilerSettings.InlineMethods || compilerSettings.InlineExplicit ? new InlineStage() : null,
new PromoteTemporaryVariables(),
new StaticLoadOptimizationStage(),

compilerSettings.BasicOptimizations ? new OptimizationStage(false) : null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ protected override void Finalization()

foreach (var data in methods)
{
writer.WriteLine($"{InlinedSetupStage.RemoveReturnValue(data.Method.FullName)}\t{data.Version}");
writer.WriteLine($"{InlinedSetupStage.RemoveReturnValue(data.Method.FullName)}");
}
}
}
Expand Down
21 changes: 7 additions & 14 deletions Source/Mosa.Compiler.Framework/MethodCompiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -967,8 +967,7 @@ public BaseInstruction GetLoadParamInstruction(ElementType elementType)
ElementType.Object => IRInstruction.LoadParamObject,
ElementType.I when Is32BitPlatform => IRInstruction.LoadParam32,
ElementType.I when Is64BitPlatform => IRInstruction.LoadParam64,
ElementType.ManagedPointer when Is32BitPlatform => IRInstruction.LoadParam32,
ElementType.ManagedPointer when Is64BitPlatform => IRInstruction.LoadParam64,
ElementType.ManagedPointer => IRInstruction.LoadParamManagedPointer,
_ => throw new InvalidOperationException(),
};
}
Expand All @@ -983,8 +982,7 @@ public BaseInstruction GetReturnInstruction(PrimitiveType primitiveType)
PrimitiveType.R8 => IRInstruction.SetReturnR8,
PrimitiveType.Object => IRInstruction.SetReturnObject,
PrimitiveType.ValueType => IRInstruction.SetReturnCompound,
PrimitiveType.ManagedPointer when Is32BitPlatform => IRInstruction.SetReturn32,
PrimitiveType.ManagedPointer when Is64BitPlatform => IRInstruction.SetReturn64,
PrimitiveType.ManagedPointer => IRInstruction.SetReturnManagedPointer,
_ => throw new InvalidOperationException(),
};
}
Expand Down Expand Up @@ -1028,8 +1026,7 @@ public BaseInstruction GetLoadInstruction(ElementType elementType)
ElementType.Object => IRInstruction.LoadObject,
ElementType.I when Is32BitPlatform => IRInstruction.Load32,
ElementType.I when Is64BitPlatform => IRInstruction.Load64,
ElementType.ManagedPointer when Is32BitPlatform => IRInstruction.Load32,
ElementType.ManagedPointer when Is64BitPlatform => IRInstruction.Load64,
ElementType.ManagedPointer => IRInstruction.LoadManagedPointer,
_ => throw new CompilerException($"Invalid ElementType = {elementType}"),
};
}
Expand All @@ -1051,8 +1048,7 @@ public BaseInstruction GetMoveInstruction(ElementType elementType)
ElementType.Object => IRInstruction.MoveObject,
ElementType.I when Is32BitPlatform => IRInstruction.Move32,
ElementType.I when Is64BitPlatform => IRInstruction.Move64,
ElementType.ManagedPointer when Is32BitPlatform => IRInstruction.Move32,
ElementType.ManagedPointer when Is64BitPlatform => IRInstruction.Move64,
ElementType.ManagedPointer => IRInstruction.MoveManagedPointer,
_ => throw new CompilerException($"Invalid ElementType = {elementType}"),
};
}
Expand All @@ -1066,8 +1062,7 @@ public BaseInstruction GetMoveInstruction(PrimitiveType type)
PrimitiveType.Int64 => IRInstruction.Move64,
PrimitiveType.R4 => IRInstruction.MoveR4,
PrimitiveType.R8 => IRInstruction.MoveR8,
PrimitiveType.ManagedPointer when Is32BitPlatform => IRInstruction.Move32,
PrimitiveType.ManagedPointer when Is64BitPlatform => IRInstruction.Move64,
PrimitiveType.ManagedPointer => IRInstruction.MoveManagedPointer,
PrimitiveType.ValueType => IRInstruction.MoveCompound,
_ => throw new CompilerException($"Invalid StackType = {type}"),
};
Expand All @@ -1090,8 +1085,7 @@ public BaseInstruction GetStoreInstruction(ElementType elementType)
ElementType.Object => IRInstruction.StoreObject,
ElementType.I when Is32BitPlatform => IRInstruction.Store32,
ElementType.I when Is64BitPlatform => IRInstruction.Store64,
ElementType.ManagedPointer when Is32BitPlatform => IRInstruction.Store32,
ElementType.ManagedPointer when Is64BitPlatform => IRInstruction.Store64,
ElementType.ManagedPointer => IRInstruction.StoreManagedPointer,
_ => throw new CompilerException($"Invalid ElementType = {elementType}"),
};
}
Expand All @@ -1113,8 +1107,7 @@ public BaseInstruction GetStoreParamInstruction(ElementType elementType)
ElementType.Object => IRInstruction.StoreParamObject,
ElementType.I when Is32BitPlatform => IRInstruction.StoreParam32,
ElementType.I when Is64BitPlatform => IRInstruction.StoreParam64,
ElementType.ManagedPointer when Is32BitPlatform => IRInstruction.StoreParam32,
ElementType.ManagedPointer when Is64BitPlatform => IRInstruction.StoreParam64,
ElementType.ManagedPointer => IRInstruction.StoreParamManagedPointer,
_ => throw new CompilerException($"Invalid ElementType = {elementType}"),
};
}
Expand Down
12 changes: 6 additions & 6 deletions Source/Mosa.Compiler.Framework/Operand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -966,22 +966,22 @@ public override string ToString()
}
else
{
sb.Append($"(v{Index}<v{Parent.Index}{(IsHigh ? "H" : "L")}>)");
sb.Append($"v{Index}<v{Parent.Index}{(IsHigh ? "H" : "L")}>");
}
}

if (IsStaticField)
{
sb.Append($" ({Field.FullName})");
}

sb.Append($" [{GetElementString()}]");

if (Primitive == PrimitiveType.ValueType && Type != null)
{
sb.Append($" ({Type.FullName})");
}

if (IsStaticField)
{
sb.Append($" ({Field.FullName})");
}

return sb.ToString().Trim();
}

Expand Down
28 changes: 24 additions & 4 deletions Source/Mosa.Compiler.Framework/Stages/CILDecoderStage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1276,19 +1276,28 @@ private bool Add(Context context, Stack<StackEntry> stack)
return true;
}

case PrimitiveType.ManagedPointer when entry2.PrimitiveType == PrimitiveType.ManagedPointer:
{
var result = MethodCompiler.VirtualRegisters.AllocateManagedPointer();
context.AppendInstruction(IRInstruction.AddManagedPointer, result, entry1.Operand, entry2.Operand);
PushStack(stack, new StackEntry(result));
return true;
}

case PrimitiveType.Int32 when entry2.PrimitiveType == PrimitiveType.ManagedPointer && Is32BitPlatform:
case PrimitiveType.ManagedPointer when entry2.PrimitiveType == PrimitiveType.Int32 && Is32BitPlatform:
{
var result = MethodCompiler.VirtualRegisters.AllocateManagedPointer();
context.AppendInstruction(IRInstruction.Add32, result, entry2.Operand, entry1.Operand);
context.AppendInstruction(IRInstruction.AddManagedPointer, result, entry2.Operand, entry1.Operand);
PushStack(stack, new StackEntry(result));
return true;
}

case PrimitiveType.Int64 when entry2.PrimitiveType == PrimitiveType.ManagedPointer && Is64BitPlatform:
case PrimitiveType.ManagedPointer when entry2.PrimitiveType == PrimitiveType.Int64 && Is64BitPlatform:
{
var result = MethodCompiler.VirtualRegisters.AllocateManagedPointer();
context.AppendInstruction(IRInstruction.Add64, result, entry2.Operand, entry1.Operand);
context.AppendInstruction(IRInstruction.AddManagedPointer, result, entry2.Operand, entry1.Operand);
PushStack(stack, new StackEntry(result));
return true;
}
Expand All @@ -1298,7 +1307,7 @@ private bool Add(Context context, Stack<StackEntry> stack)
var result = MethodCompiler.VirtualRegisters.AllocateManagedPointer();
var v1 = MethodCompiler.VirtualRegisters.Allocate64();
context.AppendInstruction(IRInstruction.SignExtend32x64, v1, entry1.Operand);
context.AppendInstruction(IRInstruction.Add64, result, v1, entry2.Operand);
context.AppendInstruction(IRInstruction.AddManagedPointer, result, v1, entry2.Operand);
PushStack(stack, new StackEntry(result));
return true;
}
Expand All @@ -1308,7 +1317,7 @@ private bool Add(Context context, Stack<StackEntry> stack)
var result = MethodCompiler.VirtualRegisters.AllocateManagedPointer();
var v1 = MethodCompiler.VirtualRegisters.Allocate64();
context.AppendInstruction(IRInstruction.SignExtend32x64, v1, entry2.Operand);
context.AppendInstruction(IRInstruction.Add64, result, entry1.Operand, v1);
context.AppendInstruction(IRInstruction.AddManagedPointer, result, entry1.Operand, v1);
PushStack(stack, new StackEntry(result));
return true;
}
Expand Down Expand Up @@ -3353,6 +3362,10 @@ private bool InitObj(Context context, Stack<StackEntry> stack, MosaInstruction i
{
context.AppendInstruction(IRInstruction.StoreObject, null, entry.Operand, ConstantZero, Operand.NullObject);
}
else if (type.IsManagedPointer)
{
context.AppendInstruction(IRInstruction.StoreManagedPointer, null, entry.Operand, ConstantZero, Operand.NullObject);
}
else
{
var size = Operand.CreateConstant32(TypeLayout.GetTypeLayoutSize(type));
Expand Down Expand Up @@ -4882,6 +4895,13 @@ private bool Stsfld(Context context, Stack<StackEntry> stack, MosaInstruction in

context.AppendInstruction(IRInstruction.StoreObject, null, staticReference, ConstantZero, source);
}
else if (type.IsManagedPointer)
{
var symbol = GetStaticSymbol(field);
var staticReference = Operand.CreateLabel(symbol.Name, Is32BitPlatform);

context.AppendInstruction(IRInstruction.StoreManagedPointer, null, staticReference, ConstantZero, source);
}
else
{
context.AppendInstruction(storeInstruction, null, fieldOperand, ConstantZero, source);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
namespace Mosa.Compiler.Framework.Stages;

/// <summary>
/// Value Numbering Stage
/// Loop Invariant Code Motion Stage
/// </summary>
public sealed class LoopInvariantCodeMotionStage : BaseMethodCompilerStage
{
Expand Down

0 comments on commit 52abb63

Please sign in to comment.