Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JIT: ARM64 - Enable value-numbering for TYP_MASK #103790

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/coreclr/jit/assertionprop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<simdmask_t>(vnCns);
Expand All @@ -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:
Expand Down
20 changes: 13 additions & 7 deletions src/coreclr/jit/gentree.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should use #if defined(FEATURE_MASKED_HW_INTRINSICS)

simdmask_t gtSimdMaskVal;
#endif // TARGET_XARCH || TARGET_ARM64

simd_t gtSimdVal;
};

Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
12 changes: 7 additions & 5 deletions src/coreclr/jit/simd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 <typename TBase>
TBase EvaluateUnaryScalarSpecialized(genTreeOps oper, TBase arg0)
Expand Down
52 changes: 24 additions & 28 deletions src/coreclr/jit/valuenum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1711,13 +1711,14 @@ ValueNumStore::Chunk::Chunk(CompAllocator alloc, ValueNum* pNextBaseVN, var_type
m_defs = new (alloc) Alloc<TYP_SIMD64>::Type[ChunkSize];
break;
}

#endif // TARGET_XARCH
#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
case TYP_MASK:
{
m_defs = new (alloc) Alloc<TYP_MASK>::Type[ChunkSize];
break;
}
#endif // TARGET_XARCH
#endif // TARGET_XARCH || TARGET_ARM64
#endif // FEATURE_SIMD

default:
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -2318,11 +2326,6 @@ ValueNum ValueNumStore::VNBroadcastForSimdType(var_types simdType, var_types sim
simd64_t result = BroadcastConstantToSimd<simd64_t>(this, simdBaseType, valVN);
return VNForSimd64Con(result);
}

case TYP_MASK:
{
unreached();
}
#endif // TARGET_XARCH

default:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -3925,7 +3918,8 @@ simd64_t ValueNumStore::GetConstantSimd64(ValueNum argVN)

return ConstantValue<simd64_t>(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)
Expand All @@ -3935,7 +3929,7 @@ simdmask_t ValueNumStore::GetConstantSimdMask(ValueNum argVN)

return ConstantValue<simdmask_t>(argVN);
}
#endif // TARGET_XARCH
#endif // TARGET_XARCH || TARGET_ARM64
#endif // FEATURE_SIMD

// Compute the proper value number when the VNFunc has all constant arguments
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix the comment for #endif

case TYP_MASK:
{
simdmask_t simdmaskVal;
Expand Down
27 changes: 18 additions & 9 deletions src/coreclr/jit/valuenum.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -1779,7 +1783,8 @@ class ValueNumStore
}
return m_simd64CnsMap;
}

#endif // TARGET_XARCH
#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
struct SimdMaskPrimitiveKeyFuncs : public JitKeyFuncsDefEquals<simdmask_t>
{
static bool Equals(const simdmask_t& x, const simdmask_t& y)
Expand Down Expand Up @@ -1808,7 +1813,7 @@ class ValueNumStore
}
return m_simdMaskCnsMap;
}
#endif // TARGET_XARCH
#endif // TARGET_XARCH || TARGET_ARM64
#endif // FEATURE_SIMD

template <size_t NumArgs>
Expand Down Expand Up @@ -1991,14 +1996,15 @@ struct ValueNumStore::VarTypConv<TYP_SIMD64>
typedef simd64_t Type;
typedef simd64_t Lang;
};

#endif // TARGET_XARCH
#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
template <>
struct ValueNumStore::VarTypConv<TYP_MASK>
{
typedef simdmask_t Type;
typedef simdmask_t Lang;
};
#endif // TARGET_XARCH
#endif // TARGET_XARCH || TARGET_ARM64
#endif // FEATURE_SIMD

template <>
Expand Down Expand Up @@ -2074,14 +2080,16 @@ FORCEINLINE simd64_t ValueNumStore::SafeGetConstantValue<simd64_t>(Chunk* c, uns
assert(c->m_typ == TYP_SIMD64);
return reinterpret_cast<VarTypConv<TYP_SIMD64>::Lang*>(c->m_defs)[offset];
}
#endif // TARGET_XARCH

#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
template <>
FORCEINLINE simdmask_t ValueNumStore::SafeGetConstantValue<simdmask_t>(Chunk* c, unsigned offset)
{
assert(c->m_typ == TYP_MASK);
return reinterpret_cast<VarTypConv<TYP_MASK>::Lang*>(c->m_defs)[offset];
}
#endif // TARGET_XARCH
#endif // TARGET_XARCH || TARGET_ARM64

template <>
FORCEINLINE simd8_t ValueNumStore::ConstantValueInternal<simd8_t>(ValueNum vn DEBUGARG(bool coerce))
Expand Down Expand Up @@ -2153,7 +2161,8 @@ FORCEINLINE simd64_t ValueNumStore::ConstantValueInternal<simd64_t>(ValueNum vn

return SafeGetConstantValue<simd64_t>(c, offset);
}

#endif // TARGET_XARCH
#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
template <>
FORCEINLINE simdmask_t ValueNumStore::ConstantValueInternal<simdmask_t>(ValueNum vn DEBUGARG(bool coerce))
{
Expand All @@ -2167,7 +2176,7 @@ FORCEINLINE simdmask_t ValueNumStore::ConstantValueInternal<simdmask_t>(ValueNum

return SafeGetConstantValue<simdmask_t>(c, offset);
}
#endif // TARGET_XARCH
#endif // TARGET_XARCH || TARGET_ARM64
#endif // FEATURE_SIMD

// Inline functions.
Expand Down
Loading