From d9115a37d5b46d44967bb696fac68d0c6caab8b1 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 4 Apr 2025 10:27:45 -0700 Subject: [PATCH 1/3] Remove CreateFalse node during lowering, if MaskToVector is getting deleted --- src/coreclr/jit/lowerarmarch.cpp | 15 ++++++++ .../JitBlue/Runtime_113338/Runtime_113338.cs | 35 +++++++++++++++++++ .../Runtime_113338/Runtime_113338.csproj | 8 +++++ 3 files changed, 58 insertions(+) create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index 019e1115f9bb13..81dae7ca7c7fc0 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -4160,6 +4160,14 @@ GenTree* Lowering::LowerHWIntrinsicCndSel(GenTreeHWIntrinsic* cndSelNode) cndSelNode->Op(2) = nestedCndSel->Op(2); if (nestedOp3->IsMaskZero()) { + if (nestedOp3->OperIsConvertMaskToVector()) + { + GenTree* zeroMask = nestedOp3->AsHWIntrinsic()->Op(1); + NamedIntrinsic zeroMaskId = zeroMask->AsHWIntrinsic()->GetHWIntrinsicId(); + assert((zeroMaskId >= NI_Sve_CreateFalseMaskByte) && + (zeroMaskId <= NI_Sve_CreateFalseMaskUInt64)); + BlockRange().Remove(zeroMask); + } BlockRange().Remove(nestedOp3); } else @@ -4204,6 +4212,13 @@ GenTree* Lowering::LowerHWIntrinsicCndSel(GenTreeHWIntrinsic* cndSelNode) if (op3->IsMaskZero()) { + if (op3->OperIsConvertMaskToVector()) + { + GenTree* zeroMask = op3->AsHWIntrinsic()->Op(1); + NamedIntrinsic zeroMaskId = zeroMask->AsHWIntrinsic()->GetHWIntrinsicId(); + assert((zeroMaskId >= NI_Sve_CreateFalseMaskByte) && (zeroMaskId <= NI_Sve_CreateFalseMaskUInt64)); + BlockRange().Remove(zeroMask); + } BlockRange().Remove(op3); } else diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.cs b/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.cs new file mode 100644 index 00000000000000..2fd72b1e4c9ed6 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.cs @@ -0,0 +1,35 @@ +// 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.5 on 2025-03-30 17:25:31 +// Run on Arm64 Windows +// Seed: 6164687101299398040-vectort,vector64,vector128,armadvsimd,armadvsimdarm64,armaes,armarmbase,armarmbasearm64,armcrc32,armcrc32arm64,armdp,armrdm,armrdmarm64,armsha1,armsha256,armsve +// Reduced from 35.7 KiB to 0.7 KiB in 00:00:46 +// Hits JIT assert in Release: +// Assertion failed 'node->IsUnusedValue() && "found an unmarked unused value"' in 'Program:Main(Fuzzlyn.ExecutionServer.IRuntime)' during 'Lowering nodeinfo' (IL size 95; hash 0xade6b36b; FullOpts) +// +// File: D:\a\_work\1\s\src\coreclr\jit\lir.cpp Line: 1706 +// +using System; +using System.Numerics; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; + +public class Program +{ + public static uint s_1; + public static void Main() + { + var vr7 = Sve.CreateTrueMaskInt32(); + var vr8 = Vector.Create(0); + var vr9 = Sve.CreateFalseMaskInt32(); + var vr10 = Sve.ConditionalSelect(vr7, vr8, vr9); + var vr11 = Vector128.CreateScalar(12616752854119074364UL).AsVector(); + var vr12 = (int)Sve.SaturatingIncrementByActiveElementCount(0, vr11); + var vr13 = Vector128.CreateScalar(vr12).AsVector(); + if (Sve.TestLastTrue(vr10, vr13)) + { + System.Console.WriteLine(s_1); + } + } +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj new file mode 100644 index 00000000000000..15edd99711a1a4 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj @@ -0,0 +1,8 @@ + + + True + + + + + \ No newline at end of file From 3c488958bddc375744751ed7a1402546082f311b Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 4 Apr 2025 11:58:31 -0700 Subject: [PATCH 2/3] fix SVE.experimental warning --- .../JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj index 15edd99711a1a4..4dd44717ecaee7 100644 --- a/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj +++ b/src/tests/JIT/Regression/JitBlue/Runtime_113338/Runtime_113338.csproj @@ -1,6 +1,8 @@ True + + $(NoWarn);SYSLIB5003 From df3d5bf17bfb841e9def950cc40c72e9ba54d68d Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 7 Apr 2025 09:28:54 -0700 Subject: [PATCH 3/3] review feedback --- src/coreclr/jit/lowerarmarch.cpp | 33 ++------------------------------ 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index 81dae7ca7c7fc0..47fbb10db498cb 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -4158,22 +4158,7 @@ GenTree* Lowering::LowerHWIntrinsicCndSel(GenTreeHWIntrinsic* cndSelNode) // CndSel(mask, embedded(trueValOp2), op3) // cndSelNode->Op(2) = nestedCndSel->Op(2); - if (nestedOp3->IsMaskZero()) - { - if (nestedOp3->OperIsConvertMaskToVector()) - { - GenTree* zeroMask = nestedOp3->AsHWIntrinsic()->Op(1); - NamedIntrinsic zeroMaskId = zeroMask->AsHWIntrinsic()->GetHWIntrinsicId(); - assert((zeroMaskId >= NI_Sve_CreateFalseMaskByte) && - (zeroMaskId <= NI_Sve_CreateFalseMaskUInt64)); - BlockRange().Remove(zeroMask); - } - BlockRange().Remove(nestedOp3); - } - else - { - nestedOp3->SetUnusedValue(); - } + nestedOp3->SetUnusedValue(); BlockRange().Remove(nestedOp1); BlockRange().Remove(nestedCndSel); @@ -4210,21 +4195,7 @@ GenTree* Lowering::LowerHWIntrinsicCndSel(GenTreeHWIntrinsic* cndSelNode) op2->SetUnusedValue(); } - if (op3->IsMaskZero()) - { - if (op3->OperIsConvertMaskToVector()) - { - GenTree* zeroMask = op3->AsHWIntrinsic()->Op(1); - NamedIntrinsic zeroMaskId = zeroMask->AsHWIntrinsic()->GetHWIntrinsicId(); - assert((zeroMaskId >= NI_Sve_CreateFalseMaskByte) && (zeroMaskId <= NI_Sve_CreateFalseMaskUInt64)); - BlockRange().Remove(zeroMask); - } - BlockRange().Remove(op3); - } - else - { - op3->SetUnusedValue(); - } + op3->SetUnusedValue(); op1->SetUnusedValue(); GenTree* next = cndSelNode->gtNext;