diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 8ba61fe3a1121c..a73fb77b6bae7d 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -30360,8 +30360,11 @@ GenTree* Compiler::gtFoldExprHWIntrinsic(GenTreeHWIntrinsic* tree) #endif // !TARGET_XARCH && !TARGET_ARM64 DEBUG_DESTROY_NODE(op, tree); - INDEBUG(vectorNode->gtDebugFlags |= GTF_DEBUG_NODE_MORPHED); + if (fgGlobalMorph) + { + INDEBUG(vectorNode->gtDebugFlags |= GTF_DEBUG_NODE_MORPHED); + } return vectorNode; } } diff --git a/src/coreclr/jit/lowerxarch.cpp b/src/coreclr/jit/lowerxarch.cpp index 8b199a898d4419..3f441215e37123 100644 --- a/src/coreclr/jit/lowerxarch.cpp +++ b/src/coreclr/jit/lowerxarch.cpp @@ -1570,6 +1570,21 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node) op2->SetUnusedValue(); } + // Since we have a double negation, it's possible that gtNext + // is op1 or user. If it is op1, then it's also possible the + // subsequent gtNext is user. We need to make sure to skip both + // in such a scenario since we're removing them. + + if (nextNode == op1) + { + nextNode = nextNode->gtNext; + } + + if (nextNode == user) + { + nextNode = nextNode->gtNext; + } + BlockRange().Remove(op3); BlockRange().Remove(op1); BlockRange().Remove(user); diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105255/Runtime_105255.cs b/src/tests/JIT/Regression/JitBlue/Runtime_105255/Runtime_105255.cs new file mode 100644 index 00000000000000..bee31e60b12003 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_105255/Runtime_105255.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.Runtime.CompilerServices; +using System.Runtime.Intrinsics; +using Xunit; + +#nullable disable + +public class Runtime_105255_A +{ + private static Vector512 s_v512_uint_62 = Vector512.Zero; + + private void Method0() + { + s_v512_uint_62 = Vector512.LessThan(s_v512_uint_62, Vector512.Zero); + try + { + } + finally + { + for (int i = 0; i < 1; i++) ; + } + } + + [Fact] + public static void TestEntryPoint() => new Runtime_105255_A().Method0(); + + /* + Assert failure(PID 5828 [0x000016c4], Thread: 6044 [0x179c]): Assertion failed '((tree->gtDebugFlags & GTF_DEBUG_NODE_MORPHED) == 0) && "ERROR: Already morphed this node!"' in 'TestClass:Method0():this' during 'Morph - Global' (IL size 22846; hash 0x46e9aa75; Tier0-FullOpts) + File: D:\a\_work\1\s\src\coreclr\jit\morph.cpp:12227 + Image: C:\h\w\A715090A\p\CoreRoot\corerun.exe + + Assertion failed '((tree->gtDebugFlags & GTF_DEBUG_NODE_MORPHED) == 0) && "ERROR: Already morphed this node!"' during 'Morph - Global' + */ +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_105255/Runtime_105255.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_105255/Runtime_105255.csproj new file mode 100644 index 00000000000000..de6d5e08882e86 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_105255/Runtime_105255.csproj @@ -0,0 +1,8 @@ + + + True + + + + +