From 7f0e221693faffe9160ed072169796091814b7a1 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 16 Oct 2024 16:54:37 -0700 Subject: [PATCH 1/8] Revert "Arm: Free up upper-half register that was not ready because of its association with busy lower-half register (#107714)" This reverts commit f1bcbeb5fa2fe84698b62d88dd35199f0d7fbedb. --- src/coreclr/jit/lsra.cpp | 32 +- .../JitBlue/Runtime_107621/Runtime_107621.cs | 316 ------------------ .../Runtime_107621/Runtime_107621.csproj | 8 - 3 files changed, 8 insertions(+), 348 deletions(-) delete mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.cs delete mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.csproj diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index 1467d1a6b51f43..d0cbd264fb7dc3 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -9661,40 +9661,24 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, { targetRegsReady.RemoveRegNumFromMask(fromReg); } - - // Since we want to check if we can free upperHalfReg, only do it - // if lowerHalfReg is ready. - if (targetRegsReady.IsRegNumInMask(fromReg)) - { - regNumber upperHalfSrcReg = (regNumber)source[upperHalfReg]; - regNumber upperHalfSrcLoc = (regNumber)location[upperHalfReg]; - // Necessary conditions: - // - There is a source register for this reg (upperHalfSrcReg != REG_NA) - // - It is currently free (upperHalfSrcLoc == REG_NA) - // - The source interval isn't yet completed (sourceIntervals[upperHalfSrcReg] != nullptr) - // - It's not resolved from stack (!targetRegsFromStack.IsRegNumInMask(upperHalfReg)) - if ((upperHalfSrcReg != REG_NA) && (upperHalfSrcLoc == REG_NA) && - (sourceIntervals[upperHalfSrcReg] != nullptr) && - !targetRegsFromStack.IsRegNumInMask(upperHalfReg)) - { - targetRegsReady.AddRegNumInMask(upperHalfReg); - } - } } } else if (genIsValidFloatReg(fromReg) && !genIsValidDoubleReg(fromReg)) { // We may have freed up the other half of a double where the lower half // was already free. - regNumber lowerHalfReg = REG_PREV(fromReg); - regNumber lowerHalfSrcReg = (regNumber)source[lowerHalfReg]; - regNumber lowerHalfSrcLoc = (regNumber)location[lowerHalfReg]; + regNumber lowerHalfReg = REG_PREV(fromReg); + regNumber lowerHalfSrcReg = (regNumber)source[lowerHalfReg]; + regNumber lowerHalfSrcLoc = (regNumber)location[lowerHalfReg]; + regMaskTP lowerHalfRegMask = genRegMask(lowerHalfReg); // Necessary conditions: // - There is a source register for this reg (lowerHalfSrcReg != REG_NA) // - It is currently free (lowerHalfSrcLoc == REG_NA) // - The source interval isn't yet completed (sourceIntervals[lowerHalfSrcReg] != nullptr) - // - It's not in the ready set (!targetRegsReady.IsRegNumInMask(lowerHalfReg)) - // - It's not resolved from stack (!targetRegsFromStack.IsRegNumInMask(lowerHalfReg)) + // - It's not in the ready set ((targetRegsReady & lowerHalfRegMask) == + // RBM_NONE) + // - It's not resolved from stack ((targetRegsFromStack & lowerHalfRegMask) != + // lowerHalfRegMask) if ((lowerHalfSrcReg != REG_NA) && (lowerHalfSrcLoc == REG_NA) && (sourceIntervals[lowerHalfSrcReg] != nullptr) && !targetRegsReady.IsRegNumInMask(lowerHalfReg) && diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.cs b/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.cs deleted file mode 100644 index 028015c05ec755..00000000000000 --- a/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.cs +++ /dev/null @@ -1,316 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -// Generated by Fuzzlyn v2.4 on 2024-09-10 14:15:16 -// Run on Arm Linux -// Seed: 9455791714420973255 -// Reduced from 119.7 KiB to 12.1 KiB in 00:15:49 -// Hits JIT assert in Release: -// Assertion failed 'sourceIntervals[targetReg] != nullptr' in 'Program:M8(byref,S0):long' during 'LSRA allocate' (IL size 7341; hash 0x093e6d2a; FullOpts) -// -// File: /__w/1/s/src/coreclr/jit/lsra.cpp Line: 10074 -// -using System; -using Xunit; - -namespace _107621 -{ - public struct S0 - { - public bool F0; - public long F1; - public long F2; - public float F3; - public byte F5; - public sbyte F6; - public S0(long f2, float f3, double f4, sbyte f6) : this() - { - } - } - - public class C0 - { - public long F0; - public S0 F2; - public S0 F3; - public long F5; - public C0(double f1, S0 f2, S0 f3, double f4, long f5) - { - } - } - - public struct S1 - { - public bool F1; - public S0 F2; - public C0 F3; - public byte F4; - public uint F5; - public S1(S0 f2, C0 f3) : this() - { - } - - public short M10() - { - return default(short); - } - } - - public class Program - { - public static IRuntime s_rt; - public static ulong s_1; - public static C0 s_5 = new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 1), 0, 0); - public static ushort[] s_7; - public static C0 s_11 = new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0); - - [Fact] - public static void TestEntryPoint() - { - try - { - var vr12 = s_11.F2; - M8(ref s_5.F3.F3, vr12); - } catch {} - } - - private static long M8(ref float arg0, S0 arg1) - { - double var1 = default(double); - bool var8 = default(bool); - if (arg1.F0) - { - if (M9()) - { - sbyte[,,] var0 = new sbyte[,,] - { - { - { - 1 - } - } - }; - arg0 = (arg1.F1 * new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)).M10()); - new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, -1), 0, 0)).M10(); - new S1(new S0(0, 0, 0, 0), new C0(-1.7976931348623157E+308d, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)).M10(); - s_rt.WriteLine(var0[0, 0, 0]); - s_rt.WriteLine(System.BitConverter.DoubleToUInt64Bits(var1)); - byte var3 = arg1.F5++; - var vr7 = new S1[] - { - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(-1922739055833068276L, 0, 0, 1), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 1), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(-9223372036854775808L, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(9223372036854775807L, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(-9223372036854775808L, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(3366051754928502355L, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) - }; - ref float vr16 = ref vr7[0].F3.F3.F3; - vr16 = (s_1 >> s_7[0]--); - var vr8 = new S1[] - { - new S1(new S0(-7780288970767849613L, 0, 0, 127), new C0(0, new S0(-7247354589903316995L, 0, 0, 1), new S0(3332629451991572720L, 0, 0, 0), 0, 0)), - new S1(new S0(9223372036854775806L, 0, 0, 0), new C0(0, new S0(56844987229889904L, 0, 0, 0), new S0(9223372036854775806L, 3.4028235E+38f, 0, -49), 0, -2954444398035812513L)), - new S1(new S0(9223372036854775807L, 0, 0, -127), new C0(0, new S0(9223372036854775807L, 0, 0, -127), new S0(-8108349655554254125L, 0, 0, -128), 0, 0)) - }; - float vr19 = vr8[0].F3.F3.F3; - C0 var4 = new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0); - s_rt.WriteLine(var3); - s_rt.WriteLine(var4.F0); - s_rt.WriteLine(var4.F2.F0); - s_rt.WriteLine(var4.F2.F5); - s_rt.WriteLine(var4.F3.F0); - s_rt.WriteLine(var4.F3.F1); - s_rt.WriteLine(var4.F3.F2); - s_rt.WriteLine(var4.F3.F5); - s_rt.WriteLine(var4.F5); - } - - for (int var5 = 0; var5 < 2; var5++) - { - var vr5 = new S1[] - { - new S1(new S0(0, 1, 1, 0), new C0(0, new S0(0, 1, -1, 0), new S0(0, 1, -2261.3113161007714d, 1), 0, 0)), - new S1(new S0(0, 1, 0, 0), new C0(0, new S0(0, 3.4028235E+38f, -1.7976931348623157E+308d, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) - }; - } - - S1 var6 = new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, -1), 0, 0)); - s_rt.WriteLine(var6.F1); - s_rt.WriteLine(var6.F2.F0); - s_rt.WriteLine(var6.F2.F2); - s_rt.WriteLine(var6.F2.F5); - s_rt.WriteLine(var6.F2.F6); - s_rt.WriteLine(var6.F3.F0); - s_rt.WriteLine(var6.F3.F2.F0); - s_rt.WriteLine(var6.F3.F2.F2); - s_rt.WriteLine(var6.F3.F2.F5); - s_rt.WriteLine(var6.F3.F2.F6); - s_rt.WriteLine(var6.F3.F3.F0); - s_rt.WriteLine(var6.F3.F3.F5); - s_rt.WriteLine(var6.F3.F3.F6); - s_rt.WriteLine(var6.F3.F5); - s_rt.WriteLine(var6.F4); - s_rt.WriteLine(var6.F5); - } - else - { - var vr6 = new S1[] - { - new S1(new S0(0, -1, -1.7976931348623157E+308d, 0), new C0(0, new S0(0, 0, 0, 1), new S0(0, -1, 0, 0), 1, 0)), - new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 3.4028235E+38f, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 1), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 1), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) - }; - float vr22 = vr6[0].F3.F3.F3; - arg1.F5 = (byte)vr22; - C0 var7 = new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0); - var7.F3.F3--; - s_7 = new ushort[] - { - 1 - }; - sbyte[] var9 = new sbyte[] - { - 1 - }; - if (s_5.F2.F0) - { - uint[] var10 = new uint[] - { - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0 - }; - var vr1 = new S1[] - { - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 1), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, -1), 0, 0)) - }; - sbyte var11 = (sbyte)(var10[0] - M11(vr1)); - s_rt.WriteLine(var10[0]); - s_rt.WriteLine(var11); - } - else - { - ulong[] var12 = new ulong[] - { - 1 - }; - s_rt.WriteLine(var12[0]); - } - - if (s_5.F2.F0) - { - var vr3 = new S1[] - { - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, -1, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, -1), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 1), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) - }; - C0[] var13 = new C0[] - { - new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0), - new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0) - }; - s_rt.WriteLine(var13[0].F0); - s_rt.WriteLine(var13[0].F2.F1); - s_rt.WriteLine(var13[0].F2.F2); - s_rt.WriteLine(var13[0].F2.F5); - s_rt.WriteLine(var13[0].F2.F6); - s_rt.WriteLine(var13[0].F3.F0); - s_rt.WriteLine(var13[0].F3.F1); - s_rt.WriteLine(var13[0].F3.F2); - s_rt.WriteLine(var13[0].F3.F5); - s_rt.WriteLine(var13[0].F3.F6); - s_rt.WriteLine(var13[0].F5); - } - else - { - return arg1.F2++; - } - - var7.F3.F3 = var7.F2.F3--; - float var14 = arg1.F3; - s_rt.WriteLine(System.BitConverter.SingleToUInt32Bits(var14)); - s_rt.WriteLine(var8); - var vr9 = new S1[] - { - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 1), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 1), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) - }; - var vr10 = new S1[] - { - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 1, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) - }; - s_rt.WriteLine(var7.F0); - s_rt.WriteLine(var7.F2.F0); - s_rt.WriteLine(var7.F2.F1); - s_rt.WriteLine(var7.F2.F2); - s_rt.WriteLine(var7.F2.F5); - s_rt.WriteLine(var7.F2.F6); - s_rt.WriteLine(var7.F3.F0); - s_rt.WriteLine(var7.F3.F1); - s_rt.WriteLine(var7.F3.F5); - s_rt.WriteLine(var7.F3.F6); - s_rt.WriteLine(var7.F5); - } - - for (int var15 = 0; var15 < 1; var15++) - { - var vr2 = new S1[] - { - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, -1.7976931348623157E+308d, 0), new S0(0, 0, 0, 0), 0, 0)), - new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 3.4028235E+38f, 0, 0), new S0(0, 0, 0, 0), 0, 0)) - }; - } - - return 0; - } - - private static bool M9() - { - return default(bool); - } - - private static ref float M11(S1[] arg0) - { - return ref arg0[0].F3.F3.F3; - } - } - - public interface IRuntime - { - void WriteLine(T value); - } - - public class Runtime : IRuntime - { - public void WriteLine(T value) => System.Console.WriteLine(value); - } -} \ No newline at end of file diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.csproj deleted file mode 100644 index de6d5e08882e86..00000000000000 --- a/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - True - - - - - From 8cf8d8483a5fc8727eabacab818d02154fba9d46 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 16 Oct 2024 16:54:49 -0700 Subject: [PATCH 2/8] Revert "Arm: Consider the fact that targetReg can be second half during resolution (#107493)" This reverts commit ac4b7c683823034908a86a392cd5883362ca20dc. --- src/coreclr/jit/lsra.cpp | 57 +--- .../JitBlue/Runtime_105619/Runtime_105619.cs | 246 ------------------ .../Runtime_105619/Runtime_105619.csproj | 8 - 3 files changed, 4 insertions(+), 307 deletions(-) delete mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.cs delete mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.csproj diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index d0cbd264fb7dc3..fdb7d0feb032da 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -9575,26 +9575,10 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, if (location[targetReg] == REG_NA) { #ifdef TARGET_ARM - // For Arm, check two things: - // 1. If sourceReg relates to DOUBLE interval, then make sure - // the second half of targetReg is not participating in the resolution. - // 2. On the contrary, if targetReg is second half of a DOUBLE interval, - // then make sure the first half is not participating in the resolution. - // Only when both these conditions are met, can we safely assume - // that sourceReg can be moved to targetReg. - regNumber sourceReg = (regNumber)source[targetReg]; - Interval* interval = sourceIntervals[sourceReg]; - Interval* otherTargetInterval = nullptr; - regNumber otherHalfTargetReg = REG_NA; - if (genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg)) - { - otherHalfTargetReg = REG_PREV(targetReg); - otherTargetInterval = sourceIntervals[otherHalfTargetReg]; - } - + regNumber sourceReg = (regNumber)source[targetReg]; + Interval* interval = sourceIntervals[sourceReg]; if (interval->registerType == TYP_DOUBLE) { - // Condition 1 above. // For ARM32, make sure that both of the float halves of the double register are available. assert(genIsValidDoubleReg(targetReg)); regNumber anotherHalfRegNum = REG_NEXT(targetReg); @@ -9603,22 +9587,11 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, targetRegsReady.AddRegNumInMask(targetReg); } } - else if ((otherTargetInterval != nullptr) && (otherTargetInterval->registerType == TYP_DOUBLE)) - { - // Condition 2 above. - assert(otherHalfTargetReg != REG_NA); - if (location[otherHalfTargetReg] == REG_NA) - { - targetRegsReady.AddRegNumInMask(targetReg); - } - } else +#endif // TARGET_ARM { targetRegsReady.AddRegNumInMask(targetReg); } -#else - targetRegsReady.AddRegNumInMask(targetReg); -#endif } } @@ -9832,13 +9805,6 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, { compiler->codeGen->regSet.rsSetRegsModified(genRegMask(tempReg) DEBUGARG(true)); #ifdef TARGET_ARM - Interval* otherTargetInterval = nullptr; - regNumber otherHalfTargetReg = REG_NA; - if (genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg)) - { - otherHalfTargetReg = REG_PREV(targetReg); - otherTargetInterval = sourceIntervals[otherHalfTargetReg]; - } if (sourceIntervals[fromReg]->registerType == TYP_DOUBLE) { assert(genIsValidDoubleReg(targetReg)); @@ -9847,15 +9813,8 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, addResolutionForDouble(block, insertionPoint, sourceIntervals, location, tempReg, targetReg, resolveType DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock)); } - else if (otherTargetInterval != nullptr) - { - assert(otherHalfTargetReg != REG_NA); - assert(otherTargetInterval->registerType == TYP_DOUBLE); - - addResolutionForDouble(block, insertionPoint, sourceIntervals, location, tempReg, - otherHalfTargetReg, resolveType DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock)); - } else +#endif // TARGET_ARM { assert(sourceIntervals[targetReg] != nullptr); @@ -9864,14 +9823,6 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, DEBUG_ARG(resolveTypeName[resolveType])); location[targetReg] = (regNumberSmall)tempReg; } -#else - assert(sourceIntervals[targetReg] != nullptr); - - addResolution(block, insertionPoint, sourceIntervals[targetReg], tempReg, - targetReg DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock) - DEBUG_ARG(resolveTypeName[resolveType])); - location[targetReg] = (regNumberSmall)tempReg; -#endif // TARGET_ARM targetRegsReady |= targetRegMask; } } diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.cs b/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.cs deleted file mode 100644 index 1956903c95f156..00000000000000 --- a/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.cs +++ /dev/null @@ -1,246 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -// Generated by Fuzzlyn v2.1 on 2024-07-28 15:37:46 -// Run on Arm Linux -// Seed: 8024459297219020330 -// Reduced from 3285.8 KiB to 12.2 KiB in 01:46:03 -// Hits JIT assert in Release: -// Assertion failed 'varDsc->IsAlwaysAliveInMemory() || ((regSet.GetMaskVars() & regMask) == 0)' in 'Program:Main(Fuzzlyn.ExecutionServer.IRuntime)' during 'Generate code' (IL size 7170; hash 0xade6b36b; FullOpts) -// -// File: /__w/1/s/src/coreclr/jit/codegencommon.cpp Line: 664 -// -using System; -using System.Runtime.CompilerServices; -using Xunit; - -public interface I1 -{ -} - -public struct S0 -{ - public double F0; - public sbyte F1; - public ulong F2; - public int F3; - public ulong F4; - public ulong F6; - public int F7; - public long F8; - public S0(double f0, ulong f2, ulong f4, float f5, ulong f6, int f7, long f8) : this() - { - } -} - -public struct S1 -{ - public int F0; - public S0 F2; - public S0 F3; - public S0 F4; - public S1(int f0, double f1, S0 f2, S0 f3, S0 f4) : this() - { - } -} - -public struct S2 : I1 -{ - public S1 F2; - public ushort F4; - public S1 F6; - public S1 F7; - public S2(sbyte f0, ulong f1, S1 f2, ushort f4, byte f5, S1 f6, S1 f7) : this() - { - } -} - -public class C0 -{ - public S1 F1; - public C0(S1 f1) - { - } -} - -public struct S3 : I1 -{ - public S3(short f0) : this() - { - } -} - -public struct S4 : I1 -{ - public S3 F0; - public S2 F1; - public S4(S3 f0, S2 f1, float f2, S0 f3, int f5) : this() - { - } -} - -public struct S5 -{ - public C0 F0; - public S5(C0 f0, S1 f3) : this() - { - } -} - -public class C1 -{ - public bool F1; -} - -public class Program -{ - public static IRuntime s_rt; - public static S2 s_13; - public static S1 s_18; - public static bool[] s_22; - public static C0 s_24; - public static ushort[, ] s_31; - public static S1 s_35; - public static bool s_37; - public static S5[] s_44; - public static S4 s_54; - public static S1 s_58; - public static C1[, ] s_59; - public static S4 s_60; - public static S2 s_88; - public static S2[] s_90; - - [Fact] - public static void TestEntryPoint() - { - try - { - CollectibleALC alc = new CollectibleALC(); - System.Reflection.Assembly asm = alc.LoadFromAssemblyPath(System.Reflection.Assembly.GetExecutingAssembly().Location); - System.Reflection.MethodInfo mi = asm.GetType(typeof(Program).FullName).GetMethod(nameof(MainInner)); - System.Type runtimeTy = asm.GetType(typeof(Runtime).FullName); - mi.Invoke(null, new object[] { System.Activator.CreateInstance(runtimeTy) }); - } catch {} - } - -// Allow reflection lookup on public method -#pragma warning disable xUnit1013 - public static void MainInner(IRuntime rt) - { - S0 vr8 = default(S0); - if (s_59[0, 0].F1) - { - bool[] vr9 = new bool[] - { - true - }; - s_88 = new S2(s_54.F1.F2.F4.F1, s_24.F1.F2.F4--, new S1(s_35.F2.F3, 0, new S0(-2, 0, 0, 0, 11218621709493063492UL, 450420498, 0), s_60.F1.F7.F2, new S0(0, 0, 0, 0, 0, 1, 0)), s_13.F4--, (byte)s_31[0, 0], new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), s_54.F1.F2); - vr9[0] = vr9[0]; - } - - s_rt.WriteLine("c_6973", vr8.F2); - s_rt.WriteLine("c_6975", vr8.F4); - s_rt.WriteLine("c_6978", vr8.F7); - I1[] vr10 = new I1[] - { - new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, -3.4028235E+38F, 0, 0, 0), new S0(0, 0, 0, 1, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 16728947367172946933UL, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), - new S3(0), - new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 2102657202, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 16794536930986757818UL, 0, 0, 0, 0, 0), new S0(0, 0, 11911619636908597430UL, 0, 0, 0, 0))), - new S3(0), - new S2(0, 0, new S1(-2147483647, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 1, 0, new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0)), new S1(1, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0))), - new S2(0, 0, new S1(0, -1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(-1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, -3.4028235E+38F, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), - new S4(new S3(0), new S2(1, 0, new S1(0, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), 1, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0) - }; - var vr11 = new S3(0); - var vr12 = s_44[0].F0.F1.F3.F0; - M75(vr11, vr12); - if (s_22[0]) - { - S3 vr13 = new S3(0); - try - { - var vr14 = s_54.F0; - var vr15 = s_18.F4.F0; - S3 vr23 = vr14; - } - finally - { - var vr16 = new S3(0); - var vr17 = s_58.F4.F0--; - M75(vr16, vr17); - if (s_37) - { - for (int vr18 = 0; vr18 < 2; vr18++) - { - var vr19 = new S3(0); - vr10[0] = new S4(new S3(0), new S2(1, 5461410436353764379UL, new S1(0, 0, new S0(0, 18446744073709551614UL, 0, 0, 17533718527758593297UL, 0, 0), new S0(0, 8592301711847430801UL, 0, 0, 0, 0, 0), new S0(-1, 7862269010569978854UL, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 3156588052453432602UL, 0, 0, 0, 810788132, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 15070356010362475091UL, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0); - vr10 = new I1[] - { - new S2(1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, -3.4028235E+38F, 0, -1, 0), new S0(0, 7703692348755595801UL, 0, 0, 0, 0, 0)), 0, 0, new S1(1, 1.7976931348623157E+308, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, -1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 3991586019811875011UL, 0, 0, 0, -2147483648, 0))), - new S4(new S3(-1), new S2(0, 9890997199408041578UL, new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, -7424873608279851173L), new S0(0, 0, 9698347484967702837UL, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 8154649548600176800L), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, -9223372036854775808L)), new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 778004003835070330UL, 0, 0, 0, 0, 0), new S0(0, 0, 8658698987098108904UL, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 956596481), - new S4(new S3(0), new S2(0, 453734974695362841UL, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, -8941433507005588199L)), 0, 1, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 10794758865549560580UL, 0, 7077610171127139841UL, 1, 0), new S0(1, 0, 0, 0, 0, 0, 0))), 0, new S0(1, 0, 0, 0, 17621340021635995622UL, 0, 0), 1), - new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), - new S2(0, 6130557987521252430UL, new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(1, 12555188232274105334UL, 0, 0, 0, 0, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 1828388993980413842UL, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 5800380996067047058UL, 0, 0))), - new S3(1) - }; - s_rt.WriteLine("c_7152", vr18); - } - - S0 vr20 = new S0(0, 0, 0, 0, 0, 0, 0); - C0 vr21 = new C0(new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))); - s_rt.WriteLine("c_7159", vr20.F6); - s_rt.WriteLine("c_7164", vr21.F1.F0); - s_rt.WriteLine("c_7168", vr21.F1.F2.F2); - s_rt.WriteLine("c_7170", vr21.F1.F2.F4); - s_rt.WriteLine("c_7173", vr21.F1.F2.F7); - s_rt.WriteLine("c_7176", vr21.F1.F3.F1); - s_rt.WriteLine("c_7177", vr21.F1.F3.F2); - s_rt.WriteLine("c_7181", vr21.F1.F3.F6); - s_rt.WriteLine("c_7185", vr21.F1.F4.F1); - s_rt.WriteLine("c_7191", vr21.F1.F4.F7); - s_rt.WriteLine("c_7192", vr21.F1.F4.F8); - } - - s_54.F1.F2.F0 = s_90[0].F6.F0++; - } - - var vr22 = new S5(new C0(new S1(0, 0, new S0(-2, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, -1, 0), new S0(0, 0, 0, 0, 0, 0, 0))), new S1(0, 0, new S0(-1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))); - } - - vr10 = new I1[] - { - new S4(new S3(-18643), new S2(0, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 11398096482162480173UL, 0, 0, 0, 9223372036854775806L), new S0(0, 0, 0, 0, 0, 2134113955, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 15971873843035984033UL, 0, 5979847448536525346UL, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 11276959574309188693UL, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0), - new S3(1), - new S3(0), - new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 1, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 11829847737932804605UL, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 9919258226402299883UL, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 1, 0), 0), - new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(-1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0))), - new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, -1, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 1, 0), 0), - new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(1, 0, 0, 0, 0, 0, 0), 0), - new S3(0), - new S3(0), - new S3(0) - }; - } -#pragma warning restore xUnit1013 - - private static void M75(S3 argThis, double arg1) - { - } -} - -public interface IRuntime -{ - void WriteLine(string site, T value); -} - -public class Runtime : IRuntime -{ - public void WriteLine(string site, T value) => System.Console.WriteLine(value); -} - -public class CollectibleALC : System.Runtime.Loader.AssemblyLoadContext -{ - public CollectibleALC() : base(true) - { - } -} \ No newline at end of file diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.csproj deleted file mode 100644 index de6d5e08882e86..00000000000000 --- a/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - True - - - - - From e3d6d1a9306c06a696a37fabbf6f75b9a58d7eb1 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 23 Oct 2024 18:04:11 -0700 Subject: [PATCH 3/8] wip --- src/coreclr/jit/lsra.cpp | 84 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index fdb7d0feb032da..58ac2227feec9b 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -9565,6 +9565,15 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, } } + bool apply_pr_107493 = true; + if (fromBlock && toBlock) + { + if ((fromBlock->bbNum == 12) && (toBlock->bbNum == 13)) + { + printf("here"); + } + } + // REGISTER to REGISTER MOVES // First, find all the ones that are ready to move now @@ -9575,10 +9584,26 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, if (location[targetReg] == REG_NA) { #ifdef TARGET_ARM - regNumber sourceReg = (regNumber)source[targetReg]; - Interval* interval = sourceIntervals[sourceReg]; + // For Arm, check two things: + // 1. If sourceReg relates to DOUBLE interval, then make sure + // the second half of targetReg is not participating in the resolution. + // 2. On the contrary, if targetReg is second half of a DOUBLE interval, + // then make sure the first half is not participating in the resolution. + // Only when both these conditions are met, can we safely assume + // that sourceReg can be moved to targetReg. + regNumber sourceReg = (regNumber)source[targetReg]; + Interval* interval = sourceIntervals[sourceReg]; + Interval* otherTargetInterval = nullptr; + regNumber otherHalfTargetReg = REG_NA; + if (apply_pr_107493 && genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg)) + { + otherHalfTargetReg = REG_PREV(targetReg); + otherTargetInterval = sourceIntervals[otherHalfTargetReg]; + } + if (interval->registerType == TYP_DOUBLE) { + // Condition 1 above. // For ARM32, make sure that both of the float halves of the double register are available. assert(genIsValidDoubleReg(targetReg)); regNumber anotherHalfRegNum = REG_NEXT(targetReg); @@ -9587,11 +9612,22 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, targetRegsReady.AddRegNumInMask(targetReg); } } + else if ((otherTargetInterval != nullptr) && (otherTargetInterval->registerType == TYP_DOUBLE)) + { + // Condition 2 above. + assert(otherHalfTargetReg != REG_NA); + if (location[otherHalfTargetReg] == REG_NA) + { + targetRegsReady.AddRegNumInMask(targetReg); + } + } else -#endif // TARGET_ARM { targetRegsReady.AddRegNumInMask(targetReg); } +#else + targetRegsReady.AddRegNumInMask(targetReg); +#endif } } @@ -9634,6 +9670,10 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, { targetRegsReady.RemoveRegNumFromMask(fromReg); } + if ((source[upperHalfReg] != REG_NA) && !targetRegsFromStack.IsRegNumInMask(upperHalfReg) && targetRegsToDo.IsRegNumInMask(upperHalfReg)) + { + targetRegsReady.AddRegNumInMask(upperHalfReg); + } } } else if (genIsValidFloatReg(fromReg) && !genIsValidDoubleReg(fromReg)) @@ -9805,6 +9845,13 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, { compiler->codeGen->regSet.rsSetRegsModified(genRegMask(tempReg) DEBUGARG(true)); #ifdef TARGET_ARM + Interval* otherTargetInterval = nullptr; + regNumber otherHalfTargetReg = REG_NA; + if (apply_pr_107493 && genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg)) + { + otherHalfTargetReg = REG_PREV(targetReg); + otherTargetInterval = sourceIntervals[otherHalfTargetReg]; + } if (sourceIntervals[fromReg]->registerType == TYP_DOUBLE) { assert(genIsValidDoubleReg(targetReg)); @@ -9813,16 +9860,45 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, addResolutionForDouble(block, insertionPoint, sourceIntervals, location, tempReg, targetReg, resolveType DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock)); } + else if (otherTargetInterval != nullptr) + { + assert(otherHalfTargetReg != REG_NA); + assert(otherTargetInterval->registerType == TYP_DOUBLE); + + addResolutionForDouble(block, insertionPoint, sourceIntervals, location, tempReg, + otherHalfTargetReg, resolveType DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock)); + } else -#endif // TARGET_ARM { + if (sourceIntervals[targetReg] == nullptr) + { + printf("here"); + } assert(sourceIntervals[targetReg] != nullptr); addResolution(block, insertionPoint, sourceIntervals[targetReg], tempReg, targetReg DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock) DEBUG_ARG(resolveTypeName[resolveType])); location[targetReg] = (regNumberSmall)tempReg; + + if (sourceIntervals[targetReg]->registerType == TYP_DOUBLE) + { + regNumber upperHalfReg = REG_NEXT(targetReg); + if (location[upperHalfReg] == REG_NA && targetRegsToDo.IsRegNumInMask(upperHalfReg) && + !targetRegsFromStack.IsRegNumInMask(upperHalfReg)) + { + targetRegMask |= genRegMask(upperHalfReg); + } + } } +#else + assert(sourceIntervals[targetReg] != nullptr); + + addResolution(block, insertionPoint, sourceIntervals[targetReg], tempReg, + targetReg DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock) + DEBUG_ARG(resolveTypeName[resolveType])); + location[targetReg] = (regNumberSmall)tempReg; +#endif // TARGET_ARM targetRegsReady |= targetRegMask; } } From 7034579e9f45b4492454ae07a791abda69ec65a0 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 23 Oct 2024 18:35:03 -0700 Subject: [PATCH 4/8] clean up --- src/coreclr/jit/lsra.cpp | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index 58ac2227feec9b..3b797a10220b38 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -9565,15 +9565,6 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, } } - bool apply_pr_107493 = true; - if (fromBlock && toBlock) - { - if ((fromBlock->bbNum == 12) && (toBlock->bbNum == 13)) - { - printf("here"); - } - } - // REGISTER to REGISTER MOVES // First, find all the ones that are ready to move now @@ -9595,7 +9586,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, Interval* interval = sourceIntervals[sourceReg]; Interval* otherTargetInterval = nullptr; regNumber otherHalfTargetReg = REG_NA; - if (apply_pr_107493 && genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg)) + if (genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg)) { otherHalfTargetReg = REG_PREV(targetReg); otherTargetInterval = sourceIntervals[otherHalfTargetReg]; @@ -9670,9 +9661,17 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, { targetRegsReady.RemoveRegNumFromMask(fromReg); } - if ((source[upperHalfReg] != REG_NA) && !targetRegsFromStack.IsRegNumInMask(upperHalfReg) && targetRegsToDo.IsRegNumInMask(upperHalfReg)) + + // Since we want to check if we can free upperHalfReg, only do it + // if lowerHalfReg is ready. + if (targetRegsReady.IsRegNumInMask(fromReg)) { - targetRegsReady.AddRegNumInMask(upperHalfReg); + if ((source[upperHalfReg] != REG_NA) && // and it is one of the target candidate + !targetRegsFromStack.IsRegNumInMask(upperHalfReg) && + targetRegsToDo.IsRegNumInMask(upperHalfReg)) + { + targetRegsReady.AddRegNumInMask(upperHalfReg); + } } } } @@ -9683,15 +9682,12 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, regNumber lowerHalfReg = REG_PREV(fromReg); regNumber lowerHalfSrcReg = (regNumber)source[lowerHalfReg]; regNumber lowerHalfSrcLoc = (regNumber)location[lowerHalfReg]; - regMaskTP lowerHalfRegMask = genRegMask(lowerHalfReg); // Necessary conditions: // - There is a source register for this reg (lowerHalfSrcReg != REG_NA) // - It is currently free (lowerHalfSrcLoc == REG_NA) // - The source interval isn't yet completed (sourceIntervals[lowerHalfSrcReg] != nullptr) - // - It's not in the ready set ((targetRegsReady & lowerHalfRegMask) == - // RBM_NONE) - // - It's not resolved from stack ((targetRegsFromStack & lowerHalfRegMask) != - // lowerHalfRegMask) + // - It's not in the ready set (!targetRegsReady.IsRegNumInMask(lowerHalfReg)) + // - It's not resolved from stack (!targetRegsFromStack.IsRegNumInMask(lowerHalfReg)) if ((lowerHalfSrcReg != REG_NA) && (lowerHalfSrcLoc == REG_NA) && (sourceIntervals[lowerHalfSrcReg] != nullptr) && !targetRegsReady.IsRegNumInMask(lowerHalfReg) && @@ -9847,7 +9843,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, #ifdef TARGET_ARM Interval* otherTargetInterval = nullptr; regNumber otherHalfTargetReg = REG_NA; - if (apply_pr_107493 && genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg)) + if (genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg)) { otherHalfTargetReg = REG_PREV(targetReg); otherTargetInterval = sourceIntervals[otherHalfTargetReg]; @@ -9870,10 +9866,6 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, } else { - if (sourceIntervals[targetReg] == nullptr) - { - printf("here"); - } assert(sourceIntervals[targetReg] != nullptr); addResolution(block, insertionPoint, sourceIntervals[targetReg], tempReg, @@ -9883,6 +9875,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, if (sourceIntervals[targetReg]->registerType == TYP_DOUBLE) { + // If source regNumber upperHalfReg = REG_NEXT(targetReg); if (location[upperHalfReg] == REG_NA && targetRegsToDo.IsRegNumInMask(upperHalfReg) && !targetRegsFromStack.IsRegNumInMask(upperHalfReg)) From f7592f198d69a90998faaf2ce3e0e16de0c8e887 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 23 Oct 2024 20:43:32 -0700 Subject: [PATCH 5/8] Introduce addOtherHalfRegToReady() to share logic --- src/coreclr/jit/lsra.cpp | 69 ++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index 3b797a10220b38..0956aba2b91674 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -9622,6 +9622,33 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, } } +#ifdef TARGET_ARM + auto addOtherHalfRegToReady = [&](regNumber otherHalfReg) { + // For a double interval, if the first half if freed up, check if the other + // half can also be freed (if it is a target for resolution). + + regNumber otherHalfSrcReg = (regNumber)source[otherHalfReg]; + regNumber otherHalfSrcLoc = (regNumber)location[otherHalfReg]; + + // Necessary conditions: + // - There is a source register for this reg (otherHalfSrcReg != REG_NA) + // - It is currently free (otherHalfSrcLoc == REG_NA) + // - The source interval isn't yet completed (sourceIntervals[otherHalfSrcReg] != nullptr) + // - It's in the TODO set (targetRegsToDo.IsRegNumInMask(otherHalfReg)) + // - It's not resolved from stack (!targetRegsFromStack.IsRegNumInMask(otherHalfReg)) + if ((otherHalfSrcReg != REG_NA) && + (otherHalfSrcLoc == REG_NA) && + (sourceIntervals[otherHalfSrcReg] != nullptr) && + targetRegsToDo.IsRegNumInMask(otherHalfReg) && + !targetRegsFromStack.IsRegNumInMask(otherHalfReg)) + { + // if this is a double interval, make sure the source is also double interval + assert(!genIsValidDoubleReg(otherHalfReg) || sourceIntervals[otherHalfSrcReg]->registerType == TYP_DOUBLE); + targetRegsReady.AddRegNumInMask(otherHalfReg); + } + }; +#endif // TARGET_ARM + // Perform reg to reg moves while (targetRegsToDo.IsNonEmpty()) { @@ -9663,41 +9690,18 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, } // Since we want to check if we can free upperHalfReg, only do it - // if lowerHalfReg is ready. + // if lowerHalfReg is ready and it is one of the target candidate. if (targetRegsReady.IsRegNumInMask(fromReg)) { - if ((source[upperHalfReg] != REG_NA) && // and it is one of the target candidate - !targetRegsFromStack.IsRegNumInMask(upperHalfReg) && - targetRegsToDo.IsRegNumInMask(upperHalfReg)) - { - targetRegsReady.AddRegNumInMask(upperHalfReg); - } + addOtherHalfRegToReady(upperHalfReg); } } } else if (genIsValidFloatReg(fromReg) && !genIsValidDoubleReg(fromReg)) - { + { // We may have freed up the other half of a double where the lower half // was already free. - regNumber lowerHalfReg = REG_PREV(fromReg); - regNumber lowerHalfSrcReg = (regNumber)source[lowerHalfReg]; - regNumber lowerHalfSrcLoc = (regNumber)location[lowerHalfReg]; - // Necessary conditions: - // - There is a source register for this reg (lowerHalfSrcReg != REG_NA) - // - It is currently free (lowerHalfSrcLoc == REG_NA) - // - The source interval isn't yet completed (sourceIntervals[lowerHalfSrcReg] != nullptr) - // - It's not in the ready set (!targetRegsReady.IsRegNumInMask(lowerHalfReg)) - // - It's not resolved from stack (!targetRegsFromStack.IsRegNumInMask(lowerHalfReg)) - if ((lowerHalfSrcReg != REG_NA) && (lowerHalfSrcLoc == REG_NA) && - (sourceIntervals[lowerHalfSrcReg] != nullptr) && - !targetRegsReady.IsRegNumInMask(lowerHalfReg) && - !targetRegsFromStack.IsRegNumInMask(lowerHalfReg)) - { - // This must be a double interval, otherwise it would be in targetRegsReady, or already - // completed. - assert(sourceIntervals[lowerHalfSrcReg]->registerType == TYP_DOUBLE); - targetRegsReady.AddRegNumInMask(lowerHalfReg); - } + addOtherHalfRegToReady(REG_PREV(fromReg)); #endif // TARGET_ARM } } @@ -9875,13 +9879,10 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, if (sourceIntervals[targetReg]->registerType == TYP_DOUBLE) { - // If source - regNumber upperHalfReg = REG_NEXT(targetReg); - if (location[upperHalfReg] == REG_NA && targetRegsToDo.IsRegNumInMask(upperHalfReg) && - !targetRegsFromStack.IsRegNumInMask(upperHalfReg)) - { - targetRegMask |= genRegMask(upperHalfReg); - } + // Free up upperHalf reg of this targetReg, if it is one of the target candidate. + + assert(genIsValidDoubleReg(targetReg)); + addOtherHalfRegToReady(REG_NEXT(targetReg)); } } #else From 6e11838bfc36399f2439a9ce176a79035a8b888e Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 23 Oct 2024 20:56:20 -0700 Subject: [PATCH 6/8] Add test case --- .../JitBlue/Runtime_105619/Runtime_105619.cs | 246 +++++++++ .../Runtime_105619/Runtime_105619.csproj | 8 + .../JitBlue/Runtime_107621/Runtime_107621.cs | 316 ++++++++++++ .../Runtime_107621/Runtime_107621.csproj | 8 + .../JitBlue/Runtime_107841/Runtime_107841.cs | 476 ++++++++++++++++++ .../Runtime_107841/Runtime_107841.csproj | 8 + 6 files changed, 1062 insertions(+) create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.csproj create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.csproj create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_107841/Runtime_107841.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_107841/Runtime_107841.csproj diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.cs b/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.cs new file mode 100644 index 00000000000000..1956903c95f156 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.cs @@ -0,0 +1,246 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Generated by Fuzzlyn v2.1 on 2024-07-28 15:37:46 +// Run on Arm Linux +// Seed: 8024459297219020330 +// Reduced from 3285.8 KiB to 12.2 KiB in 01:46:03 +// Hits JIT assert in Release: +// Assertion failed 'varDsc->IsAlwaysAliveInMemory() || ((regSet.GetMaskVars() & regMask) == 0)' in 'Program:Main(Fuzzlyn.ExecutionServer.IRuntime)' during 'Generate code' (IL size 7170; hash 0xade6b36b; FullOpts) +// +// File: /__w/1/s/src/coreclr/jit/codegencommon.cpp Line: 664 +// +using System; +using System.Runtime.CompilerServices; +using Xunit; + +public interface I1 +{ +} + +public struct S0 +{ + public double F0; + public sbyte F1; + public ulong F2; + public int F3; + public ulong F4; + public ulong F6; + public int F7; + public long F8; + public S0(double f0, ulong f2, ulong f4, float f5, ulong f6, int f7, long f8) : this() + { + } +} + +public struct S1 +{ + public int F0; + public S0 F2; + public S0 F3; + public S0 F4; + public S1(int f0, double f1, S0 f2, S0 f3, S0 f4) : this() + { + } +} + +public struct S2 : I1 +{ + public S1 F2; + public ushort F4; + public S1 F6; + public S1 F7; + public S2(sbyte f0, ulong f1, S1 f2, ushort f4, byte f5, S1 f6, S1 f7) : this() + { + } +} + +public class C0 +{ + public S1 F1; + public C0(S1 f1) + { + } +} + +public struct S3 : I1 +{ + public S3(short f0) : this() + { + } +} + +public struct S4 : I1 +{ + public S3 F0; + public S2 F1; + public S4(S3 f0, S2 f1, float f2, S0 f3, int f5) : this() + { + } +} + +public struct S5 +{ + public C0 F0; + public S5(C0 f0, S1 f3) : this() + { + } +} + +public class C1 +{ + public bool F1; +} + +public class Program +{ + public static IRuntime s_rt; + public static S2 s_13; + public static S1 s_18; + public static bool[] s_22; + public static C0 s_24; + public static ushort[, ] s_31; + public static S1 s_35; + public static bool s_37; + public static S5[] s_44; + public static S4 s_54; + public static S1 s_58; + public static C1[, ] s_59; + public static S4 s_60; + public static S2 s_88; + public static S2[] s_90; + + [Fact] + public static void TestEntryPoint() + { + try + { + CollectibleALC alc = new CollectibleALC(); + System.Reflection.Assembly asm = alc.LoadFromAssemblyPath(System.Reflection.Assembly.GetExecutingAssembly().Location); + System.Reflection.MethodInfo mi = asm.GetType(typeof(Program).FullName).GetMethod(nameof(MainInner)); + System.Type runtimeTy = asm.GetType(typeof(Runtime).FullName); + mi.Invoke(null, new object[] { System.Activator.CreateInstance(runtimeTy) }); + } catch {} + } + +// Allow reflection lookup on public method +#pragma warning disable xUnit1013 + public static void MainInner(IRuntime rt) + { + S0 vr8 = default(S0); + if (s_59[0, 0].F1) + { + bool[] vr9 = new bool[] + { + true + }; + s_88 = new S2(s_54.F1.F2.F4.F1, s_24.F1.F2.F4--, new S1(s_35.F2.F3, 0, new S0(-2, 0, 0, 0, 11218621709493063492UL, 450420498, 0), s_60.F1.F7.F2, new S0(0, 0, 0, 0, 0, 1, 0)), s_13.F4--, (byte)s_31[0, 0], new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), s_54.F1.F2); + vr9[0] = vr9[0]; + } + + s_rt.WriteLine("c_6973", vr8.F2); + s_rt.WriteLine("c_6975", vr8.F4); + s_rt.WriteLine("c_6978", vr8.F7); + I1[] vr10 = new I1[] + { + new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, -3.4028235E+38F, 0, 0, 0), new S0(0, 0, 0, 1, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 16728947367172946933UL, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), + new S3(0), + new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 2102657202, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 16794536930986757818UL, 0, 0, 0, 0, 0), new S0(0, 0, 11911619636908597430UL, 0, 0, 0, 0))), + new S3(0), + new S2(0, 0, new S1(-2147483647, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 1, 0, new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0)), new S1(1, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0))), + new S2(0, 0, new S1(0, -1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(-1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, -3.4028235E+38F, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), + new S4(new S3(0), new S2(1, 0, new S1(0, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), 1, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0) + }; + var vr11 = new S3(0); + var vr12 = s_44[0].F0.F1.F3.F0; + M75(vr11, vr12); + if (s_22[0]) + { + S3 vr13 = new S3(0); + try + { + var vr14 = s_54.F0; + var vr15 = s_18.F4.F0; + S3 vr23 = vr14; + } + finally + { + var vr16 = new S3(0); + var vr17 = s_58.F4.F0--; + M75(vr16, vr17); + if (s_37) + { + for (int vr18 = 0; vr18 < 2; vr18++) + { + var vr19 = new S3(0); + vr10[0] = new S4(new S3(0), new S2(1, 5461410436353764379UL, new S1(0, 0, new S0(0, 18446744073709551614UL, 0, 0, 17533718527758593297UL, 0, 0), new S0(0, 8592301711847430801UL, 0, 0, 0, 0, 0), new S0(-1, 7862269010569978854UL, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 3156588052453432602UL, 0, 0, 0, 810788132, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 15070356010362475091UL, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0); + vr10 = new I1[] + { + new S2(1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, -3.4028235E+38F, 0, -1, 0), new S0(0, 7703692348755595801UL, 0, 0, 0, 0, 0)), 0, 0, new S1(1, 1.7976931348623157E+308, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, -1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 3991586019811875011UL, 0, 0, 0, -2147483648, 0))), + new S4(new S3(-1), new S2(0, 9890997199408041578UL, new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, -7424873608279851173L), new S0(0, 0, 9698347484967702837UL, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 8154649548600176800L), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, -9223372036854775808L)), new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 778004003835070330UL, 0, 0, 0, 0, 0), new S0(0, 0, 8658698987098108904UL, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 956596481), + new S4(new S3(0), new S2(0, 453734974695362841UL, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, -8941433507005588199L)), 0, 1, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 10794758865549560580UL, 0, 7077610171127139841UL, 1, 0), new S0(1, 0, 0, 0, 0, 0, 0))), 0, new S0(1, 0, 0, 0, 17621340021635995622UL, 0, 0), 1), + new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), + new S2(0, 6130557987521252430UL, new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(1, 12555188232274105334UL, 0, 0, 0, 0, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 1828388993980413842UL, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 5800380996067047058UL, 0, 0))), + new S3(1) + }; + s_rt.WriteLine("c_7152", vr18); + } + + S0 vr20 = new S0(0, 0, 0, 0, 0, 0, 0); + C0 vr21 = new C0(new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))); + s_rt.WriteLine("c_7159", vr20.F6); + s_rt.WriteLine("c_7164", vr21.F1.F0); + s_rt.WriteLine("c_7168", vr21.F1.F2.F2); + s_rt.WriteLine("c_7170", vr21.F1.F2.F4); + s_rt.WriteLine("c_7173", vr21.F1.F2.F7); + s_rt.WriteLine("c_7176", vr21.F1.F3.F1); + s_rt.WriteLine("c_7177", vr21.F1.F3.F2); + s_rt.WriteLine("c_7181", vr21.F1.F3.F6); + s_rt.WriteLine("c_7185", vr21.F1.F4.F1); + s_rt.WriteLine("c_7191", vr21.F1.F4.F7); + s_rt.WriteLine("c_7192", vr21.F1.F4.F8); + } + + s_54.F1.F2.F0 = s_90[0].F6.F0++; + } + + var vr22 = new S5(new C0(new S1(0, 0, new S0(-2, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, -1, 0), new S0(0, 0, 0, 0, 0, 0, 0))), new S1(0, 0, new S0(-1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))); + } + + vr10 = new I1[] + { + new S4(new S3(-18643), new S2(0, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 11398096482162480173UL, 0, 0, 0, 9223372036854775806L), new S0(0, 0, 0, 0, 0, 2134113955, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 15971873843035984033UL, 0, 5979847448536525346UL, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 11276959574309188693UL, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0), + new S3(1), + new S3(0), + new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 1, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 11829847737932804605UL, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 9919258226402299883UL, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 1, 0), 0), + new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(-1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0))), + new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, -1, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 1, 0), 0), + new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(1, 0, 0, 0, 0, 0, 0), 0), + new S3(0), + new S3(0), + new S3(0) + }; + } +#pragma warning restore xUnit1013 + + private static void M75(S3 argThis, double arg1) + { + } +} + +public interface IRuntime +{ + void WriteLine(string site, T value); +} + +public class Runtime : IRuntime +{ + public void WriteLine(string site, T value) => System.Console.WriteLine(value); +} + +public class CollectibleALC : System.Runtime.Loader.AssemblyLoadContext +{ + public CollectibleALC() : base(true) + { + } +} \ No newline at end of file diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.csproj new file mode 100644 index 00000000000000..de6d5e08882e86 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_105619/Runtime_105619.csproj @@ -0,0 +1,8 @@ + + + True + + + + + diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.cs b/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.cs new file mode 100644 index 00000000000000..028015c05ec755 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.cs @@ -0,0 +1,316 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Generated by Fuzzlyn v2.4 on 2024-09-10 14:15:16 +// Run on Arm Linux +// Seed: 9455791714420973255 +// Reduced from 119.7 KiB to 12.1 KiB in 00:15:49 +// Hits JIT assert in Release: +// Assertion failed 'sourceIntervals[targetReg] != nullptr' in 'Program:M8(byref,S0):long' during 'LSRA allocate' (IL size 7341; hash 0x093e6d2a; FullOpts) +// +// File: /__w/1/s/src/coreclr/jit/lsra.cpp Line: 10074 +// +using System; +using Xunit; + +namespace _107621 +{ + public struct S0 + { + public bool F0; + public long F1; + public long F2; + public float F3; + public byte F5; + public sbyte F6; + public S0(long f2, float f3, double f4, sbyte f6) : this() + { + } + } + + public class C0 + { + public long F0; + public S0 F2; + public S0 F3; + public long F5; + public C0(double f1, S0 f2, S0 f3, double f4, long f5) + { + } + } + + public struct S1 + { + public bool F1; + public S0 F2; + public C0 F3; + public byte F4; + public uint F5; + public S1(S0 f2, C0 f3) : this() + { + } + + public short M10() + { + return default(short); + } + } + + public class Program + { + public static IRuntime s_rt; + public static ulong s_1; + public static C0 s_5 = new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 1), 0, 0); + public static ushort[] s_7; + public static C0 s_11 = new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0); + + [Fact] + public static void TestEntryPoint() + { + try + { + var vr12 = s_11.F2; + M8(ref s_5.F3.F3, vr12); + } catch {} + } + + private static long M8(ref float arg0, S0 arg1) + { + double var1 = default(double); + bool var8 = default(bool); + if (arg1.F0) + { + if (M9()) + { + sbyte[,,] var0 = new sbyte[,,] + { + { + { + 1 + } + } + }; + arg0 = (arg1.F1 * new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)).M10()); + new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, -1), 0, 0)).M10(); + new S1(new S0(0, 0, 0, 0), new C0(-1.7976931348623157E+308d, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)).M10(); + s_rt.WriteLine(var0[0, 0, 0]); + s_rt.WriteLine(System.BitConverter.DoubleToUInt64Bits(var1)); + byte var3 = arg1.F5++; + var vr7 = new S1[] + { + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(-1922739055833068276L, 0, 0, 1), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 1), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(-9223372036854775808L, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(9223372036854775807L, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(-9223372036854775808L, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(3366051754928502355L, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) + }; + ref float vr16 = ref vr7[0].F3.F3.F3; + vr16 = (s_1 >> s_7[0]--); + var vr8 = new S1[] + { + new S1(new S0(-7780288970767849613L, 0, 0, 127), new C0(0, new S0(-7247354589903316995L, 0, 0, 1), new S0(3332629451991572720L, 0, 0, 0), 0, 0)), + new S1(new S0(9223372036854775806L, 0, 0, 0), new C0(0, new S0(56844987229889904L, 0, 0, 0), new S0(9223372036854775806L, 3.4028235E+38f, 0, -49), 0, -2954444398035812513L)), + new S1(new S0(9223372036854775807L, 0, 0, -127), new C0(0, new S0(9223372036854775807L, 0, 0, -127), new S0(-8108349655554254125L, 0, 0, -128), 0, 0)) + }; + float vr19 = vr8[0].F3.F3.F3; + C0 var4 = new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0); + s_rt.WriteLine(var3); + s_rt.WriteLine(var4.F0); + s_rt.WriteLine(var4.F2.F0); + s_rt.WriteLine(var4.F2.F5); + s_rt.WriteLine(var4.F3.F0); + s_rt.WriteLine(var4.F3.F1); + s_rt.WriteLine(var4.F3.F2); + s_rt.WriteLine(var4.F3.F5); + s_rt.WriteLine(var4.F5); + } + + for (int var5 = 0; var5 < 2; var5++) + { + var vr5 = new S1[] + { + new S1(new S0(0, 1, 1, 0), new C0(0, new S0(0, 1, -1, 0), new S0(0, 1, -2261.3113161007714d, 1), 0, 0)), + new S1(new S0(0, 1, 0, 0), new C0(0, new S0(0, 3.4028235E+38f, -1.7976931348623157E+308d, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) + }; + } + + S1 var6 = new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, -1), 0, 0)); + s_rt.WriteLine(var6.F1); + s_rt.WriteLine(var6.F2.F0); + s_rt.WriteLine(var6.F2.F2); + s_rt.WriteLine(var6.F2.F5); + s_rt.WriteLine(var6.F2.F6); + s_rt.WriteLine(var6.F3.F0); + s_rt.WriteLine(var6.F3.F2.F0); + s_rt.WriteLine(var6.F3.F2.F2); + s_rt.WriteLine(var6.F3.F2.F5); + s_rt.WriteLine(var6.F3.F2.F6); + s_rt.WriteLine(var6.F3.F3.F0); + s_rt.WriteLine(var6.F3.F3.F5); + s_rt.WriteLine(var6.F3.F3.F6); + s_rt.WriteLine(var6.F3.F5); + s_rt.WriteLine(var6.F4); + s_rt.WriteLine(var6.F5); + } + else + { + var vr6 = new S1[] + { + new S1(new S0(0, -1, -1.7976931348623157E+308d, 0), new C0(0, new S0(0, 0, 0, 1), new S0(0, -1, 0, 0), 1, 0)), + new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 3.4028235E+38f, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 1), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 1), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) + }; + float vr22 = vr6[0].F3.F3.F3; + arg1.F5 = (byte)vr22; + C0 var7 = new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0); + var7.F3.F3--; + s_7 = new ushort[] + { + 1 + }; + sbyte[] var9 = new sbyte[] + { + 1 + }; + if (s_5.F2.F0) + { + uint[] var10 = new uint[] + { + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + }; + var vr1 = new S1[] + { + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 1), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, -1), 0, 0)) + }; + sbyte var11 = (sbyte)(var10[0] - M11(vr1)); + s_rt.WriteLine(var10[0]); + s_rt.WriteLine(var11); + } + else + { + ulong[] var12 = new ulong[] + { + 1 + }; + s_rt.WriteLine(var12[0]); + } + + if (s_5.F2.F0) + { + var vr3 = new S1[] + { + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, -1, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, -1), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 1), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) + }; + C0[] var13 = new C0[] + { + new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0), + new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0) + }; + s_rt.WriteLine(var13[0].F0); + s_rt.WriteLine(var13[0].F2.F1); + s_rt.WriteLine(var13[0].F2.F2); + s_rt.WriteLine(var13[0].F2.F5); + s_rt.WriteLine(var13[0].F2.F6); + s_rt.WriteLine(var13[0].F3.F0); + s_rt.WriteLine(var13[0].F3.F1); + s_rt.WriteLine(var13[0].F3.F2); + s_rt.WriteLine(var13[0].F3.F5); + s_rt.WriteLine(var13[0].F3.F6); + s_rt.WriteLine(var13[0].F5); + } + else + { + return arg1.F2++; + } + + var7.F3.F3 = var7.F2.F3--; + float var14 = arg1.F3; + s_rt.WriteLine(System.BitConverter.SingleToUInt32Bits(var14)); + s_rt.WriteLine(var8); + var vr9 = new S1[] + { + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 1), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 1), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) + }; + var vr10 = new S1[] + { + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 1, 1), new C0(0, new S0(0, 0, 0, 0), new S0(0, 0, 0, 0), 0, 0)) + }; + s_rt.WriteLine(var7.F0); + s_rt.WriteLine(var7.F2.F0); + s_rt.WriteLine(var7.F2.F1); + s_rt.WriteLine(var7.F2.F2); + s_rt.WriteLine(var7.F2.F5); + s_rt.WriteLine(var7.F2.F6); + s_rt.WriteLine(var7.F3.F0); + s_rt.WriteLine(var7.F3.F1); + s_rt.WriteLine(var7.F3.F5); + s_rt.WriteLine(var7.F3.F6); + s_rt.WriteLine(var7.F5); + } + + for (int var15 = 0; var15 < 1; var15++) + { + var vr2 = new S1[] + { + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 0, -1.7976931348623157E+308d, 0), new S0(0, 0, 0, 0), 0, 0)), + new S1(new S0(0, 0, 0, 0), new C0(0, new S0(0, 3.4028235E+38f, 0, 0), new S0(0, 0, 0, 0), 0, 0)) + }; + } + + return 0; + } + + private static bool M9() + { + return default(bool); + } + + private static ref float M11(S1[] arg0) + { + return ref arg0[0].F3.F3.F3; + } + } + + public interface IRuntime + { + void WriteLine(T value); + } + + public class Runtime : IRuntime + { + public void WriteLine(T value) => System.Console.WriteLine(value); + } +} \ No newline at end of file diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.csproj new file mode 100644 index 00000000000000..de6d5e08882e86 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_107621/Runtime_107621.csproj @@ -0,0 +1,8 @@ + + + True + + + + + diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_107841/Runtime_107841.cs b/src/tests/JIT/Regression/JitBlue/Runtime_107841/Runtime_107841.cs new file mode 100644 index 00000000000000..0fb022df0638c7 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_107841/Runtime_107841.cs @@ -0,0 +1,476 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// +// +//'varDsc->IsAlwaysAliveInMemory() || ((regSet.GetMaskVars() & regMask) == 0)' in '_107841.Program:M137(_107841.C1,byref)' + +using System; +using Xunit; + +namespace _107841 +{ + public interface I0 + { + } + + public interface I1 + { + } + + public class C0 : I1 + { + public ushort F0; + public double F1; + public uint F3; + public ulong F4; + public bool F5; + public bool F6; + public uint F7; + public C0(double f1, double f2, float f8) + { + } + } + + public struct S0 + { + public bool F0; + public ulong F1; + public C0 F2; + public bool F3; + public int F4; + public long F5; + public C0 F6; + public uint F7; + public sbyte F8; + public int F9; + public S0(C0 f2, bool f3, C0 f6, int f9) : this() + { + } + } + + public class C1 : I1 + { + public short F0; + public int F2; + public sbyte F3; + public int F4; + public ushort F5; + public sbyte F6; + public short F7; + public C1(float f1) + { + } + } + + public struct S1 : I1 + { + public long F1; + public S0 F2; + public float F3; + public S1(float f0, long f1, S0 f2, float f3) : this() + { + } + } + + public class Program + { + public static IRuntime s_rt; + public static C0[] s_2; + public static S1 s_4; + public static double[][][][] s_7; + public static I0 s_8; + public static short[][] s_9; + public static S0[,] s_17; + public static float[] s_26; + public static C1[] s_29; + public static bool s_33; + public static S0 s_42; + public static I0 s_43; + public static S1 s_48; + public static S1[] s_59; + public static S0[,,] s_66; + public static S1 s_68; + public static S1 s_71; + public static S0 s_78; + public static I0 s_85; + public static I0 s_95; + public static S0 s_101; + public static I0 s_107; + public static I0 s_111; + public static I0[] s_112; + public static S1[,,][,][][] s_113; + public static S1 s_120; + public static S0 s_127; + public static C1 s_128; + public static S0 s_135; + public static C0 s_141; + public static ulong s_143; + public static S1 s_149; + + [Fact] + public static void TestEntryPoint() + { + try + { + CollectibleALC alc = new CollectibleALC(); + System.Reflection.Assembly asm = alc.LoadFromAssemblyPath(System.Reflection.Assembly.GetExecutingAssembly().Location); + System.Reflection.MethodInfo mi = asm.GetType(typeof(Program).FullName).GetMethod(nameof(MainInner)); + System.Type runtimeTy = asm.GetType(typeof(Runtime).FullName); + mi.Invoke(null, new object[] { System.Activator.CreateInstance(runtimeTy) }); + } catch {} + } + + private static void MainInner(IRuntime rt) + { + var vr54 = new C1(0); + M137(vr54, ref s_26); + } + + private static bool M140(C0 argThis, S1[,] arg0, double arg1, ref double[][] arg2) + { + return default(bool); + } + + private static C0 M143() + { + return default(C0); + } + + private static S1[,] M144() + { + return default(S1[,]); + } + + private static S0 M142(S0 argThis, ref S0 arg0, S1 arg1, S1 arg2, ref I0 arg3, ref ulong arg4) + { + return default(S0); + } + + private static void M137(C1 argThis, ref float[] arg1) + { + double[] var0 = default(double[]); + S0 var14 = default(S0); + C1 var20 = default(C1); + bool[][] var28 = default(bool[][]); + byte var31 = default(byte); + byte[] var35 = default(byte[]); + S1 var36 = default(S1); + long var37 = default(long); + if (s_17[0, 0].F3) + { + if (s_113[0, 0, 0][0, 0][0][0].F2.F2.F5) + { + if (s_78.F2.F6) + { + s_48.F3 = arg1[0]--; + return; + } + else + { + s_68.F2 = new S0(new C0(0, 0, 3.4028235E+38f), true, new C0(0, 0, 0), 0); + } + + var vr3 = s_4.F2.F2; + var vr26 = new S1[,] + { + { + new S1(0, 0, new S0(new C0(1.7976931348623157E+308d, 0, 0), false, new C0(0, 0, 0), 0), 0) + }, + { + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 3.4028235E+38f), 0), 0) + }, + { + new S1(0, 0, new S0(new C0(0, 0, -3.4028235E+38f), false, new C0(0, 0, 0), 0), 0) + }, + { + new S1(0, 0, new S0(new C0(0, 1, 0), false, new C0(0, 0, -3.4028235E+38f), 0), 3.4028235E+38f) + }, + { + new S1(0, 0, new S0(new C0(1, 1, 0), true, new C0(0, 1, 0), 0), 0) + } + }; + var vr33 = var0[0]++; + bool vr44 = M140(vr3, vr26, vr33, ref s_7[0][0]); + } + + C0 var9 = new C0(0, 0, 0); + s_rt.WriteLine("c_5143", 0); + s_rt.WriteLine("c_5144", var9.F0); + s_rt.WriteLine("c_5147", var9.F3); + s_rt.WriteLine("c_5148", var9.F4); + s_rt.WriteLine("c_5149", var9.F5); + s_rt.WriteLine("c_5150", var9.F6); + s_rt.WriteLine("c_5151", var9.F7); + for (int var11 = 0; var11 < 2; var11++) + { + var vr13 = new S0(new C0(0, -1.7976931348623157E+308d, 0), false, new C0(0, 1, 0), 0); + var vr15 = new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0); + var vr24 = s_113[0, 0, 0][0, 0][0][0]; + M142(vr13, ref s_48.F2, vr15, vr24, ref s_111, ref s_2[0].F4); + } + + int var12 = 0; + s_rt.WriteLine("c_5162", var12); + var vr6 = s_17[0, 0]; + M142(vr6, ref s_66[0, 0, 0], new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0), s_71, ref s_8, ref s_42.F6.F4); + } + else + { + var vr4 = new C0(1.7976931348623157E+308d, 1, 0); + C0 vr56 = default(C0); + var vr7 = new S1[,] + { + { + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0), + new S1(0, 0, new S0(new C0(-1.7976931348623157E+308d, 0, 0), true, new C0(0, 0, -3.4028235E+38f), 0), 0), + new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0) + }, + { + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0), + new S1(0, 0, new S0(new C0(0, 0, 3.4028235E+38f), false, new C0(0, 0, 0), 0), 0), + new S1(3.4028235E+38f, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0) + } + }; + var vr16 = s_68.F2.F6.F1; + M140(vr56, vr7, vr16, ref s_7[0][0]); + s_rt.WriteLine("c_5174", var14.F0); + s_rt.WriteLine("c_5175", var14.F1); + s_rt.WriteLine("c_5176", var14.F2.F0); + s_rt.WriteLine("c_5179", var14.F2.F3); + s_rt.WriteLine("c_5180", var14.F2.F4); + s_rt.WriteLine("c_5181", var14.F2.F5); + s_rt.WriteLine("c_5183", var14.F2.F7); + s_rt.WriteLine("c_5195", var14.F6.F7); + s_rt.WriteLine("c_5199", var14.F9); + } + + argThis.F6 = (sbyte)s_78.F5--; + var vr21 = new C0(0, 0, 0); + var vr28 = new S1[,] + { + { + new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0), + new S1(0, 0, new S0(new C0(1.7976931348623157E+308d, 0, 0), true, new C0(0, 0, 0), 0), 0), + new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0), + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0) + } + }; + C0 vr64 = default(C0); + C0 vr65 = vr21; + bool vr69 = default(bool); + var vr5 = new S0(new C0(0, 0, 3.4028235E+38f), vr69, vr64, argThis.F2); + var vr32 = new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0); + if (M141(argThis)) + { + var vr17 = new S1[,] + { + { + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 3.4028235E+38f), 0), 0), + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(1.7976931348623157E+308d, 0, 0), 0), 0), + new S1(-3.4028235E+38f, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0), + new S1(0, 0, new S0(new C0(0, 1.7976931348623157E+308d, 0), true, new C0(0, 0, 0), 0), 0), + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), -3.4028235E+38f), + new S1(-3.4028235E+38f, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0) + } + }; + if (s_33) + { + I1[] var18 = new I1[] + { + new C0(0, 0, 0), + new C1(0), + new C1(3.4028235E+38f), + new C0(0, 0, 0), + new C1(3.4028235E+38f), + new S1(0, -8736734971933627417L, new S0(new C0(1.7976931348623157E+308d, 0, 0), false, new C0(0, 0, 0), 523515085), -3.4028235E+38f), + new C0(0, 0, 0), + new C1(-3.4028235E+38f), + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 1), 0) + }; + } + else + { + var vr12 = new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0); + var vr34 = new S1(0, 0, new S0(new C0(1.7976931348623157E+308d, 0, 0), true, new C0(0, 0, 0), 0), 0); + var vr8 = M142(vr12, ref s_113[0, 0, 0][0, 0][0][0].F2, vr34, new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0), ref s_43, ref s_68.F2.F6.F4); + var vr20 = new S0(new C0(0, 0, 3.4028235E+38f), true, new C0(0, 0, 0), 0); + var vr40 = new C1(0); + var vr42 = new S0(new C0(0, 0, -3.4028235E+38f), true, new C0(0, 0, 0), 0); + try + { + s_9 = s_9; + } + finally + { + s_rt.WriteLine("c_5201", var20.F0); + s_rt.WriteLine("c_5203", var20.F2); + s_rt.WriteLine("c_5204", var20.F3); + s_rt.WriteLine("c_5205", var20.F4); + s_rt.WriteLine("c_5206", var20.F5); + s_rt.WriteLine("c_5208", var20.F7); + } + + S0 var21 = s_59[0].F2; + var21.F2.F0 = s_48.F2.F6.F0++; + s_rt.WriteLine("c_5210", var21.F0); + s_rt.WriteLine("c_5211", var21.F1); + s_rt.WriteLine("c_5216", var21.F2.F4); + s_rt.WriteLine("c_5217", var21.F2.F5); + s_rt.WriteLine("c_5218", var21.F2.F6); + s_rt.WriteLine("c_5219", var21.F2.F7); + s_rt.WriteLine("c_5221", var21.F3); + s_rt.WriteLine("c_5223", var21.F5); + s_rt.WriteLine("c_5229", var21.F6.F5); + s_rt.WriteLine("c_5230", var21.F6.F6); + s_rt.WriteLine("c_5233", var21.F7); + s_rt.WriteLine("c_5234", var21.F8); + } + + s_7[0][0][0][0] = var0[0]--; + var vr38 = new S0(new C0(0, 1.7976931348623157E+308d, 0), true, new C0(0, 0, 0), 0); + var vr39 = s_59[0]; + var vr35 = M142(vr38, ref s_101, new S1(0, -7153361952214254310L, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0), vr39, ref s_85, ref s_17[0, 0].F1); + M142(vr35, ref s_66[0, 0, 0], new S1(0, -7210483454585770996L, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 1), 0), new S1(0, 2810699383726706373L, new S0(new C0(0, 0, 0), true, new C0(0, 1.7976931348623157E+308d, 0), 2147483646), 0), ref s_111, ref s_68.F2.F1); + I1[,] var23 = new I1[,] + { + { + new C1(0), + new C0(0, 0, 0), + new S1(-3.4028235E+38f, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 3.4028235E+38f), 0), 3.4028235E+38f), + new C0(0, 0, 0), + new C0(0, 0, 0), + new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0), + new C0(0, 0, 0), + new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 3.4028235E+38f), 0), 0), + new C1(0), + new C1(0) + }, + { + new C1(3.4028235E+38f), + new C0(0, 0, 0), + new C1(0), + new C0(0, 0, 0), + new C0(0, 0, 0), + new C1(0), + new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0), + new C1(3.4028235E+38f), + new C0(0, 0, 0), + new C0(0, 0, 0) + } + }; + } + + C1 var25 = s_128; + C1 var26 = new C1(0); + M142(s_42, ref s_135, new S1(0, 725286118131275146L, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0), new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0), ref s_112[0], ref s_17[0, 0].F1); + var vr41 = new S0(new C0(0, 0, 0), true, new C0(0, 0, 3.4028235E+38f), 0); + bool vr0 = s_120.F2.F6.F4-- < var0[0]; + var vr10 = new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0); + var vr30 = new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0), 0); + M142(vr10, ref s_101, vr30, new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 1, 3.4028235E+38f), 0), 0), ref s_95, ref s_141.F4); + s_rt.WriteLine("c_5240", var28[0][0]); + var vr45 = s_29[0]; + var vr46 = new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0); + if (M141(vr45)) + { + var vr19 = new S0(new C0(0, 0, 3.4028235E+38f), true, new C0(0, 0, 0), 0); + s_rt.WriteLine("c_5243", var31); + var vr23 = new S0(new C0(0, 0, 0), true, new C0(0, 0, 0), 0); + } + + C1 var32 = new C1(0); + byte[] var34 = new byte[] + { + 1 + }; + s_rt.WriteLine("c_5406", var35[0]); + var vr47 = s_149.F2.F2.F3++; + s_rt.WriteLine("c_5409", var36.F2.F0); + s_rt.WriteLine("c_5411", var36.F2.F2.F0); + s_rt.WriteLine("c_5414", var36.F2.F2.F3); + s_rt.WriteLine("c_5415", var36.F2.F2.F4); + s_rt.WriteLine("c_5416", var36.F2.F2.F5); + s_rt.WriteLine("c_5417", var36.F2.F2.F6); + s_rt.WriteLine("c_5420", var36.F2.F3); + s_rt.WriteLine("c_5422", var36.F2.F5); + s_rt.WriteLine("c_5426", var36.F2.F6.F3); + s_rt.WriteLine("c_5427", var36.F2.F6.F4); + s_rt.WriteLine("c_5430", var36.F2.F6.F7); + s_rt.WriteLine("c_5432", var36.F2.F7); + s_rt.WriteLine("c_5433", var36.F2.F8); + s_rt.WriteLine("c_5434", var36.F2.F9); + s_rt.WriteLine("c_5435", System.BitConverter.SingleToUInt32Bits(var36.F3)); + var vr48 = s_149.F2; + M142(vr48, ref s_149.F2, s_71, new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, -3.4028235E+38f), 0), 0), ref s_85, ref s_149.F2.F6.F4); + s_rt.WriteLine("c_5437", s_149.F1); + s_rt.WriteLine("c_5438", s_149.F2.F0); + s_rt.WriteLine("c_5439", s_149.F2.F1); + s_rt.WriteLine("c_5444", s_149.F2.F2.F4); + s_rt.WriteLine("c_5449", s_149.F2.F3); + s_rt.WriteLine("c_5450", s_149.F2.F4); + s_rt.WriteLine("c_5452", s_149.F2.F6.F0); + s_rt.WriteLine("c_5455", s_149.F2.F6.F3); + s_rt.WriteLine("c_5456", s_149.F2.F6.F4); + s_rt.WriteLine("c_5457", s_149.F2.F6.F5); + s_rt.WriteLine("c_5459", s_149.F2.F6.F7); + s_rt.WriteLine("c_5461", s_149.F2.F7); + s_rt.WriteLine("c_5462", s_149.F2.F8); + s_rt.WriteLine("c_5465", var34[0]); + s_rt.WriteLine("c_5466", var37); + s_rt.WriteLine("c_5468", var25.F0); + s_rt.WriteLine("c_5470", var25.F2); + s_rt.WriteLine("c_5471", var25.F3); + s_rt.WriteLine("c_5472", var25.F4); + s_rt.WriteLine("c_5473", var25.F5); + s_rt.WriteLine("c_5478", var26.F2); + s_rt.WriteLine("c_5479", var26.F3); + s_rt.WriteLine("c_5480", var26.F4); + s_rt.WriteLine("c_5481", var26.F5); + s_rt.WriteLine("c_5482", var26.F6); + s_rt.WriteLine("c_5483", var26.F7); + s_rt.WriteLine("c_5486", var32.F2); + s_rt.WriteLine("c_5488", var32.F4); + var vr49 = new S1(0, 0, new S0(new C0(0, 0, 0), true, new C0(0, 0, -3.4028235E+38f), 0), -3.4028235E+38f); + for (int var39 = 0; var39 < -1; var39++) + { + var vr9 = M143(); + var vr29 = M144(); + if (M140(vr9, vr29, 0, ref s_7[0][0])) + { + var vr27 = s_120.F2; + var vr36 = s_59[0]; + S0 vr57 = vr27; + S0 vr58 = s_127; + S1 vr59 = vr36; + S0 vr63 = default(S0); + var vr37 = s_59[0]; + var vr14 = M142(vr63, ref s_101, new S1(-3.4028235E+38f, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), 0), vr37, ref s_85, ref s_68.F2.F1); + var vr43 = new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 0), -3.4028235E+38f); + M142(vr14, ref s_127, vr43, new S1(0, 0, new S0(new C0(0, 0, 0), false, new C0(0, 0, 0), 1), 3.4028235E+38f), ref s_107, ref s_143); + } + } + } + + private static bool M141(C1 argThis) + { + return default(bool); + } + } + + public interface IRuntime + { + void WriteLine(string site, T value); + } + + public class Runtime : IRuntime + { + public void WriteLine(string site, T value) => System.Console.WriteLine(value); + } + + public class CollectibleALC : System.Runtime.Loader.AssemblyLoadContext + { + public CollectibleALC() : base(true) + { + } + } +} \ No newline at end of file diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_107841/Runtime_107841.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_107841/Runtime_107841.csproj new file mode 100644 index 00000000000000..de6d5e08882e86 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_107841/Runtime_107841.csproj @@ -0,0 +1,8 @@ + + + True + + + + + From 6d105e2c5782f02eb3aa59135188c96155bcea47 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 23 Oct 2024 20:58:09 -0700 Subject: [PATCH 7/8] jit format --- src/coreclr/jit/lsra.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index 0956aba2b91674..a9c5f0f5575f41 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -9636,10 +9636,8 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, // - The source interval isn't yet completed (sourceIntervals[otherHalfSrcReg] != nullptr) // - It's in the TODO set (targetRegsToDo.IsRegNumInMask(otherHalfReg)) // - It's not resolved from stack (!targetRegsFromStack.IsRegNumInMask(otherHalfReg)) - if ((otherHalfSrcReg != REG_NA) && - (otherHalfSrcLoc == REG_NA) && - (sourceIntervals[otherHalfSrcReg] != nullptr) && - targetRegsToDo.IsRegNumInMask(otherHalfReg) && + if ((otherHalfSrcReg != REG_NA) && (otherHalfSrcLoc == REG_NA) && + (sourceIntervals[otherHalfSrcReg] != nullptr) && targetRegsToDo.IsRegNumInMask(otherHalfReg) && !targetRegsFromStack.IsRegNumInMask(otherHalfReg)) { // if this is a double interval, make sure the source is also double interval @@ -9698,7 +9696,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, } } else if (genIsValidFloatReg(fromReg) && !genIsValidDoubleReg(fromReg)) - { + { // We may have freed up the other half of a double where the lower half // was already free. addOtherHalfRegToReady(REG_PREV(fromReg)); From 7004e02fbfa4eb0980260fe24ba07eb1c2ce8b70 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 25 Oct 2024 14:11:52 -0700 Subject: [PATCH 8/8] remove the assert that is no longer valid --- src/coreclr/jit/lsra.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index d41de7c41e58be..bd2571f8649099 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -9631,8 +9631,6 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, (sourceIntervals[otherHalfSrcReg] != nullptr) && targetRegsToDo.IsRegNumInMask(otherHalfReg) && !targetRegsFromStack.IsRegNumInMask(otherHalfReg)) { - // if this is a double interval, make sure the source is also double interval - assert(!genIsValidDoubleReg(otherHalfReg) || sourceIntervals[otherHalfSrcReg]->registerType == TYP_DOUBLE); targetRegsReady.AddRegNumInMask(otherHalfReg); } };