Extend uses count from ushort to uint on Operand Data structure (#3374)

This commit is contained in:
gdkchan 2022-06-05 14:15:27 -03:00 committed by GitHub
parent a3e7bb8eb4
commit 633c5ec330
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -14,10 +14,11 @@ namespace ARMeilleure.IntermediateRepresentation
public byte Kind; public byte Kind;
public byte Type; public byte Type;
public byte SymbolType; public byte SymbolType;
public byte Padding; // Unused space.
public ushort AssignmentsCount; public ushort AssignmentsCount;
public ushort AssignmentsCapacity; public ushort AssignmentsCapacity;
public ushort UsesCount; public uint UsesCount;
public ushort UsesCapacity; public uint UsesCapacity;
public Operation* Assignments; public Operation* Assignments;
public Operation* Uses; public Operation* Uses;
public ulong Value; public ulong Value;
@ -84,11 +85,11 @@ namespace ARMeilleure.IntermediateRepresentation
{ {
Debug.Assert(Kind != OperandKind.Memory); Debug.Assert(Kind != OperandKind.Memory);
return new ReadOnlySpan<Operation>(_data->Uses, _data->UsesCount); return new ReadOnlySpan<Operation>(_data->Uses, (int)_data->UsesCount);
} }
} }
public int UsesCount => _data->UsesCount; public int UsesCount => (int)_data->UsesCount;
public int AssignmentsCount => _data->AssignmentsCount; public int AssignmentsCount => _data->AssignmentsCount;
public bool Relocatable => Symbol.Type != SymbolType.None; public bool Relocatable => Symbol.Type != SymbolType.None;
@ -265,6 +266,13 @@ namespace ARMeilleure.IntermediateRepresentation
data = Allocators.References.Allocate<T>(initialCapacity); data = Allocators.References.Allocate<T>(initialCapacity);
} }
private static void New<T>(ref T* data, ref uint count, ref uint capacity, uint initialCapacity) where T : unmanaged
{
count = 0;
capacity = initialCapacity;
data = Allocators.References.Allocate<T>(initialCapacity);
}
private static void Add<T>(T item, ref T* data, ref ushort count, ref ushort capacity) where T : unmanaged private static void Add<T>(T item, ref T* data, ref ushort count, ref ushort capacity) where T : unmanaged
{ {
if (count < capacity) if (count < capacity)
@ -294,6 +302,40 @@ namespace ARMeilleure.IntermediateRepresentation
} }
} }
private static void Add<T>(T item, ref T* data, ref uint count, ref uint capacity) where T : unmanaged
{
if (count < capacity)
{
data[count++] = item;
return;
}
// Could not add item in the fast path, fallback onto the slow path.
ExpandAdd(item, ref data, ref count, ref capacity);
static void ExpandAdd(T item, ref T* data, ref uint count, ref uint capacity)
{
uint newCount = checked(count + 1);
uint newCapacity = (uint)Math.Min(capacity * 2, int.MaxValue);
if (newCapacity <= capacity)
{
throw new OverflowException();
}
var oldSpan = new Span<T>(data, (int)count);
capacity = newCapacity;
data = Allocators.References.Allocate<T>(capacity);
oldSpan.CopyTo(new Span<T>(data, (int)count));
data[count] = item;
count = newCount;
}
}
private static void Remove<T>(in T item, ref T* data, ref ushort count) where T : unmanaged private static void Remove<T>(in T item, ref T* data, ref ushort count) where T : unmanaged
{ {
var span = new Span<T>(data, count); var span = new Span<T>(data, count);
@ -314,6 +356,26 @@ namespace ARMeilleure.IntermediateRepresentation
} }
} }
private static void Remove<T>(in T item, ref T* data, ref uint count) where T : unmanaged
{
var span = new Span<T>(data, (int)count);
for (int i = 0; i < span.Length; i++)
{
if (EqualityComparer<T>.Default.Equals(span[i], item))
{
if (i + 1 < count)
{
span.Slice(i + 1).CopyTo(span.Slice(i));
}
count--;
return;
}
}
}
public override int GetHashCode() public override int GetHashCode()
{ {
if (Kind == OperandKind.LocalVariable) if (Kind == OperandKind.LocalVariable)