Skip to content

Commit

Permalink
Delete code
Browse files Browse the repository at this point in the history
  • Loading branch information
SingleAccretion committed Oct 10, 2022
1 parent e492874 commit f288eeb
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 169 deletions.
30 changes: 0 additions & 30 deletions src/coreclr/jit/assertionprop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1657,38 +1657,8 @@ AssertionIndex Compiler::optCreateAssertion(GenTree* op1,
goto DONE_ASSERTION;
}

//
// Copy Assertions
//
case GT_OBJ:
case GT_BLK:
{
// TODO-ADDR: delete once local morph folds SIMD-typed indirections.
//
GenTree* const addr = op2->AsIndir()->Addr();

if (addr->OperIs(GT_ADDR))
{
GenTree* const base = addr->AsOp()->gtOp1;

if (base->OperIs(GT_LCL_VAR) && varTypeIsStruct(base))
{
ClassLayout* const varLayout = base->GetLayout(this);
ClassLayout* const objLayout = op2->GetLayout(this);
if (ClassLayout::AreCompatible(varLayout, objLayout))
{
op2 = base;
goto IS_COPY;
}
}
}

goto DONE_ASSERTION;
}

case GT_LCL_VAR:
{
IS_COPY:
//
// Must either be an OAK_EQUAL or an OAK_NOT_EQUAL assertion
//
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 @@ -5756,7 +5756,6 @@ class Compiler
GenTree* fgMorphMultiOp(GenTreeMultiOp* multiOp);
GenTree* fgMorphConst(GenTree* tree);

GenTreeLclVar* fgMorphTryFoldObjAsLclVar(GenTreeObj* obj, bool destroyNodes = true);
GenTreeOp* fgMorphCommutative(GenTreeOp* tree);
GenTree* fgMorphCastedBitwiseOp(GenTreeOp* tree);

Expand Down
19 changes: 0 additions & 19 deletions src/coreclr/jit/forwardsub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -630,25 +630,6 @@ bool Compiler::fgForwardSubStatement(Statement* stmt)
}
}

// Optimization:
//
// If we are about to substitute GT_OBJ, see if we can simplify it first.
// Not doing so can lead to regressions...
//
// Hold off on doing this for call args for now (per issue #51569).
// Hold off on OBJ(GT_LCL_ADDR).
//
if (fwdSubNode->OperIs(GT_OBJ) && !fsv.IsCallArg() && fwdSubNode->gtGetOp1()->OperIs(GT_ADDR))
{
const bool destroyNodes = false;
GenTree* const optTree = fgMorphTryFoldObjAsLclVar(fwdSubNode->AsObj(), destroyNodes);
if (optTree != nullptr)
{
JITDUMP(" [folding OBJ(ADDR(LCL...))]");
fwdSubNode = optTree;
}
}

// Quirks:
//
// Don't substitute nodes "AddFinalArgsAndDetermineABIInfo" doesn't handle into struct args.
Expand Down
131 changes: 14 additions & 117 deletions src/coreclr/jit/morph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1134,9 +1134,7 @@ void CallArgs::ArgsComplete(Compiler* comp, GenTreeCall* call)
unsigned structSize = argObj->Size();
unsigned lastLoadSize = structSize % TARGET_POINTER_SIZE;

// TODO-ADDR: delete the "IsLocalAddrExpr" check once local morph transforms all such OBJs into
// local nodes.
if ((lastLoadSize != 0) && !isPow2(lastLoadSize) && (argObj->Addr()->IsLocalAddrExpr() == nullptr))
if ((lastLoadSize != 0) && !isPow2(lastLoadSize))
{
#ifdef TARGET_ARM
// On ARM we don't expand split args larger than 16 bytes into field lists.
Expand Down Expand Up @@ -3731,52 +3729,8 @@ GenTree* Compiler::fgMorphMultiregStructArg(CallArg* arg)
}

#if FEATURE_MULTIREG_ARGS
// Examine 'arg' and setup argValue objClass and structSize
//
GenTree* argValue = argNode; // normally argValue will be arg, but see right below
ClassLayout* layout = nullptr;
unsigned structSize = 0;

