diff --git a/src/coreclr/jit/optcse.cpp b/src/coreclr/jit/optcse.cpp index f633a5e3272bb5..0d67ffd7a956a5 100644 --- a/src/coreclr/jit/optcse.cpp +++ b/src/coreclr/jit/optcse.cpp @@ -536,7 +536,15 @@ unsigned Compiler::optValnumCSE_Index(GenTree* tree, Statement* stmt) // than the one from its op2. For this case we want to create two different // CSE candidates. This allows us to CSE the GT_COMMA separately from its value. // - if (tree->OperGet() == GT_COMMA) + // Even this exception has an exception: for struct typed GT_COMMAs we + // cannot allow the comma and op2 to be separate candidates as, if we + // decide to CSE both the comma and its op2, then creating the store with + // the comma will sink it into the op2, potentially breaking the op2 CSE + // definition if it itself is another comma. This restriction is related to + // the fact that we do not have af first class representation for struct + // temporaries in our IR. + // + if (tree->OperIs(GT_COMMA) && !varTypeIsStruct(tree)) { // op2 is the value produced by a GT_COMMA GenTree* op2 = tree->AsOp()->gtOp2; @@ -588,7 +596,7 @@ unsigned Compiler::optValnumCSE_Index(GenTree* tree, Statement* stmt) key = vnLibNorm; } } - else // Not a GT_COMMA or a GT_CNS_INT + else // Not a primitive GT_COMMA or a GT_CNS_INT { key = vnLibNorm; } diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_106380/Runtime_106380.cs b/src/tests/JIT/Regression/JitBlue/Runtime_106380/Runtime_106380.cs new file mode 100644 index 00000000000000..5853038fc1df6c --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_106380/Runtime_106380.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Found by Antigen +// Reduced from 24.98 KB to 779 B. +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; +using Xunit; + +public class Runtime_106380 +{ + static Vector64 s_v64_uint_23 = Vector64.AllBitsSet; + Vector64 v64_uint_74 = Vector64.Create((uint)2, 2); + private void Method0() + { + unchecked + { + AdvSimd.MaxPairwise(v64_uint_74 += Vector64.ConditionalSelect(Vector64.Zero, s_v64_uint_23, s_v64_uint_23) & v64_uint_74, v64_uint_74 += (s_v64_uint_23 ^ v64_uint_74)& (s_v64_uint_23 = v64_uint_74)); + return; + } + } + [Fact] + public static void TestEntryPoint() + { + if (AdvSimd.IsSupported) + { + new Runtime_106380().Method0(); + } + } +} + +/* +Environment: + +set DOTNET_TieredCompilation=0 + +Assert failure(PID 13404 [0x0000345c], Thread: 5136 [0x1410]): Assertion failed 'type != TYP_VOID' in 'TestClass:Method0():this' during 'Optimize Valnum CSEs' (IL size 111; hash 0x46e9aa75; FullOpts) + File: C:\wk\runtime\src\coreclr\jit\gentree.cpp:8388 + Image: C:\aman\Core_Root\corerun.exe +*/ diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_106380/Runtime_106380.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_106380/Runtime_106380.csproj new file mode 100644 index 00000000000000..15edd99711a1a4 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_106380/Runtime_106380.csproj @@ -0,0 +1,8 @@ + + + True + + + + + \ No newline at end of file