From f5b90198460fe6fbee9247166b789793a3a58a23 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Thu, 25 Jul 2024 12:27:33 -0700 Subject: [PATCH] Ensure we don't reuse temps when calling fgMorphArgs on LIR nodes --- src/coreclr/jit/morph.cpp | 4 +- .../JitBlue/Runtime_105468/Runtime_105468.cs | 45 +++++++++++++++++++ .../Runtime_105468/Runtime_105468.csproj | 8 ++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.csproj diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index 0d922459acdc4..74389eca4143f 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -3283,8 +3283,8 @@ void Compiler::fgMakeOutgoingStructArgCopy(GenTreeCall* call, CallArg* arg) bool found = false; // Attempt to find a local we have already used for an outgoing struct and reuse it. - // We do not reuse within a statement. - if (!opts.MinOpts()) + // We do not reuse within a statement and we don't reuse if we're in LIR + if (!opts.MinOpts() && (fgOrder == FGOrderTree)) { found = ForEachHbvBitSet(*fgAvailableOutgoingArgTemps, [&](indexType lclNum) { LclVarDsc* varDsc = lvaGetDesc((unsigned)lclNum); diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.cs b/src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.cs new file mode 100644 index 0000000000000..c6498096c371e --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.cs @@ -0,0 +1,45 @@ +// Generated by Fuzzlyn v1.7 on 2024-07-25 11:40:55 +// Run on X64 Windows +// Seed: 418121815423725559-vectort,vector128,vector256,x86aes,x86avx,x86avx2,x86bmi1,x86bmi1x64,x86bmi2,x86bmi2x64,x86fma,x86lzcnt,x86lzcntx64,x86pclmulqdq,x86popcnt,x86popcntx64,x86sse,x86ssex64,x86sse2,x86sse2x64,x86sse3,x86sse41,x86sse41x64,x86sse42,x86sse42x64,x86ssse3,x86x86base +// Reduced from 72.7 KiB to 1.0 KiB in 00:01:55 +// Debug: Outputs <0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0> +// Release: Outputs <1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1> +using System; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.X86; +using Xunit; + +[module: SkipLocalsInit] + +public struct S3 +{ + public byte F0; +} + +public class Runtime_105468 +{ + public static S3 s_3; + + [Fact] + public static void TestEntryPoint() + { + if (Avx2.IsSupported) + { + var vr15 = (ushort)0; + var vr16 = Vector256.CreateScalar(vr15); + var vr17 = Vector256.Create(1); + var vr18 = (ushort)0; + var vr19 = Vector256.CreateScalar(vr18); + var vr20 = s_3.F0; + var vr21 = Avx2.AlignRight(vr17, vr19, vr20); + M6(vr16, vr21); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void M6(Vector256 arg1, Vector256 arg3) + { + Assert.Equal(Vector256.Zero, arg1); + } +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.csproj new file mode 100644 index 0000000000000..de6d5e08882e8 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.csproj @@ -0,0 +1,8 @@ + + + True + + + + +