@@ -4234,49 +4234,57 @@ void Compiler::lvaMarkLclRefs(GenTree* tree, BasicBlock* block, Statement* stmt,
4234
4234
4235
4235
/* Is this an assignment to a local variable? */
4236
4236
4237
- if (op1->gtOper == GT_LCL_VAR && op2-> gtType != TYP_BOOL )
4237
+ if (op1->gtOper == GT_LCL_VAR)
4238
4238
{
4239
- /* Only simple assignments allowed for booleans */
4239
+ LclVarDsc* varDsc = lvaGetDesc (op1-> AsLclVarCommon ());
4240
4240
4241
- if (tree-> gtOper != GT_ASG )
4241
+ if (varDsc-> lvPinned && varDsc-> lvAllDefsAreNoGc )
4242
4242
{
4243
- goto NOT_BOOL;
4243
+ if (!op2->IsNotGcDef ())
4244
+ {
4245
+ varDsc->lvAllDefsAreNoGc = false ;
4246
+ }
4244
4247
}
4245
4248
4246
- /* Is the RHS clearly a boolean value? */
4247
-
4248
- switch (op2->gtOper )
4249
+ if (op2->gtType != TYP_BOOL)
4249
4250
{
4250
- unsigned lclNum;
4251
+ /* Only simple assignments allowed for booleans */
4251
4252
4252
- case GT_CNS_INT:
4253
+ if (tree->gtOper != GT_ASG)
4254
+ {
4255
+ goto NOT_BOOL;
4256
+ }
4253
4257
4254
- if (op2->AsIntCon ()->gtIconVal == 0 )
4255
- {
4256
- break ;
4257
- }
4258
- if (op2->AsIntCon ()->gtIconVal == 1 )
4259
- {
4260
- break ;
4261
- }
4258
+ /* Is the RHS clearly a boolean value? */
4262
4259
4263
- // Not 0 or 1, fall through ....
4264
- FALLTHROUGH;
4260
+ switch (op2->gtOper )
4261
+ {
4262
+ case GT_CNS_INT:
4265
4263
4266
- default :
4264
+ if (op2->AsIntCon ()->gtIconVal == 0 )
4265
+ {
4266
+ break ;
4267
+ }
4268
+ if (op2->AsIntCon ()->gtIconVal == 1 )
4269
+ {
4270
+ break ;
4271
+ }
4267
4272
4268
- if (op2->OperIsCompare ())
4269
- {
4270
- break ;
4271
- }
4273
+ // Not 0 or 1, fall through ....
4274
+ FALLTHROUGH;
4272
4275
4273
- NOT_BOOL :
4276
+ default :
4274
4277
4275
- lclNum = op1->AsLclVarCommon ()->GetLclNum ();
4276
- noway_assert (lclNum < lvaCount);
4278
+ if (op2->OperIsCompare ())
4279
+ {
4280
+ break ;
4281
+ }
4277
4282
4278
- lvaTable[lclNum].lvIsBoolean = false ;
4279
- break ;
4283
+ NOT_BOOL:
4284
+
4285
+ varDsc->lvIsBoolean = false ;
4286
+ break ;
4287
+ }
4280
4288
}
4281
4289
}
4282
4290
}
@@ -4331,7 +4339,8 @@ void Compiler::lvaMarkLclRefs(GenTree* tree, BasicBlock* block, Statement* stmt,
4331
4339
{
4332
4340
if (lvaVarAddrExposed (lclNum))
4333
4341
{
4334
- varDsc->lvIsBoolean = false ;
4342
+ varDsc->lvIsBoolean = false ;
4343
+ varDsc->lvAllDefsAreNoGc = false ;
4335
4344
}
4336
4345
4337
4346
if (tree->gtOper == GT_LCL_FLD)
@@ -4803,6 +4812,8 @@ void Compiler::lvaComputeRefCounts(bool isRecompute, bool setSlotNumbers)
4803
4812
{
4804
4813
varDsc->lvSingleDef = varDsc->lvIsParam ;
4805
4814
varDsc->lvSingleDefRegCandidate = varDsc->lvIsParam ;
4815
+
4816
+ varDsc->lvAllDefsAreNoGc = (varDsc->lvImplicitlyReferenced == false );
4806
4817
}
4807
4818
}
4808
4819
@@ -4921,6 +4932,13 @@ void Compiler::lvaComputeRefCounts(bool isRecompute, bool setSlotNumbers)
4921
4932
varDsc->lvImplicitlyReferenced = 1 ;
4922
4933
}
4923
4934
}
4935
+
4936
+ if (varDsc->lvPinned && varDsc->lvAllDefsAreNoGc )
4937
+ {
4938
+ varDsc->lvPinned = 0 ;
4939
+
4940
+ JITDUMP (" V%02u was unpinned as all def candidates were local.\n " , lclNum);
4941
+ }
4924
4942
}
4925
4943
}
4926
4944
0 commit comments