From bbc523d9caa69028e3465ca6c8a756041e4a564b Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Tue, 29 Aug 2023 16:11:10 +0200 Subject: [PATCH 1/3] JIT: Fix illegal IR created by GetElement/ToScalar lowering These could create TYP_ULONG/TYP_UINT indirs/LCL_FLD nodes, which are illegal. Fix #91174 --- src/coreclr/jit/lowerxarch.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/coreclr/jit/lowerxarch.cpp b/src/coreclr/jit/lowerxarch.cpp index 00143839a440d7..d1c3e317d83b87 100644 --- a/src/coreclr/jit/lowerxarch.cpp +++ b/src/coreclr/jit/lowerxarch.cpp @@ -3754,17 +3754,14 @@ GenTree* Lowering::LowerHWIntrinsicGetElement(GenTreeHWIntrinsic* node) // We want to optimize GetElement down to an Indir where possible as // this unlocks additional containment opportunities for various nodes - var_types newType; - GenTree* newBase; - GenTree* newIndex; - uint32_t newScale; - int32_t newOffset; + GenTree* newBase; + GenTree* newIndex; + uint32_t newScale; + int32_t newOffset; GenTreeIndir* indir = op1->AsIndir(); GenTree* addr = indir->Addr(); - newType = simdBaseType; - if (addr->OperIsAddrMode()) { // We have an existing addressing mode, so we want to try and @@ -3860,7 +3857,8 @@ GenTree* Lowering::LowerHWIntrinsicGetElement(GenTreeHWIntrinsic* node) new (comp, GT_LEA) GenTreeAddrMode(addr->TypeGet(), newBase, newIndex, newScale, newOffset); BlockRange().InsertBefore(node, newAddr); - GenTreeIndir* newIndir = comp->gtNewIndir(newType, newAddr, (indir->gtFlags & GTF_IND_FLAGS)); + GenTreeIndir* newIndir = + comp->gtNewIndir(JITtype2varType(simdBaseJitType), newAddr, (indir->gtFlags & GTF_IND_FLAGS)); BlockRange().InsertBefore(node, newIndir); LIR::Use use; @@ -3911,8 +3909,8 @@ GenTree* Lowering::LowerHWIntrinsicGetElement(GenTreeHWIntrinsic* node) if (lclDsc->lvDoNotEnregister && (lclOffs <= 0xFFFF) && ((lclOffs + elemSize) <= lclDsc->lvExactSize())) { - GenTree* lclFld = - comp->gtNewLclFldNode(lclVar->GetLclNum(), simdBaseType, static_cast(lclOffs)); + GenTree* lclFld = comp->gtNewLclFldNode(lclVar->GetLclNum(), JITtype2varType(simdBaseJitType), + static_cast(lclOffs)); BlockRange().InsertBefore(node, lclFld); LIR::Use use; @@ -5327,7 +5325,8 @@ GenTree* Lowering::LowerHWIntrinsicToScalar(GenTreeHWIntrinsic* node) GenTreeIndir* indir = op1->AsIndir(); - GenTreeIndir* newIndir = comp->gtNewIndir(simdBaseType, indir->Addr(), (indir->gtFlags & GTF_IND_FLAGS)); + GenTreeIndir* newIndir = + comp->gtNewIndir(JITtype2varType(simdBaseJitType), indir->Addr(), (indir->gtFlags & GTF_IND_FLAGS)); BlockRange().InsertBefore(node, newIndir); LIR::Use use; @@ -5359,7 +5358,8 @@ GenTree* Lowering::LowerHWIntrinsicToScalar(GenTreeHWIntrinsic* node) if (lclDsc->lvDoNotEnregister && (lclOffs <= 0xFFFF) && ((lclOffs + elemSize) <= lclDsc->lvExactSize())) { - GenTree* lclFld = comp->gtNewLclFldNode(lclVar->GetLclNum(), simdBaseType, lclVar->GetLclOffs()); + GenTree* lclFld = + comp->gtNewLclFldNode(lclVar->GetLclNum(), JITtype2varType(simdBaseJitType), lclVar->GetLclOffs()); BlockRange().InsertBefore(node, lclFld); LIR::Use use; From cac1da3e15583febdca076923eb2260a02660c65 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Tue, 29 Aug 2023 16:18:14 +0200 Subject: [PATCH 2/3] Add test --- .../JitBlue/Runtime_91174/Runtime_91174.cs | 30 +++++++++++++++++++ .../Runtime_91174/Runtime_91174.csproj | 8 +++++ 2 files changed, 38 insertions(+) create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.csproj diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs b/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs new file mode 100644 index 00000000000000..9d9fc4ec64d558 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs @@ -0,0 +1,30 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license.aa + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; +using Xunit; + +public class Runtime_91174 +{ + [MethodImpl(MethodImplOptions.NoInlining)] + public static int Foo(ref Vector256 v1, ref Vector256 v2) + { + if (Vector256.ToScalar(v1) < Vector256.ToScalar(v2)) + { + Console.WriteLine("FAIL"); + return 101; + } + + return 100; + } + + [Fact] + public static int TestEntryPoint() + { + Vector256 v1 = Vector256.Create(20); + Vector256 v2 = Vector256.Create(10); + return Foo(ref v1, ref v2); + } +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.csproj new file mode 100644 index 00000000000000..de6d5e08882e86 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.csproj @@ -0,0 +1,8 @@ + + + True + + + + + From 3ef0dfc3a562d4e3779032da2cdd14b693ca17b3 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 11 Sep 2023 15:39:40 +0200 Subject: [PATCH 3/3] Fix license header in new test --- src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs b/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs index 9d9fc4ec64d558..3ae45f998542b4 100644 --- a/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs +++ b/src/tests/JIT/Regression/JitBlue/Runtime_91174/Runtime_91174.cs @@ -1,5 +1,5 @@ // Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license.aa +// The .NET Foundation licenses this file to you under the MIT license. using System; using System.Runtime.CompilerServices;