From fc50d7808435d73f5808fd2b99c3c3a8f6aba4c7 Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Mon, 28 Jul 2025 23:17:03 -0700 Subject: [PATCH 1/2] Don't do an invalid mask conversion optimization for conditional select nodes --- src/coreclr/jit/gentree.cpp | 16 --------- src/coreclr/jit/gentree.h | 29 ----------------- src/coreclr/jit/optimizemaskconversions.cpp | 36 ++------------------- 3 files changed, 3 insertions(+), 78 deletions(-) diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index f2679395740b8f..2c7835bd936928 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -28441,22 +28441,6 @@ bool GenTree::OperIsConvertVectorToMask() const return false; } -//------------------------------------------------------------------------ -// OperIsVectorConditionalSelect: Is this a vector ConditionalSelect hwintrinsic -// -// Return Value: -// true if the node is a vector ConditionalSelect hwintrinsic -// otherwise; false -// -bool GenTree::OperIsVectorConditionalSelect() const -{ - if (OperIsHWIntrinsic()) - { - return AsHWIntrinsic()->OperIsVectorConditionalSelect(); - } - return false; -} - //------------------------------------------------------------------------ // OperIsVectorFusedMultiplyOp: Is this a vector FusedMultiplyOp hwintrinsic // diff --git a/src/coreclr/jit/gentree.h b/src/coreclr/jit/gentree.h index c618e5b84d1027..3165af8eb1ced7 100644 --- a/src/coreclr/jit/gentree.h +++ b/src/coreclr/jit/gentree.h @@ -1715,7 +1715,6 @@ struct GenTree bool OperIsHWIntrinsic(NamedIntrinsic intrinsicId) const; bool OperIsConvertMaskToVector() const; bool OperIsConvertVectorToMask() const; - bool OperIsVectorConditionalSelect() const; bool OperIsVectorFusedMultiplyOp() const; // This is here for cleaner GT_LONG #ifdefs. @@ -6540,34 +6539,6 @@ struct GenTreeHWIntrinsic : public GenTreeJitIntrinsic #endif } - bool OperIsVectorConditionalSelect() const - { - switch (GetHWIntrinsicId()) - { -#if defined(TARGET_XARCH) - case NI_Vector128_ConditionalSelect: - case NI_Vector256_ConditionalSelect: - case NI_Vector512_ConditionalSelect: - { - return true; - } -#endif // TARGET_XARCH - -#if defined(TARGET_ARM64) - case NI_AdvSimd_BitwiseSelect: - case NI_Sve_ConditionalSelect: - { - return true; - } -#endif // TARGET_ARM64 - - default: - { - return false; - } - } - } - bool OperIsVectorFusedMultiplyOp() const { switch (GetHWIntrinsicId()) diff --git a/src/coreclr/jit/optimizemaskconversions.cpp b/src/coreclr/jit/optimizemaskconversions.cpp index b328e884637e79..7396469770acae 100644 --- a/src/coreclr/jit/optimizemaskconversions.cpp +++ b/src/coreclr/jit/optimizemaskconversions.cpp @@ -175,37 +175,11 @@ class MaskConversionsCheckVisitor final : public GenTreeVisitorOperIsHWIntrinsic()) + if ((user != nullptr) && user->OperIsConvertVectorToMask()) { - GenTreeHWIntrinsic* hwintrin = user->AsHWIntrinsic(); - NamedIntrinsic ni = hwintrin->GetHWIntrinsicId(); - - if (hwintrin->OperIsConvertVectorToMask()) - { - convertOp = user->AsHWIntrinsic(); - hasConversion = true; - } - else if (hwintrin->OperIsVectorConditionalSelect()) - { - // We don't actually have a convert here, but we do have a case where - // the mask is being used in a ConditionalSelect and therefore can be - // consumed directly as a mask. While the IR shows TYP_SIMD, it gets - // handled in lowering as part of the general embedded-mask support. - - // We notably don't check that op2 supported embedded masking directly - // because we can still consume the mask directly in such cases. We'll just - // emit `vblendmps zmm1 {k1}, zmm2, zmm3` instead of containing the CndSel - // as part of something like `vaddps zmm1 {k1}, zmm2, zmm3` - - if (hwintrin->Op(1) == lclOp) - { - convertOp = user->AsHWIntrinsic(); - hasConversion = true; - } - } + convertOp = user->AsHWIntrinsic(); + hasConversion = true; } break; } @@ -402,7 +376,6 @@ class MaskConversionsUpdateVisitor final : public GenTreeVisitorData() = lclOp->Data()->AsHWIntrinsic()->Op(1); } - else if (isLocalStore && addConversion) { // Convert @@ -416,7 +389,6 @@ class MaskConversionsUpdateVisitor final : public GenTreeVisitorData() = m_compiler->gtNewSimdCvtVectorToMaskNode(TYP_MASK, lclOp->Data(), weight->simdBaseJitType, weight->simdSize); } - else if (isLocalUse && removeConversion) { // Convert @@ -426,7 +398,6 @@ class MaskConversionsUpdateVisitor final : public GenTreeVisitor Date: Tue, 29 Jul 2025 16:04:04 +0200 Subject: [PATCH 2/2] Add test --- .../JitBlue/Runtime_118143/Runtime_118143.cs | 36 +++++++++++++++++++ .../Runtime_118143/Runtime_118143.csproj | 13 +++++++ 2 files changed, 49 insertions(+) create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_118143/Runtime_118143.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_118143/Runtime_118143.csproj diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_118143/Runtime_118143.cs b/src/tests/JIT/Regression/JitBlue/Runtime_118143/Runtime_118143.cs new file mode 100644 index 00000000000000..4a4f7281937f60 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_118143/Runtime_118143.cs @@ -0,0 +1,36 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Buffers.Text; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading; +using Xunit; + +public class Runtime_118143 +{ + [Fact] + public static void TestEntryPoint() + { + for (int i = 0; i < 300; i++) + { + RunBase64Test(); + Thread.Sleep(1); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void RunBase64Test() + { + byte[] input = new byte[64]; + byte[] output = new byte[Base64.GetMaxEncodedToUtf8Length(input.Length)]; + byte[] expected = Convert.FromHexString( + "5957466859574668595746685957466859574668595746685957466859574668595746685957466859574668" + + "5957466859574668595746685957466859574668595746685957466859574668595746685957466859513D3D"); + input.AsSpan().Fill((byte)'a'); + Base64.EncodeToUtf8(input, output, out _, out _); + if (!output.SequenceEqual(expected)) + throw new InvalidOperationException("Invalid Base64 output"); + } +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_118143/Runtime_118143.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_118143/Runtime_118143.csproj new file mode 100644 index 00000000000000..39f03c7a329d59 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_118143/Runtime_118143.csproj @@ -0,0 +1,13 @@ + + + True + + true + + + + + + + +