From 3ced9681d9eda35cee4c580066ecb3c10a569a1f Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 3 Feb 2023 11:50:38 -0800 Subject: [PATCH] Update the assert to correctly check if a tree with value has non-zero destination registers (#81412) * Fix the assert * add test cases * Remove the unused node * Revert "Remove the unused node" This reverts commit 32a8c9c598925133592cb2093cda95c989cc278b. * fix the test case * fix the arm64 and arm cases too --- src/coreclr/jit/lsraarm.cpp | 2 +- src/coreclr/jit/lsraarm64.cpp | 2 +- src/coreclr/jit/lsraxarch.cpp | 2 +- .../JitBlue/Runtime_81356/Runtime_81356.cs | 17 +++++++++++++++++ .../JitBlue/Runtime_81356/Runtime_81356.csproj | 9 +++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_81356/Runtime_81356.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_81356/Runtime_81356.csproj diff --git a/src/coreclr/jit/lsraarm.cpp b/src/coreclr/jit/lsraarm.cpp index 47cdbaa753907..e360567871a7d 100644 --- a/src/coreclr/jit/lsraarm.cpp +++ b/src/coreclr/jit/lsraarm.cpp @@ -796,7 +796,7 @@ int LinearScan::BuildNode(GenTree* tree) // We need to be sure that we've set srcCount and dstCount appropriately assert((dstCount < 2) || tree->IsMultiRegNode()); assert(isLocalDefUse == (tree->IsValue() && tree->IsUnusedValue())); - assert(!tree->IsUnusedValue() || (dstCount != 0)); + assert(!tree->IsValue() || (dstCount != 0)); assert(dstCount == tree->GetRegisterDstCount(compiler)); return srcCount; } diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index f8e5e2fec3548..025d4f537b1bd 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -785,7 +785,7 @@ int LinearScan::BuildNode(GenTree* tree) // We need to be sure that we've set srcCount and dstCount appropriately assert((dstCount < 2) || tree->IsMultiRegNode()); assert(isLocalDefUse == (tree->IsValue() && tree->IsUnusedValue())); - assert(!tree->IsUnusedValue() || (dstCount != 0)); + assert(!tree->IsValue() || (dstCount != 0)); assert(dstCount == tree->GetRegisterDstCount(compiler)); return srcCount; } diff --git a/src/coreclr/jit/lsraxarch.cpp b/src/coreclr/jit/lsraxarch.cpp index c0fd6030c2880..524bbc8577e96 100644 --- a/src/coreclr/jit/lsraxarch.cpp +++ b/src/coreclr/jit/lsraxarch.cpp @@ -682,7 +682,7 @@ int LinearScan::BuildNode(GenTree* tree) // Not that for XARCH, the maximum number of registers defined is 2. assert((dstCount < 2) || ((dstCount == 2) && tree->IsMultiRegNode())); assert(isLocalDefUse == (tree->IsValue() && tree->IsUnusedValue())); - assert(!tree->IsUnusedValue() || (dstCount != 0)); + assert(!tree->IsValue() || (dstCount != 0)); assert(dstCount == tree->GetRegisterDstCount(compiler)); return srcCount; } diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_81356/Runtime_81356.cs b/src/tests/JIT/Regression/JitBlue/Runtime_81356/Runtime_81356.cs new file mode 100644 index 0000000000000..9018ebb333d2d --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_81356/Runtime_81356.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +public class Runtime_81356 +{ + public static byte[] s_130; + public static int Main() + { + try + { + ulong vr5 = default(ulong); + byte vr4 = (byte)(((byte)vr5 & 0) * s_130[0]); + } + catch { } + return 100; + } +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_81356/Runtime_81356.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_81356/Runtime_81356.csproj new file mode 100644 index 0000000000000..57efc33a1f4c4 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_81356/Runtime_81356.csproj @@ -0,0 +1,9 @@ + + + Exe + False + + + + +