* Allow `struct<N> with no GCPointers <-> block<N>` replacements.
* Alllow local morph to fold `OBJ(ADDR(LCL_VAR))` when obj and lclVar loayouts are compatible.
{
CORINFO_CLASS_HANDLE clsHnd1 = layout1->GetClassHandle();
CORINFO_CLASS_HANDLE clsHnd2 = layout2->GetClassHandle();
- assert(clsHnd1 != NO_CLASS_HANDLE);
- assert(clsHnd2 != NO_CLASS_HANDLE);
- if (clsHnd1 == clsHnd2)
+ if ((clsHnd1 != NO_CLASS_HANDLE) && (clsHnd1 == clsHnd2))
{
return true;
}
return true;
}
+ assert(clsHnd1 != NO_CLASS_HANDLE);
+ assert(clsHnd2 != NO_CLASS_HANDLE);
assert(layout1->HasGCPtr() && layout2->HasGCPtr());
+
if (layout1->GetGCPtrCount() != layout2->GetGCPtrCount())
{
return false;
// otherwise the below layout equality check would be insufficient.
assert(varDsc->GetLayout() != nullptr);
- if ((val.Offset() == 0) && (structLayout == varDsc->GetLayout()))
+ if ((val.Offset() == 0) && (structLayout != nullptr) &&
+ ClassLayout::AreCompatible(structLayout, varDsc->GetLayout()))
{
indir->ChangeOper(GT_LCL_VAR);
indir->AsLclVar()->SetLclNum(val.LclNum());