From 34bfc048bf24d74b2ade9382ec1b2addab45b844 Mon Sep 17 00:00:00 2001 From: Andy Ayers Date: Fri, 10 Jun 2022 12:56:36 -0700 Subject: [PATCH 1/2] JIT: relax fwd sub restriction on changing class handle For HW SIMD types, at least. Fixes #64879. --- src/coreclr/jit/forwardsub.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/coreclr/jit/forwardsub.cpp b/src/coreclr/jit/forwardsub.cpp index 4c3fae5f1d9f9..8fee053c5e19a 100644 --- a/src/coreclr/jit/forwardsub.cpp +++ b/src/coreclr/jit/forwardsub.cpp @@ -504,12 +504,6 @@ bool Compiler::fgForwardSubStatement(Statement* stmt) return false; } - if (gtGetStructHandleIfPresent(fwdSubNode) != gtGetStructHandleIfPresent(lhsNode)) - { - JITDUMP(" would change struct handle (assignment)\n"); - return false; - } - // If lhs is mulit-reg, rhs must be too. // if (lhsNode->IsMultiRegNode() && !fwdSubNode->IsMultiRegNode()) @@ -667,10 +661,23 @@ bool Compiler::fgForwardSubStatement(Statement* stmt) // // We may sometimes lose or change a type handle. Avoid substituting if so. // - if (gtGetStructHandleIfPresent(fwdSubNode) != gtGetStructHandleIfPresent(fsv.GetNode())) + // However, we allow free substitution of hardware SIMD types. + // + CORINFO_CLASS_HANDLE fwdHnd = gtGetStructHandleIfPresent(fwdSubNode); + CORINFO_CLASS_HANDLE useHnd = gtGetStructHandleIfPresent(fsv.GetNode()); + if (fwdHnd != useHnd) { - JITDUMP(" would change struct handle (substitution)\n"); - return false; + if ((fwdHnd == NO_CLASS_HANDLE) || (useHnd == NO_CLASS_HANDLE)) + { + JITDUMP(" would add/remove struct handle (substitution)\n"); + return false; + } + + if (!isHWSIMDClass(fwdHnd) || !isHWSIMDClass(useHnd)) + { + JITDUMP(" would change struct handle (substitution)\n"); + return false; + } } #ifdef FEATURE_SIMD From 4826a7f5874d4f7c8067aaa965b99eddde02548a Mon Sep 17 00:00:00 2001 From: Andy Ayers Date: Fri, 10 Jun 2022 13:53:07 -0700 Subject: [PATCH 2/2] fix build issue --- src/coreclr/jit/forwardsub.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/coreclr/jit/forwardsub.cpp b/src/coreclr/jit/forwardsub.cpp index 8fee053c5e19a..4da3c62323f23 100644 --- a/src/coreclr/jit/forwardsub.cpp +++ b/src/coreclr/jit/forwardsub.cpp @@ -673,7 +673,13 @@ bool Compiler::fgForwardSubStatement(Statement* stmt) return false; } - if (!isHWSIMDClass(fwdHnd) || !isHWSIMDClass(useHnd)) +#ifdef FEATURE_SIMD + const bool bothHWSIMD = isHWSIMDClass(fwdHnd) && isHWSIMDClass(useHnd); +#else + const bool bothHWSIMD = false; +#endif + + if (!bothHWSIMD) { JITDUMP(" would change struct handle (substitution)\n"); return false;