if (argNode->OperGet() == GT_OBJ)
{
GenTreeObj* argObj = argNode->AsObj();
layout = argObj->GetLayout();
structSize = layout->GetSize();

// If we have a GT_OBJ of a GT_ADDR then we set argValue to the child node of the GT_ADDR.
// TODO-ADDR: always perform this transformation in local morph and delete this code.
GenTree* addr = argObj->Addr();
if (addr->OperGet() == GT_ADDR)
{
GenTree* location = addr->AsOp()->gtOp1;

if (location->OperIsLocalRead())
{
if (!location->OperIs(GT_LCL_VAR) || (location->TypeGet() != argObj->TypeGet()) ||
!ClassLayout::AreCompatible(lvaGetDesc(location->AsLclVarCommon())->GetLayout(), layout))
{
unsigned lclOffset = location->AsLclVarCommon()->GetLclOffs();

location->ChangeType(argObj->TypeGet());
location->SetOper(GT_LCL_FLD);
location->AsLclFld()->SetLclOffs(lclOffset);
location->AsLclFld()->SetLayout(layout);
}

argValue = location;
}
}
}
else if (argNode->TypeIs(TYP_STRUCT))
{
assert(argNode->OperIsLocalRead());
layout = argNode->AsLclVarCommon()->GetLayout(this);
structSize = layout->GetSize();
}
else
{
structSize = genTypeSize(argNode);
}
ClassLayout* layout = argNode->TypeIs(TYP_STRUCT) ? argNode->GetLayout(this) : nullptr;
unsigned structSize = argNode->TypeIs(TYP_STRUCT) ? layout->GetSize() : genTypeSize(argNode);

struct ArgElem
{
Expand All @@ -3795,7 +3749,7 @@ GenTree* Compiler::fgMorphMultiregStructArg(CallArg* arg)
}
else
{
assert(varTypeIsSIMD(argValue) && varTypeIsSIMD(arg->GetSignatureType()));
assert(varTypeIsSIMD(argNode) && varTypeIsSIMD(arg->GetSignatureType()));
}

if (arg->AbiInfo.IsHfaArg() && arg->AbiInfo.IsPassedInFloatRegisters())
Expand Down Expand Up @@ -3849,9 +3803,9 @@ GenTree* Compiler::fgMorphMultiregStructArg(CallArg* arg)
// However, if it comes from an unknown (arbitrary) address, we must fix up the
// last element's type.
//
if (!argValue->OperIs(GT_LCL_VAR, GT_LCL_FLD))
if (!argNode->OperIs(GT_LCL_VAR, GT_LCL_FLD))
{
assert(argValue->OperIs(GT_OBJ));
assert(argNode->OperIs(GT_OBJ));

unsigned lastElemExactSize = structSize - lastElem.Offset;

Expand Down Expand Up @@ -3896,7 +3850,7 @@ GenTree* Compiler::fgMorphMultiregStructArg(CallArg* arg)
// by integer and float registers and it needs to include the padding here.
assert(roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE));
#else
if (argValue->IsLocal())
if (argNode->IsLocal())
{
assert((structSize <= loadExtent) && (loadExtent <= roundUp(structSize, TARGET_POINTER_SIZE)));
}
Expand All @@ -3908,15 +3862,15 @@ GenTree* Compiler::fgMorphMultiregStructArg(CallArg* arg)
#endif // DEBUG

// We should still have a TYP_STRUCT
assert(varTypeIsStruct(argValue));
assert(varTypeIsStruct(argNode));

GenTreeFieldList* newArg = nullptr;

// Are we passing a struct LclVar?
//
if (argValue->OperIs(GT_LCL_VAR))
if (argNode->OperIs(GT_LCL_VAR))
{
GenTreeLclVarCommon* lclNode = argValue->AsLclVarCommon();
GenTreeLclVarCommon* lclNode = argNode->AsLclVarCommon();
unsigned lclNum = lclNode->GetLclNum();
LclVarDsc* varDsc = lvaGetDesc(lclNum);

Expand Down Expand Up @@ -3972,9 +3926,9 @@ GenTree* Compiler::fgMorphMultiregStructArg(CallArg* arg)
return argNode;
}

