From 711921030462a9a6a7133ac0aa7d96f66a86d341 Mon Sep 17 00:00:00 2001 From: TIHan Date: Thu, 20 Jun 2024 17:51:41 -0700 Subject: [PATCH] Initial work to enable valenum for TYP_MASK on ARM64 --- src/coreclr/jit/assertionprop.cpp | 5 +-- src/coreclr/jit/gentree.h | 20 +++++++----- src/coreclr/jit/simd.h | 12 ++++--- src/coreclr/jit/valuenum.cpp | 52 ++++++++++++++----------------- src/coreclr/jit/valuenum.h | 27 ++++++++++------ 5 files changed, 65 insertions(+), 51 deletions(-) diff --git a/src/coreclr/jit/assertionprop.cpp b/src/coreclr/jit/assertionprop.cpp index 3cfcabcf2f7b9a..d8ea1ff92779b4 100644 --- a/src/coreclr/jit/assertionprop.cpp +++ b/src/coreclr/jit/assertionprop.cpp @@ -2996,7 +2996,8 @@ GenTree* Compiler::optVNBasedFoldConstExpr(BasicBlock* block, GenTree* parent, G break; } break; - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { simdmask_t value = vnStore->ConstantValue(vnCns); @@ -3008,7 +3009,7 @@ GenTree* Compiler::optVNBasedFoldConstExpr(BasicBlock* block, GenTree* parent, G break; } break; -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD case TYP_BYREF: diff --git a/src/coreclr/jit/gentree.h b/src/coreclr/jit/gentree.h index 849c70db78e76d..a047f2c5994de5 100644 --- a/src/coreclr/jit/gentree.h +++ b/src/coreclr/jit/gentree.h @@ -6659,9 +6659,12 @@ struct GenTreeVecCon : public GenTree #if defined(TARGET_XARCH) simd32_t gtSimd32Val; simd64_t gtSimd64Val; - simdmask_t gtSimdMaskVal; #endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) + simdmask_t gtSimdMaskVal; +#endif // TARGET_XARCH || TARGET_ARM64 + simd_t gtSimdVal; }; @@ -7083,12 +7086,13 @@ struct GenTreeVecCon : public GenTree { return gtSimd64Val.IsAllBitsSet(); } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { return gtSimdMaskVal.IsAllBitsSet(); } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD default: @@ -7137,12 +7141,13 @@ struct GenTreeVecCon : public GenTree { return left->gtSimd64Val == right->gtSimd64Val; } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { return left->gtSimdMaskVal == right->gtSimdMaskVal; } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD default: @@ -7186,12 +7191,13 @@ struct GenTreeVecCon : public GenTree { return gtSimd64Val.IsZero(); } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { return gtSimdMaskVal.IsZero(); } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD default: diff --git a/src/coreclr/jit/simd.h b/src/coreclr/jit/simd.h index 8364861cf09d4e..fa7e1ed72c71ee 100644 --- a/src/coreclr/jit/simd.h +++ b/src/coreclr/jit/simd.h @@ -293,6 +293,12 @@ struct simd64_t }; static_assert_no_msg(sizeof(simd64_t) == 64); +typedef simd64_t simd_t; +#else +typedef simd16_t simd_t; +#endif + +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) struct simdmask_t { union @@ -342,11 +348,7 @@ struct simdmask_t } }; static_assert_no_msg(sizeof(simdmask_t) == 8); - -typedef simd64_t simd_t; -#else -typedef simd16_t simd_t; -#endif +#endif // TARGET_XARCH || TARGET_ARM64 template TBase EvaluateUnaryScalarSpecialized(genTreeOps oper, TBase arg0) diff --git a/src/coreclr/jit/valuenum.cpp b/src/coreclr/jit/valuenum.cpp index 17b45702776c80..8e8e3ca38bfa8f 100644 --- a/src/coreclr/jit/valuenum.cpp +++ b/src/coreclr/jit/valuenum.cpp @@ -1711,13 +1711,14 @@ ValueNumStore::Chunk::Chunk(CompAllocator alloc, ValueNum* pNextBaseVN, var_type m_defs = new (alloc) Alloc::Type[ChunkSize]; break; } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { m_defs = new (alloc) Alloc::Type[ChunkSize]; break; } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD default: @@ -1881,12 +1882,13 @@ ValueNum ValueNumStore::VNForSimd64Con(const simd64_t& cnsVal) { return VnForConst(cnsVal, GetSimd64CnsMap(), TYP_SIMD64); } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) ValueNum ValueNumStore::VNForSimdMaskCon(const simdmask_t& cnsVal) { return VnForConst(cnsVal, GetSimdMaskCnsMap(), TYP_MASK); } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD ValueNum ValueNumStore::VNForGenericCon(var_types typ, uint8_t* cnsVal) @@ -1987,12 +1989,14 @@ ValueNum ValueNumStore::VNForGenericCon(var_types typ, uint8_t* cnsVal) READ_VALUE(simd64_t); return VNForSimd64Con(val); } +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { READ_VALUE(simdmask_t); return VNForSimdMaskCon(val); } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD default: unreached(); @@ -2106,12 +2110,15 @@ ValueNum ValueNumStore::VNZeroForType(var_types typ) { return VNForSimd64Con(simd64_t::Zero()); } +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { return VNForSimdMaskCon(simdmask_t::Zero()); } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 + #endif // FEATURE_SIMD // These should be unreached. @@ -2201,12 +2208,13 @@ ValueNum ValueNumStore::VNAllBitsForType(var_types typ) { return VNForSimd64Con(simd64_t::AllBitsSet()); } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { return VNForSimdMaskCon(simdmask_t::AllBitsSet()); } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD default: @@ -2318,11 +2326,6 @@ ValueNum ValueNumStore::VNBroadcastForSimdType(var_types simdType, var_types sim simd64_t result = BroadcastConstantToSimd(this, simdBaseType, valVN); return VNForSimd64Con(result); } - - case TYP_MASK: - { - unreached(); - } #endif // TARGET_XARCH default: @@ -2390,11 +2393,6 @@ bool ValueNumStore::VNIsVectorNaN(var_types simdType, var_types simdBaseType, Va memcpy(&vector, &tmp, genTypeSize(simdType)); break; } - - case TYP_MASK: - { - unreached(); - } #endif // TARGET_XARCH default: @@ -2461,11 +2459,6 @@ bool ValueNumStore::VNIsVectorNegativeZero(var_types simdType, var_types simdBas memcpy(&vector, &tmp, genTypeSize(simdType)); break; } - - case TYP_MASK: - { - unreached(); - } #endif // TARGET_XARCH default: @@ -3925,7 +3918,8 @@ simd64_t ValueNumStore::GetConstantSimd64(ValueNum argVN) return ConstantValue(argVN); } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) // Given a simdmask constant value number return its value as a simdmask. // simdmask_t ValueNumStore::GetConstantSimdMask(ValueNum argVN) @@ -3935,7 +3929,7 @@ simdmask_t ValueNumStore::GetConstantSimdMask(ValueNum argVN) return ConstantValue(argVN); } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD // Compute the proper value number when the VNFunc has all constant arguments @@ -9486,14 +9480,15 @@ void ValueNumStore::vnDump(Compiler* comp, ValueNum vn, bool isPtr) cnsVal.u64[6], cnsVal.u64[7]); break; } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { simdmask_t cnsVal = GetConstantSimdMask(vn); printf("SimdMaskCns[0x%08x, 0x%08x]", cnsVal.u32[0], cnsVal.u32[1]); break; } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD // These should be unreached. @@ -10934,7 +10929,8 @@ void Compiler::fgValueNumberTreeConst(GenTree* tree) tree->gtVNPair.SetBoth(vnStore->VNForSimd64Con(simd64Val)); break; } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) case TYP_MASK: { simdmask_t simdmaskVal; diff --git a/src/coreclr/jit/valuenum.h b/src/coreclr/jit/valuenum.h index 4df32b8096acd6..d5b21f98295b4a 100644 --- a/src/coreclr/jit/valuenum.h +++ b/src/coreclr/jit/valuenum.h @@ -369,8 +369,10 @@ class ValueNumStore #if defined(TARGET_XARCH) simd32_t GetConstantSimd32(ValueNum argVN); simd64_t GetConstantSimd64(ValueNum argVN); - simdmask_t GetConstantSimdMask(ValueNum argVN); #endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) + simdmask_t GetConstantSimdMask(ValueNum argVN); +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD private: @@ -453,8 +455,10 @@ class ValueNumStore #if defined(TARGET_XARCH) ValueNum VNForSimd32Con(const simd32_t& cnsVal); ValueNum VNForSimd64Con(const simd64_t& cnsVal); - ValueNum VNForSimdMaskCon(const simdmask_t& cnsVal); #endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) + ValueNum VNForSimdMaskCon(const simdmask_t& cnsVal); +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD ValueNum VNForGenericCon(var_types typ, uint8_t* cnsVal); @@ -1779,7 +1783,8 @@ class ValueNumStore } return m_simd64CnsMap; } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) struct SimdMaskPrimitiveKeyFuncs : public JitKeyFuncsDefEquals { static bool Equals(const simdmask_t& x, const simdmask_t& y) @@ -1808,7 +1813,7 @@ class ValueNumStore } return m_simdMaskCnsMap; } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD template @@ -1991,14 +1996,15 @@ struct ValueNumStore::VarTypConv typedef simd64_t Type; typedef simd64_t Lang; }; - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) template <> struct ValueNumStore::VarTypConv { typedef simdmask_t Type; typedef simdmask_t Lang; }; -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD template <> @@ -2074,14 +2080,16 @@ FORCEINLINE simd64_t ValueNumStore::SafeGetConstantValue(Chunk* c, uns assert(c->m_typ == TYP_SIMD64); return reinterpret_cast::Lang*>(c->m_defs)[offset]; } +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) template <> FORCEINLINE simdmask_t ValueNumStore::SafeGetConstantValue(Chunk* c, unsigned offset) { assert(c->m_typ == TYP_MASK); return reinterpret_cast::Lang*>(c->m_defs)[offset]; } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 template <> FORCEINLINE simd8_t ValueNumStore::ConstantValueInternal(ValueNum vn DEBUGARG(bool coerce)) @@ -2153,7 +2161,8 @@ FORCEINLINE simd64_t ValueNumStore::ConstantValueInternal(ValueNum vn return SafeGetConstantValue(c, offset); } - +#endif // TARGET_XARCH +#if defined(TARGET_XARCH) || defined(TARGET_ARM64) template <> FORCEINLINE simdmask_t ValueNumStore::ConstantValueInternal(ValueNum vn DEBUGARG(bool coerce)) { @@ -2167,7 +2176,7 @@ FORCEINLINE simdmask_t ValueNumStore::ConstantValueInternal(ValueNum return SafeGetConstantValue(c, offset); } -#endif // TARGET_XARCH +#endif // TARGET_XARCH || TARGET_ARM64 #endif // FEATURE_SIMD // Inline functions.