diff --git a/eng/pipelines/coreclr/jitstress-isas-sve.yml b/eng/pipelines/coreclr/jitstress-isas-sve.yml index ec27ba55c3ed0..c5aca49e62322 100644 --- a/eng/pipelines/coreclr/jitstress-isas-sve.yml +++ b/eng/pipelines/coreclr/jitstress-isas-sve.yml @@ -8,12 +8,15 @@ pr: - main paths: include: + - src/coreclr/jit/codegenarmarch.cpp + - src/coreclr/jit/emitarm64sve.cpp + - src/coreclr/jit/emitfmtsarm64sve.h + - src/coreclr/jit/hwintrinsicarm64.cpp - src/coreclr/jit/hwintrinsiccodegenarm64.cpp - src/coreclr/jit/hwintrinsiclistarm64sve.h - - src/coreclr/jit/hwintrinsicarm64.cpp - src/coreclr/jit/instrsarm64sve.h - - src/coreclr/jit/emitarm64sve.cpp - - src/coreclr/jit/emitfmtsarm64sve.h + - src/coreclr/jit/lowerarmarch.cpp + - src/coreclr/jit/lsraarmarch.cpp - src/coreclr/jit/lsraarm64.cpp schedules: diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index 290acc1df639e..19c790d84eb26 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -4050,7 +4050,7 @@ GenTree* Lowering::LowerHWIntrinsicCndSel(GenTreeHWIntrinsic* cndSelNode) GenTree* nestedOp2 = nestedCndSel->Op(2); GenTree* nestedOp3 = nestedCndSel->Op(3); - JITDUMP("lowering ConditionalSelect HWIntrinisic (before):\n"); + JITDUMP("lowering nested ConditionalSelect HWIntrinisic (before):\n"); DISPTREERANGE(BlockRange(), cndSelNode); JITDUMP("\n"); @@ -4072,13 +4072,55 @@ GenTree* Lowering::LowerHWIntrinsicCndSel(GenTreeHWIntrinsic* cndSelNode) BlockRange().Remove(nestedOp1); BlockRange().Remove(nestedCndSel); - JITDUMP("lowering ConditionalSelect HWIntrinisic (after):\n"); + JITDUMP("lowering nested ConditionalSelect HWIntrinisic (after):\n"); DISPTREERANGE(BlockRange(), cndSelNode); JITDUMP("\n"); return cndSelNode; } } + else if (op1->IsMaskAllBitsSet()) + { + // Any case where op2 is not an embedded HWIntrinsic + if (!op2->OperIsHWIntrinsic() || + !HWIntrinsicInfo::IsEmbeddedMaskedOperation(op2->AsHWIntrinsic()->GetHWIntrinsicId())) + { + JITDUMP("lowering ConditionalSelect HWIntrinisic (before):\n"); + DISPTREERANGE(BlockRange(), cndSelNode); + JITDUMP("\n"); + + // Transform + // CndSel(AllTrue, op2, op3) to + // op2 + + LIR::Use use; + if (BlockRange().TryGetUse(cndSelNode, &use)) + { + use.ReplaceWith(op2); + } + else + { + op2->SetUnusedValue(); + } + + if (op3->IsMaskZero()) + { + BlockRange().Remove(op3); + } + else + { + op3->SetUnusedValue(); + } + op1->SetUnusedValue(); + BlockRange().Remove(cndSelNode); + + JITDUMP("lowering ConditionalSelect HWIntrinisic (after):\n"); + DISPTREERANGE(BlockRange(), op2); + JITDUMP("\n"); + + return op2; + } + } ContainCheckHWIntrinsic(cndSelNode); return cndSelNode->gtNext; diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105719/Runtime_105719.cs b/src/tests/JIT/Regression/JitBlue/Runtime_105719/Runtime_105719.cs new file mode 100644 index 0000000000000..c8eff043c9bda --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_105719/Runtime_105719.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Xunit; +using System; +using System.Runtime.CompilerServices; +using System.Numerics; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; + +public class Runtime_105723 +{ + [Fact] + public static void TestEntryPoint() + { + if (Sve.IsSupported) + { + var vr3 = Sve.CreateTrueMaskInt32(); + var vr4 = Vector.Create(1); + var vr5 = Vector128.CreateScalar(0).AsVector(); + Vector vr6 = Sve.ConditionalSelect(vr3, vr4, vr5); + Consume(vr6); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void Consume(Vector v) + { + ; + } +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105719/Runtime_105719.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_105719/Runtime_105719.csproj new file mode 100644 index 0000000000000..bb40d49ed6824 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_105719/Runtime_105719.csproj @@ -0,0 +1,9 @@ + + + True + $(NoWarn);SYSLIB5003 + + + + +