if (argValue->OperIs(GT_LCL_VAR, GT_LCL_FLD))
if (argNode->OperIs(GT_LCL_VAR, GT_LCL_FLD))
{
GenTreeLclVarCommon* lclNode = argValue->AsLclVarCommon();
GenTreeLclVarCommon* lclNode = argNode->AsLclVarCommon();
unsigned lclNum = lclNode->GetLclNum();
LclVarDsc* varDsc = lvaGetDesc(lclNum);
unsigned lclOffset = lclNode->GetLclOffs();
Expand All @@ -3992,9 +3946,9 @@ GenTree* Compiler::fgMorphMultiregStructArg(CallArg* arg)
}
else
{
assert(argValue->OperIsIndir());
assert(argNode->OperIsIndir());

GenTree* baseAddr = argValue->AsIndir()->Addr();
GenTree* baseAddr = argNode->AsIndir()->Addr();
var_types addrType = baseAddr->TypeGet();

// TODO-ADDR: make sure all such OBJs are transformed into TYP_STRUCT LCL_FLDs and delete this condition.
Expand Down Expand Up @@ -8653,63 +8607,6 @@ GenTree* Compiler::fgMorphConst(GenTree* tree)
return fgMorphTree(tree);
}

//------------------------------------------------------------------------
// fgMorphTryFoldObjAsLclVar: try to fold an Obj node as a LclVar.
//
// Arguments:
// obj - the obj node.
// destroyNodes -- destroy nodes that are optimized away
//
// Return value:
// GenTreeLclVar if the obj can be replaced by it, null otherwise.
//
GenTreeLclVar* Compiler::fgMorphTryFoldObjAsLclVar(GenTreeObj* obj, bool destroyNodes)
{
if (opts.OptimizationEnabled())
{
GenTree* op1 = obj->Addr();
assert(!op1->OperIs(GT_LCL_VAR_ADDR) && "missed an opt opportunity");
if (op1->OperIs(GT_ADDR))
{
GenTreeUnOp* addr = op1->AsUnOp();
GenTree* addrOp = addr->gtGetOp1();
if (addrOp->TypeIs(obj->TypeGet()) && addrOp->OperIs(GT_LCL_VAR))
{
GenTreeLclVar* lclVar = addrOp->AsLclVar();

ClassLayout* lclVarLayout = lvaGetDesc(lclVar)->GetLayout();
ClassLayout* objLayout = obj->GetLayout();
if (ClassLayout::AreCompatible(lclVarLayout, objLayout))
{
#ifdef DEBUG
CORINFO_CLASS_HANDLE objClsHandle = obj->GetLayout()->GetClassHandle();
assert(objClsHandle != NO_CLASS_HANDLE);
if (verbose)
{
CORINFO_CLASS_HANDLE lclClsHnd = gtGetStructHandle(lclVar);
printf("fold OBJ(ADDR(X)) [%06u] into X [%06u], ", dspTreeID(obj), dspTreeID(lclVar));
printf("with %s handles\n", ((lclClsHnd == objClsHandle) ? "matching" : "different"));
}
#endif
// Keep the DONT_CSE flag in sync
// (as the addr always marks it for its op1)
lclVar->gtFlags &= ~GTF_DONT_CSE;
lclVar->gtFlags |= (obj->gtFlags & GTF_DONT_CSE);

if (destroyNodes)
{
DEBUG_DESTROY_NODE(obj);
DEBUG_DESTROY_NODE(addr);
}

return lclVar;
}
}
}
}
return nullptr;
}

//------------------------------------------------------------------------
// fgMorphLeaf: Fully morph a tree with no operands.
//
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/jit/rationalize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ void Rationalizer::RewriteIndir(LIR::Use& use)
// Arguments:
// use - A use of a GT_IND node of SIMD type
//
// TODO-1stClassStructs: These should be eliminated earlier, once we can handle
// lclVars in all the places that used to have GT_OBJ.
// TODO-ADDR: delete this once block morphing stops taking addresses of locals
// under COMMAs.
//
void Rationalizer::RewriteSIMDIndir(LIR::Use& use)
{
Expand Down

0 comments on commit f288eeb

Please sign in to comment.