Skip to content

Commit

Permalink
Ensure we don't reuse temps when calling fgMorphArgs on LIR nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
tannergooding committed Jul 25, 2024
1 parent 7cac50f commit 61664ed
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 3 deletions.
14 changes: 11 additions & 3 deletions src/coreclr/jit/rationalize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ void Rationalizer::RewriteNodeAsCall(GenTree** use,
}
}

CORINFO_ARG_LIST_HANDLE sigArg = sig->args;
size_t firstArg = 0;
CORINFO_ARG_LIST_HANDLE sigArg = sig->args;
size_t firstArg = 0;
bool hasStructArg = false;

if (sig->hasThis())
{
Expand Down Expand Up @@ -117,7 +118,8 @@ void Rationalizer::RewriteNodeAsCall(GenTree** use,
unreached();
#endif // FEATURE_HW_INTRINSICS
}
arg = NewCallArg::Struct(operand, sigTyp, clsHnd);
arg = NewCallArg::Struct(operand, sigTyp, clsHnd);
hasStructArg = true;
}
else
{
Expand Down Expand Up @@ -150,6 +152,12 @@ void Rationalizer::RewriteNodeAsCall(GenTree** use,
call->gtType = TYP_VOID;
}

// We need to ensure we don't use any of the available outgoing arg temps
// as those were valid from a different scope. We do want to restore them
// back to what they were after we're done here. This is expected to be
// a rare scenario in the first place, so the allocation/copy isn't a big
// concern, but we still don't want to do it unnecessarily

call = comp->fgMorphArgs(call);

GenTree* result = call;
Expand Down
45 changes: 45 additions & 0 deletions src/tests/JIT/Regression/JitBlue/Runtime_105468/Runtime_105468.cs
Original file line number Diff line number Diff line change
@@ -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<ushort>(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<ushort> arg1, Vector256<ushort> arg3)
{
Assert.Equal(Vector256<ushort>.Zero, arg1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Optimize>True</Optimize>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildProjectName).cs" />
</ItemGroup>
</Project>

0 comments on commit 61664ed

Please sign in to comment.