Skip to content

Commit

Permalink
Disallow the InitObj form for SIMD types (#84211)
Browse files Browse the repository at this point in the history
  • Loading branch information
SingleAccretion committed Apr 1, 2023
1 parent e65ebc9 commit b9352f1
Show file tree
Hide file tree
Showing 9 changed files with 15 additions and 55 deletions.
4 changes: 2 additions & 2 deletions src/coreclr/jit/assertionprop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1132,7 +1132,7 @@ AssertionIndex Compiler::optCreateAssertion(GenTree* op1,
// Constant Assertions
//
case GT_CNS_INT:
if (varTypeIsStruct(op1))
if (op1->TypeIs(TYP_STRUCT))
{
assert(op2->IsIntegralConst(0));
op2Kind = O2K_ZEROOBJ;
Expand Down Expand Up @@ -3455,7 +3455,7 @@ GenTree* Compiler::optAssertionProp_Asg(ASSERT_VALARG_TP assertions, GenTreeOp*
{
unsigned const lhsLclNum = lhsVarTree->GetLclNum();
LclVarDsc* const lhsLclDsc = lvaGetDesc(lhsLclNum);
bool const lhsLclIsStruct = varTypeIsStruct(lhsLclDsc->TypeGet());
bool const lhsLclIsStruct = lhsLclDsc->TypeGet() == TYP_STRUCT;
AssertionIndex const lhsIndex =
optLocalAssertionIsEqualOrNotEqual(O1K_LCLVAR, lhsLclNum, lhsLclIsStruct ? O2K_ZEROOBJ : O2K_CONST_INT,
0, assertions);
Expand Down
1 change: 0 additions & 1 deletion src/coreclr/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -2507,7 +2507,6 @@ class Compiler
public:
GenTreeObj* gtNewObjNode(ClassLayout* layout, GenTree* addr);
GenTreeObj* gtNewObjNode(CORINFO_CLASS_HANDLE structHnd, GenTree* addr);
void gtSetObjGcInfo(GenTreeObj* objNode);
GenTree* gtNewStructVal(ClassLayout* layout, GenTree* addr);
GenTree* gtNewBlockVal(GenTree* addr, unsigned size);

Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/jit/fginline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1863,10 +1863,10 @@ Statement* Compiler::fgInlinePrependStatements(InlineInfo* inlineInfo)
continue;
}

var_types lclTyp = (var_types)lvaTable[tmpNum].lvType;
var_types lclTyp = lvaTable[tmpNum].lvType;
noway_assert(lclTyp == lclVarInfo[lclNum + inlineInfo->argCnt].lclTypeInfo);

if (!varTypeIsStruct(lclTyp))
if (lclTyp != TYP_STRUCT)
{
// Unsafe value cls check is not needed here since in-linee compiler instance would have
// iterated over locals and marked accordingly.
Expand Down
19 changes: 1 addition & 18 deletions src/coreclr/jit/gentree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7878,23 +7878,6 @@ GenTreeObj* Compiler::gtNewObjNode(CORINFO_CLASS_HANDLE structHnd, GenTree* addr
return objNode;
}

//------------------------------------------------------------------------
// gtSetObjGcInfo: Set the GC info on an object node
//
// Arguments:
// objNode - The object node of interest
//
void Compiler::gtSetObjGcInfo(GenTreeObj* objNode)
{
assert(varTypeIsStruct(objNode->TypeGet()));
assert(objNode->TypeGet() == impNormStructType(objNode->GetLayout()->GetClassHandle()));

if (!objNode->GetLayout()->HasGCPtr())
{
objNode->SetOper(objNode->OperIs(GT_OBJ) ? GT_BLK : GT_STORE_BLK);
}
}

//------------------------------------------------------------------------
// gtNewStructVal: Return a node that represents a struct or block value
//
Expand Down Expand Up @@ -8183,7 +8166,7 @@ GenTree* Compiler::gtNewBlkOpNode(GenTree* dst, GenTree* srcOrFillVal, bool isVo
bool isCopyBlock = srcOrFillVal->TypeGet() == dst->TypeGet();
if (!isCopyBlock) // InitBlk
{
assert(genActualTypeIsInt(srcOrFillVal));
assert(genActualTypeIsInt(srcOrFillVal) && dst->TypeIs(TYP_STRUCT));
if (!srcOrFillVal->IsIntegralConst(0))
{
srcOrFillVal = gtNewOperNode(GT_INIT_VAL, TYP_INT, srcOrFillVal);
Expand Down
6 changes: 1 addition & 5 deletions src/coreclr/jit/importer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10716,11 +10716,7 @@ void Compiler::impImportBlockCode(BasicBlock* block)
ClassLayout* layout = typGetObjLayout(resolvedToken.hClass);
op1 = gtNewStructVal(layout, op1);
op2 = gtNewStructVal(layout, op2);
if (op1->OperIs(GT_OBJ))
{
gtSetObjGcInfo(op1->AsObj());
}
op1 = gtNewBlkOpNode(op1, op2, ((prefixFlags & PREFIX_VOLATILE) != 0));
op1 = gtNewBlkOpNode(op1, op2, ((prefixFlags & PREFIX_VOLATILE) != 0));
goto SPILL_APPEND;
}

Expand Down
9 changes: 0 additions & 9 deletions src/coreclr/jit/lclmorph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1206,17 +1206,8 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
assert(elementType == TYP_SIMD12);
assert(varDsc->TypeGet() == TYP_SIMD16);

// If we are not doing struct promotion and we have zero-initialization,
// then we need to produce a VecCon(0).
if (elementNode->IsIntegralConst(0))
{
DEBUG_DESTROY_NODE(elementNode);
elementNode = m_compiler->gtNewZeroConNode(TYP_SIMD12);
}

// We inverse the operands here and take elementNode as the main value and simdLclNode[3] as the
// new value. This gives us a new TYP_SIMD16 with all elements in the right spots

GenTree* indexNode = m_compiler->gtNewIconNode(3, TYP_INT);
hwiNode =
m_compiler->gtNewSimdWithElementNode(TYP_SIMD16, elementNode, indexNode, simdLclNode,
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/morph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7607,7 +7607,7 @@ void Compiler::fgMorphRecursiveFastTailCallIntoLoop(BasicBlock* block, GenTreeCa
{
GenTree* lcl = gtNewLclvNode(varNum, lclType);
GenTree* init = nullptr;
if (varTypeIsStruct(lclType))
if (lclType == TYP_STRUCT)
{
init = gtNewBlkOpNode(lcl, gtNewIconNode(0));
init = fgMorphInitBlock(init);
Expand Down
20 changes: 6 additions & 14 deletions src/coreclr/jit/rationalize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,12 @@ void Rationalizer::SanityCheck()
{
assert(!(tree->gtGetOp2()->gtFlags & GTF_VAR_DEF));
}

if (tree->OperIsInitBlkOp())
{
// No SIMD types are allowed for InitBlks (including zero-inits).
assert(tree->TypeIs(TYP_STRUCT) && tree->gtGetOp1()->TypeIs(TYP_STRUCT));
}
}
}
}
Expand Down Expand Up @@ -397,20 +403,6 @@ void Rationalizer::RewriteAssignment(LIR::Use& use)

genTreeOps locationOp = location->OperGet();

if (varTypeIsSIMD(location) && assignment->OperIsInitBlkOp())
{
var_types simdType = location->TypeGet();
GenTree* initVal = assignment->AsOp()->gtOp2;
GenTree* zeroCon = comp->gtNewZeroConNode(simdType);
noway_assert(initVal->IsIntegralConst(0)); // All SIMD InitBlks are zero inits.

assignment->gtOp2 = zeroCon;
value = zeroCon;

BlockRange().InsertAfter(initVal, zeroCon);
BlockRange().Remove(initVal);
}

switch (locationOp)
{
case GT_LCL_VAR:
Expand Down
5 changes: 2 additions & 3 deletions src/coreclr/jit/valuenum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9815,12 +9815,11 @@ void Compiler::fgValueNumberAssignment(GenTreeOp* tree)
ValueNum initObjVN;
if (rhs->IsIntegralConst(0))
{
initObjVN = lhs->TypeIs(TYP_STRUCT) ? vnStore->VNForZeroObj(lhs->GetLayout(this))
: vnStore->VNZeroForType(lhs->TypeGet());
initObjVN = vnStore->VNForZeroObj(lhs->GetLayout(this));
}
else
{
initObjVN = vnStore->VNForExpr(compCurBB, lhs->TypeGet());
initObjVN = vnStore->VNForExpr(compCurBB, TYP_STRUCT);
}

rhsVNPair.SetBoth(initObjVN);
Expand Down

0 comments on commit b9352f1

Please sign in to comment.