From c40f09056b586692cb216f6307e8a6cfdecb0a39 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Fri, 12 Jul 2024 17:08:52 -0700 Subject: [PATCH 1/7] Define equals manually for Swift JitInterface InlineArray types. --- .../tools/Common/JitInterface/CorInfoTypes.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 12e2af5bd3a36a..883fba0e8f30e1 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1509,12 +1509,52 @@ public struct CORINFO_SWIFT_LOWERING private struct SwiftLoweredTypes { public CorInfoType type; + + public override bool Equals(object other) + { + if (other is SwiftLoweredTypes otherType) + { + ReadOnlySpan self = this; + return self.SequenceEqual(otherType); + } + return false; + } + + public override int GetHashCode() + { + var code = new HashCode(); + foreach (var item in this) + { + code.Add(item); + } + return code.ToHashCode(); + } } [InlineArray(4)] private struct LoweredOffsets { public uint offset; + + public override bool Equals(object other) + { + if (other is LoweredOffsets otherType) + { + ReadOnlySpan self = this; + return self.SequenceEqual(otherType); + } + return false; + } + + public override int GetHashCode() + { + var code = new HashCode(); + foreach (var item in this) + { + code.Add(item); + } + return code.ToHashCode(); + } } private SwiftLoweredTypes _loweredElements; From 8f6bcacbea8d5777bdf2e91b3766b56502e5a32c Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Tue, 16 Jul 2024 15:09:07 -0700 Subject: [PATCH 2/7] Implement equality on the parent CORINFO_SWIFT_LOWERING type --- .../tools/Common/JitInterface/CorInfoTypes.cs | 81 ++++++++++--------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 883fba0e8f30e1..769bec69ff34bb 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1509,52 +1509,12 @@ public struct CORINFO_SWIFT_LOWERING private struct SwiftLoweredTypes { public CorInfoType type; - - public override bool Equals(object other) - { - if (other is SwiftLoweredTypes otherType) - { - ReadOnlySpan self = this; - return self.SequenceEqual(otherType); - } - return false; - } - - public override int GetHashCode() - { - var code = new HashCode(); - foreach (var item in this) - { - code.Add(item); - } - return code.ToHashCode(); - } } [InlineArray(4)] private struct LoweredOffsets { public uint offset; - - public override bool Equals(object other) - { - if (other is LoweredOffsets otherType) - { - ReadOnlySpan self = this; - return self.SequenceEqual(otherType); - } - return false; - } - - public override int GetHashCode() - { - var code = new HashCode(); - foreach (var item in this) - { - code.Add(item); - } - return code.ToHashCode(); - } } private SwiftLoweredTypes _loweredElements; @@ -1569,6 +1529,47 @@ public override int GetHashCode() public nint numLoweredElements; + public override bool Equals(object obj) + { + if (obj is not CORINFO_SWIFT_LOWERING other) + { + return false; + } + + if (byReference != other.byReference) + { + return false; + } + + // If both are by-ref, the rest of the bits mean nothing. + if (byReference) + { + return true; + } + + return LoweredElements.Slice(0, numLoweredElements).SequenceEqual(other.LoweredElements).Slice(0, other.numLoweredElements) + && Offsets.Slice(0, numLoweredElements).SequenceEqual(other.Offsets).Slice(0, other.numLoweredElements); + } + + public override int GetHashCode() + { + HashCode code = new HashCode(); + code.Add(byReference); + + if (byReference) + { + return code.ToHashCode(); + } + + for (int i = 0; i < numLoweredElements; i++) + { + code.Add(LoweredElements[i]); + code.Add(Offsets[i]); + } + + return code.ToHashCode(); + } + // Override for a better unit test experience public override string ToString() { From b0556d40e601c3ba028927038700ade8a6e604a5 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 17 Jul 2024 10:39:33 -0700 Subject: [PATCH 3/7] Add casts --- src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 769bec69ff34bb..1028fe93c5b2e4 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1547,8 +1547,8 @@ public override bool Equals(object obj) return true; } - return LoweredElements.Slice(0, numLoweredElements).SequenceEqual(other.LoweredElements).Slice(0, other.numLoweredElements) - && Offsets.Slice(0, numLoweredElements).SequenceEqual(other.Offsets).Slice(0, other.numLoweredElements); + return LoweredElements.Slice(0, (int)numLoweredElements).SequenceEqual(other.LoweredElements).Slice(0, (int)other.numLoweredElements) + && Offsets.Slice(0, (int)numLoweredElements).SequenceEqual(other.Offsets).Slice(0, (int)other.numLoweredElements); } public override int GetHashCode() From af307e4b4d328c1ac6587deca1ad6afcbf5aa92d Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Wed, 17 Jul 2024 11:10:17 -0700 Subject: [PATCH 4/7] Update src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs --- src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 1028fe93c5b2e4..3eef45be22765f 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1547,7 +1547,7 @@ public override bool Equals(object obj) return true; } - return LoweredElements.Slice(0, (int)numLoweredElements).SequenceEqual(other.LoweredElements).Slice(0, (int)other.numLoweredElements) + return LoweredElements.Slice(0, (int)numLoweredElements).SequenceEqual(other.LoweredElements.Slice(0, (int)other.numLoweredElements); && Offsets.Slice(0, (int)numLoweredElements).SequenceEqual(other.Offsets).Slice(0, (int)other.numLoweredElements); } From a8ea9525f1b18925deea6ca404715a23b5a8bdd5 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 17 Jul 2024 11:31:45 -0700 Subject: [PATCH 5/7] Fix syntax --- src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 1028fe93c5b2e4..1ef9226e6223e7 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1547,8 +1547,8 @@ public override bool Equals(object obj) return true; } - return LoweredElements.Slice(0, (int)numLoweredElements).SequenceEqual(other.LoweredElements).Slice(0, (int)other.numLoweredElements) - && Offsets.Slice(0, (int)numLoweredElements).SequenceEqual(other.Offsets).Slice(0, (int)other.numLoweredElements); + return LoweredElements.Slice(0, (int)numLoweredElements).SequenceEqual(other.LoweredElements.Slice(0, (int)other.numLoweredElements)) + && Offsets.Slice(0, (int)numLoweredElements).SequenceEqual(other.Offsets.Slice(0, (int)other.numLoweredElements)); } public override int GetHashCode() From f8aad9faa6f24e67486f0528767b4fb4211be13d Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 17 Jul 2024 13:50:13 -0700 Subject: [PATCH 6/7] Fix analyzer errors --- .../tools/Common/JitInterface/CorInfoTypes.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 1ef9226e6223e7..f863caad0abab6 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1500,7 +1500,7 @@ public unsafe struct CORINFO_TYPE_LAYOUT_NODE public bool hasSignificantPadding { get => _hasSignificantPadding != 0; set => _hasSignificantPadding = value ? (byte)1 : (byte)0; } } - public struct CORINFO_SWIFT_LOWERING + public struct CORINFO_SWIFT_LOWERING : IEquatable { private byte _byReference; public bool byReference { get => _byReference != 0; set => _byReference = value ? (byte)1 : (byte)0; } @@ -1531,11 +1531,11 @@ private struct LoweredOffsets public override bool Equals(object obj) { - if (obj is not CORINFO_SWIFT_LOWERING other) - { - return false; - } + return obj is CORINFO_SWIFT_LOWERING other && Equals(other); + } + public bool Equals(CORINFO_SWIFT_LOWERING other) + { if (byReference != other.byReference) { return false; @@ -1553,7 +1553,7 @@ public override bool Equals(object obj) public override int GetHashCode() { - HashCode code = new HashCode(); + HashCode code = default; code.Add(byReference); if (byReference) From 3d39dad446e02cb239a9fca719c398f446de00de Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 17 Jul 2024 16:01:18 -0700 Subject: [PATCH 7/7] Fix calculating expected offset for byte elements. --- .../tools/aot/ILCompiler.Compiler.Tests/SwiftLoweringTests.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler.Tests/SwiftLoweringTests.cs b/src/coreclr/tools/aot/ILCompiler.Compiler.Tests/SwiftLoweringTests.cs index 1487f1b5e38804..21122fec7ffd20 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler.Tests/SwiftLoweringTests.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler.Tests/SwiftLoweringTests.cs @@ -88,6 +88,10 @@ public static IEnumerable DiscoverSwiftTypes() { expected.Offsets[i] = (uint)naturalOffset.AlignUp(size); } + else + { + expected.Offsets[i] = (uint)naturalOffset; + } naturalOffset += size; } }