Skip to content

Commit 8ba8249

Browse files
Fix various asserts that were found by Antigen (#104625)
* Ensure that we create a valid GT_IND node * Remove a bad assert in the associative morphs * Ensure that we check for GT_NULLCHECK when handling containment * Fix a bad assert for x64 * Ensure we properly check for ConvertMaskToVector * Fix the memory size used for some vbroadcast instructions in disasm and asserts * Ensure rewriting WithElement takes into account unsupported ISAs * Ensure we check FEATURE_HW_INTRINSICS * Apply formatting patch
1 parent da8a603 commit 8ba8249

File tree

7 files changed

+60
-36
lines changed

7 files changed

+60
-36
lines changed

src/coreclr/jit/emit.h

+4
Original file line numberDiff line numberDiff line change
@@ -4212,6 +4212,10 @@ emitAttr emitter::emitGetBaseMemOpSize(instrDesc* id) const
42124212
return EA_16BYTE;
42134213
}
42144214

4215+
case INS_vbroadcastf32x8:
4216+
case INS_vbroadcasti32x8:
4217+
case INS_vbroadcasti64x4:
4218+
case INS_vbroadcastf64x4:
42154219
case INS_vextractf32x8:
42164220
case INS_vextracti32x8:
42174221
case INS_vextractf64x4:

src/coreclr/jit/gentree.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -30706,7 +30706,7 @@ GenTree* Compiler::gtFoldExprHWIntrinsic(GenTreeHWIntrinsic* tree)
3070630706

