@@ -1069,10 +1069,17 @@ BackwardPass::MergeGuardedProperties(ObjTypeGuardBucket bucket1, ObjTypeGuardBuc
10691069
10701070 ObjTypeGuardBucket bucket;
10711071 bucket.SetGuardedPropertyOps (mergedPropertyOps);
1072- if (bucket1.NeedsMonoCheck () || bucket2.NeedsMonoCheck ())
1072+ Js::Type *monoGuardType = bucket1.GetMonoGuardType ();
1073+ if (monoGuardType != nullptr )
10731074 {
1074- bucket. SetNeedsMonoCheck ( true );
1075+ Assert (!bucket2. NeedsMonoCheck () || monoGuardType == bucket2. GetMonoGuardType () );
10751076 }
1077+ else
1078+ {
1079+ monoGuardType = bucket2.GetMonoGuardType ();
1080+ }
1081+ bucket.SetMonoGuardType (monoGuardType);
1082+
10761083 return bucket;
10771084}
10781085
@@ -3988,7 +3995,8 @@ BackwardPass::TrackObjTypeSpecProperties(IR::PropertySymOpnd *opnd, BasicBlock *
39883995 if (opnd->NeedsMonoCheck ())
39893996 {
39903997 Assert (opnd->IsMono ());
3991- bucket->SetNeedsMonoCheck (true );
3998+ Js::Type *monoGuardType = opnd->HasInitialType () ? opnd->GetInitialType () : opnd->GetType ();
3999+ bucket->SetMonoGuardType (monoGuardType);
39924000 }
39934001
39944002 if (opnd->NeedsPrimaryTypeCheck ())
@@ -4013,11 +4021,10 @@ BackwardPass::TrackObjTypeSpecProperties(IR::PropertySymOpnd *opnd, BasicBlock *
40134021 {
40144022 // Some instr protected by this one requires a monomorphic type check. (E.g., final type opt,
40154023 // fixed field not loaded from prototype.)
4016- Assert (opnd->IsMono ());
4017- opnd->SetMustDoMonoCheck (true );
4024+ opnd->SetMonoGuardType (bucket->GetMonoGuardType ());
40184025 this ->currentInstr ->ChangeEquivalentToMonoTypeCheckBailOut ();
40194026 }
4020- bucket->SetNeedsMonoCheck ( false );
4027+ bucket->SetMonoGuardType ( nullptr );
40214028 }
40224029
40234030 bucket->SetGuardedPropertyOps (nullptr );
0 commit comments