@@ -2287,6 +2287,7 @@ bool Compiler::fgTryMorphStructArg(CallArg* arg)
2287
2287
#else
2288
2288
*use = fieldList->SoleFieldOrThis();
2289
2289
#endif
2290
+ *use = fgMorphTree(*use);
2290
2291
}
2291
2292
else
2292
2293
{
@@ -2335,7 +2336,8 @@ bool Compiler::fgTryMorphStructArg(CallArg* arg)
2335
2336
2336
2337
// Try to see if we can use the promoted fields to pass this argument.
2337
2338
//
2338
- if (varDsc->lvPromoted && (varDsc->lvFieldCnt == arg->AbiInfo.CountRegsAndStackSlots()))
2339
+ if (varDsc->lvPromoted && !varDsc->lvDoNotEnregister &&
2340
+ (varDsc->lvFieldCnt == arg->AbiInfo.CountRegsAndStackSlots()))
2339
2341
{
2340
2342
bool fieldsMatch = true;
2341
2343
@@ -2366,6 +2368,7 @@ bool Compiler::fgTryMorphStructArg(CallArg* arg)
2366
2368
if (fieldsMatch)
2367
2369
{
2368
2370
newArg = fgMorphLclToFieldList(lclNode)->SoleFieldOrThis();
2371
+ newArg = fgMorphTree(newArg);
2369
2372
}
2370
2373
}
2371
2374
}
@@ -2511,7 +2514,7 @@ bool Compiler::fgTryMorphStructArg(CallArg* arg)
2511
2514
lvaSetVarDoNotEnregister(lclVar->GetLclNum() DEBUGARG(DoNotEnregisterReason::LocalField));
2512
2515
}
2513
2516
}
2514
- result->SetMorphed(this );
2517
+ result = fgMorphTree(result );
2515
2518
return result;
2516
2519
}
2517
2520
else
@@ -2532,7 +2535,7 @@ bool Compiler::fgTryMorphStructArg(CallArg* arg)
2532
2535
}
2533
2536
2534
2537
GenTree* indir = gtNewIndir(type, addr);
2535
- indir->SetMorphed(this, /* doChildren*/ true);
2538
+ indir->SetMorphed(this, /* doChildren */ true);
2536
2539
return indir;
2537
2540
}
2538
2541
};
@@ -2593,16 +2596,15 @@ GenTreeFieldList* Compiler::fgMorphLclToFieldList(GenTreeLclVar* lcl)
2593
2596
unsigned fieldLclNum = varDsc->lvFieldLclStart;
2594
2597
2595
2598
GenTreeFieldList* fieldList = new (this, GT_FIELD_LIST) GenTreeFieldList();
2596
- fieldList->SetMorphed(this);
2597
2599
2598
2600
for (unsigned i = 0; i < fieldCount; i++)
2599
2601
{
2600
2602
LclVarDsc* fieldVarDsc = lvaGetDesc(fieldLclNum);
2601
2603
GenTree* lclVar = gtNewLclvNode(fieldLclNum, fieldVarDsc->TypeGet());
2602
- lclVar->SetMorphed(this);
2603
2604
fieldList->AddField(this, lclVar, fieldVarDsc->lvFldOffset, fieldVarDsc->TypeGet());
2604
2605
fieldLclNum++;
2605
2606
}
2607
+
2606
2608
return fieldList;
2607
2609
}
2608
2610
@@ -8366,7 +8368,10 @@ GenTree* Compiler::fgMorphSmpOp(GenTree* tree, MorphAddrContext* mac, bool* optA
8366
8368
GenTree*& retVal = tree->AsOp()->ReturnValueRef();
8367
8369
if ((retVal != nullptr) && ((genReturnBB == nullptr) || (compCurBB == genReturnBB)))
8368
8370
{
8369
- fgTryReplaceStructLocalWithFields(&retVal);
8371
+ if (fgTryReplaceStructLocalWithFields(&retVal))
8372
+ {
8373
+ retVal = fgMorphTree(retVal);
8374
+ }
8370
8375
}
8371
8376
break;
8372
8377
}
@@ -8424,19 +8429,22 @@ GenTree* Compiler::fgMorphSmpOp(GenTree* tree, MorphAddrContext* mac, bool* optA
8424
8429
// Notes:
8425
8430
// Currently only called when the tree parent is a GT_RETURN/GT_SWIFT_ERROR_RET.
8426
8431
//
8427
- void Compiler::fgTryReplaceStructLocalWithFields(GenTree** use)
8432
+ bool Compiler::fgTryReplaceStructLocalWithFields(GenTree** use)
8428
8433
{
8429
8434
if (!(*use)->OperIs(GT_LCL_VAR))
8430
8435
{
8431
- return;
8436
+ return false ;
8432
8437
}
8433
8438
8434
8439
LclVarDsc* varDsc = lvaGetDesc((*use)->AsLclVar());
8435
8440
8436
- if (! varDsc->lvDoNotEnregister && varDsc->lvPromoted)
8441
+ if (varDsc->lvDoNotEnregister || ! varDsc->lvPromoted)
8437
8442
{
8438
- *use = fgMorphLclToFieldList((*use)->AsLclVar()) ;
8443
+ return false ;
8439
8444
}
8445
+
8446
+ *use = fgMorphLclToFieldList((*use)->AsLclVar());
8447
+ return true;
8440
8448
}
8441
8449
8442
8450
//------------------------------------------------------------------------
0 commit comments