3070730707
case NI_Vector256_ToVector512:
3070830708
{
30709-
assert(retType == TYP_SIMD32);
30709+
assert(retType == TYP_SIMD64);
3071030710
assert(cnsNode->gtType == TYP_SIMD32);
3071130711
cnsNode->AsVecCon()->gtSimd64Val.v256[1] = {};
3071230712

src/coreclr/jit/gentree.h

+26-22
Original file line numberDiff line numberDiff line change
@@ -1640,6 +1640,32 @@ struct GenTree
16401640

16411641
bool OperIsHWIntrinsic(NamedIntrinsic intrinsicId) const;
16421642

1643+
bool OperIsConvertMaskToVector() const
1644+
{
1645+
#if defined(FEATURE_HW_INTRINSICS)
1646+
#if defined(TARGET_XARCH)
1647+
return OperIsHWIntrinsic(NI_EVEX_ConvertMaskToVector);
1648+
#elif defined(TARGET_ARM64)
1649+
return OperIsHWIntrinsic(NI_Sve_ConvertMaskToVector);
1650+
#endif // !TARGET_XARCH && !TARGET_ARM64
1651+
#else
1652+
return false;
1653+
#endif // FEATURE_HW_INTRINSICS
1654+
}
1655+
1656+
bool OperIsConvertVectorToMask() const
1657+
{
1658+
#if defined(FEATURE_HW_INTRINSICS)
1659+
#if defined(TARGET_XARCH)
1660+
return OperIsHWIntrinsic(NI_EVEX_ConvertVectorToMask);
1661+
#elif defined(TARGET_ARM64)
1662+
return OperIsHWIntrinsic(NI_Sve_ConvertVectorToMask);
1663+
#endif // !TARGET_XARCH && !TARGET_ARM64
1664+
#else
1665+
return false;
1666+
#endif // FEATURE_HW_INTRINSICS
1667+
}
1668+
16431669
// This is here for cleaner GT_LONG #ifdefs.
16441670
static bool OperIsLong(genTreeOps gtOper)
16451671
{
@@ -6499,28 +6525,6 @@ struct GenTreeHWIntrinsic : public GenTreeJitIntrinsic
64996525
bool OperIsBitwiseHWIntrinsic() const;
65006526
bool OperIsEmbRoundingEnabled() const;
65016527

6502-
bool OperIsConvertMaskToVector() const
6503-
{
6504-
#if defined(TARGET_XARCH)
6505-
return GetHWIntrinsicId() == NI_EVEX_ConvertMaskToVector;
6506-
#elif defined(TARGET_ARM64)
6507-
return GetHWIntrinsicId() == NI_Sve_ConvertMaskToVector;
6508-
#else
6509-
return false;
6510-
#endif // TARGET_ARM64 && FEATURE_MASKED_HW_INTRINSICS
6511-
}
6512-
6513-
bool OperIsConvertVectorToMask() const
6514-
{
6515-
#if defined(TARGET_XARCH)
6516-
return GetHWIntrinsicId() == NI_EVEX_ConvertVectorToMask;
6517-
#elif defined(TARGET_ARM64)
6518-
return GetHWIntrinsicId() == NI_Sve_ConvertVectorToMask;
6519-
#else
6520-
return false;
6521-
#endif
6522-
}
6523-
65246528
bool OperRequiresAsgFlag() const;
65256529
bool OperRequiresCallFlag() const;
65266530
bool OperRequiresGlobRefFlag() const;

src/coreclr/jit/lowerarmarch.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -1264,9 +1264,10 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
12641264

12651265
if (isContainableMemory || !op2->OperIsConst())
12661266
{
1267-
unsigned simdSize = node->GetSimdSize();
1268-
var_types simdBaseType = node->GetSimdBaseType();
1269-
var_types simdType = Compiler::getSIMDTypeForSize(simdSize);
1267+
unsigned simdSize = node->GetSimdSize();
1268+
CorInfoType simdBaseJitType = node->GetSimdBaseJitType();
1269+
var_types simdBaseType = node->GetSimdBaseType();
1270+
var_types simdType = Compiler::getSIMDTypeForSize(simdSize);
12701271

12711272
// We're either already loading from memory or we need to since
12721273
// we don't know what actual index is going to be retrieved.
@@ -1355,7 +1356,7 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
13551356
}
13561357

13571358
// Finally we can indirect the memory address to get the actual value
1358-
GenTreeIndir* indir = comp->gtNewIndir(simdBaseType, addr);
1359+
GenTreeIndir* indir = comp->gtNewIndir(JITtype2varType(simdBaseJitType), addr);
13591360
BlockRange().InsertBefore(node, indir);
13601361

13611362
LIR::Use use;
@@ -2339,7 +2340,8 @@ void Lowering::ContainCheckIndir(GenTreeIndir* indirNode)
23392340
MakeSrcContained(indirNode, addr);
23402341
}
23412342
}
2342-
else if (addr->OperIs(GT_LCL_ADDR) && IsContainableLclAddr(addr->AsLclFld(), indirNode->Size()))
2343+
else if (addr->OperIs(GT_LCL_ADDR) && !indirNode->OperIs(GT_NULLCHECK) &&
2344+
IsContainableLclAddr(addr->AsLclFld(), indirNode->Size()))
23432345
{
23442346
// These nodes go into an addr mode:
23452347
// - GT_LCL_ADDR is a stack addr mode.

src/coreclr/jit/lowerxarch.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -3063,7 +3063,7 @@ GenTree* Lowering::LowerHWIntrinsicCndSel(GenTreeHWIntrinsic* node)
30633063
// Next, determine if the target architecture supports BlendVariable
30643064
NamedIntrinsic blendVariableId = NI_Illegal;
30653065

3066-
bool isOp1CvtMaskToVector = op1->AsHWIntrinsic()->OperIsConvertMaskToVector();
3066+
bool isOp1CvtMaskToVector = op1->OperIsConvertMaskToVector();
30673067

30683068
if ((simdSize == 64) || isOp1CvtMaskToVector)
30693069
{

src/coreclr/jit/morph.cpp

+1-7
Original file line numberDiff line numberDiff line change
@@ -9977,7 +9977,7 @@ GenTree* Compiler::fgOptimizeHWIntrinsic(GenTreeHWIntrinsic* node)
99779977
// We need both operands to be ConvertMaskToVector in
99789978
// order to optimize this to a direct mask operation
99799979

9980-
if (!op1->OperIsHWIntrinsic())
9980+
if (!op1->OperIsConvertMaskToVector())
99819981
{
99829982
break;
99839983
}
@@ -10003,11 +10003,6 @@ GenTree* Compiler::fgOptimizeHWIntrinsic(GenTreeHWIntrinsic* node)
1000310003
GenTreeHWIntrinsic* cvtOp1 = op1->AsHWIntrinsic();
1000410004
GenTreeHWIntrinsic* cvtOp2 = op2->AsHWIntrinsic();
1000510005

10006-
if (!cvtOp1->OperIsConvertMaskToVector())
10007-
{
10008-
break;
10009-
}
10010-
1001110006
if (!cvtOp2->OperIsConvertMaskToVector())
1001210007
{
1001310008
break;
@@ -10448,7 +10443,6 @@ GenTree* Compiler::fgOptimizeHWIntrinsicAssociative(GenTreeHWIntrinsic* tree)
1044810443
{
1044910444
return nullptr;
1045010445
}
10451-
assert(intrinOp1->GetHWIntrinsicId() == intrinsicId);
1045210446

1045310447
if (needsMatchingBaseType && (intrinOp1->GetSimdBaseType() != simdBaseType))
1045410448
{

src/coreclr/jit/rationalize.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,26 @@ void Rationalizer::RewriteHWIntrinsicAsUserCall(GenTree** use, ArrayStack<GenTre
372372
break;
373373
}
374374

375+
#if defined(TARGET_XARCH)
376+
if (varTypeIsIntegral(simdBaseType))
377+
{
378+
if (varTypeIsLong(simdBaseType))
379+
{
380+
if (!comp->compOpportunisticallyDependsOn(InstructionSet_SSE41_X64))
381+
{
382+
break;
383+
}
384+
}
385+
else if (!varTypeIsShort(simdBaseType))
386+
{
387+
if (!comp->compOpportunisticallyDependsOn(InstructionSet_SSE41))
388+
{
389+
break;
390+
}
391+
}
392+
}
393+
#endif // TARGET_XARCH
394+
375395
result = comp->gtNewSimdWithElementNode(retType, op1, op2, op3, simdBaseJitType, simdSize);
376396
break;
377397
}

0 commit comments

Comments
 (0)