@@ -710,7 +710,7 @@ BackwardPass::MergeSuccBlocksInfo(BasicBlock * block)
710
710
auto fixupFrom = [block, blockSucc, this ](Bucket<AddPropertyCacheBucket> &bucket)
711
711
{
712
712
AddPropertyCacheBucket *fromData = &bucket.element ;
713
- if (fromData->GetInitialType (). t == nullptr ||
713
+ if (fromData->GetInitialType () == nullptr ||
714
714
fromData->GetFinalType () == fromData->GetInitialType ())
715
715
{
716
716
return ;
@@ -722,7 +722,7 @@ BackwardPass::MergeSuccBlocksInfo(BasicBlock * block)
722
722
auto fixupTo = [blockSucc, this ](Bucket<AddPropertyCacheBucket> &bucket)
723
723
{
724
724
AddPropertyCacheBucket *toData = &bucket.element ;
725
- if (toData->GetInitialType (). t == nullptr ||
725
+ if (toData->GetInitialType () == nullptr ||
726
726
toData->GetFinalType () == toData->GetInitialType ())
727
727
{
728
728
return ;
@@ -1184,7 +1184,7 @@ BackwardPass::MergeGuardedProperties(ObjTypeGuardBucket bucket1, ObjTypeGuardBuc
1184
1184
ObjTypeGuardBucket bucket;
1185
1185
bucket.SetGuardedPropertyOps (mergedPropertyOps);
1186
1186
JITTypeHolder monoGuardType = bucket1.GetMonoGuardType ();
1187
- if (monoGuardType. t != nullptr )
1187
+ if (monoGuardType != nullptr )
1188
1188
{
1189
1189
Assert (!bucket2.NeedsMonoCheck () || monoGuardType == bucket2.GetMonoGuardType ());
1190
1190
}
@@ -3662,7 +3662,7 @@ BackwardPass::ProcessNewScObject(IR::Instr* instr)
3662
3662
// transition here.
3663
3663
AddPropertyCacheBucket *pBucket = block->stackSymToFinalType ->Get (objSym->m_id );
3664
3664
if (pBucket &&
3665
- pBucket->GetInitialType (). t != nullptr &&
3665
+ pBucket->GetInitialType () != nullptr &&
3666
3666
pBucket->GetFinalType () != pBucket->GetInitialType ())
3667
3667
{
3668
3668
Assert (pBucket->GetInitialType () == ctorCache->GetType ());
@@ -3672,7 +3672,7 @@ BackwardPass::ProcessNewScObject(IR::Instr* instr)
3672
3672
}
3673
3673
#if DBG
3674
3674
pBucket->deadStoreUnavailableInitialType = pBucket->GetInitialType ();
3675
- if (pBucket->deadStoreUnavailableFinalType . t == nullptr )
3675
+ if (pBucket->deadStoreUnavailableFinalType == nullptr )
3676
3676
{
3677
3677
pBucket->deadStoreUnavailableFinalType = pBucket->GetFinalType ();
3678
3678
}
@@ -4256,7 +4256,7 @@ BackwardPass::ProcessPropertySymOpndUse(IR::PropertySymOpnd * opnd)
4256
4256
StackSym *baseSym = opnd->GetObjectSym ();
4257
4257
AddPropertyCacheBucket *pBucket = block->stackSymToFinalType ->Get (baseSym->m_id );
4258
4258
if (pBucket &&
4259
- pBucket->GetFinalType (). t != nullptr &&
4259
+ pBucket->GetFinalType () != nullptr &&
4260
4260
pBucket->GetFinalType () != pBucket->GetInitialType ())
4261
4261
{
4262
4262
this ->InsertTypeTransition (this ->currentInstr ->m_next , baseSym, pBucket);
@@ -4501,7 +4501,7 @@ BackwardPass::TrackAddPropertyTypes(IR::PropertySymOpnd *opnd, BasicBlock *block
4501
4501
JITTypeHolder typeWithProperty = opnd->IsMono () ? opnd->GetType () : opnd->GetFirstEquivalentType ();
4502
4502
JITTypeHolder typeWithoutProperty = opnd->HasInitialType () ? opnd->GetInitialType () : JITTypeHolder (nullptr );
4503
4503
4504
- if (typeWithoutProperty. t == nullptr ||
4504
+ if (typeWithoutProperty == nullptr ||
4505
4505
typeWithProperty == typeWithoutProperty ||
4506
4506
(opnd->IsTypeChecked () && !opnd->IsInitialTypeChecked ()))
4507
4507
{
@@ -4510,7 +4510,7 @@ BackwardPass::TrackAddPropertyTypes(IR::PropertySymOpnd *opnd, BasicBlock *block
4510
4510
PropertySym *propertySym = opnd->m_sym ->AsPropertySym ();
4511
4511
AddPropertyCacheBucket *pBucket =
4512
4512
block->stackSymToFinalType ->Get (propertySym->m_stackSym ->m_id );
4513
- if (pBucket && pBucket->GetFinalType (). t && pBucket->GetInitialType () != pBucket->GetFinalType ())
4513
+ if (pBucket && pBucket->GetFinalType () != nullptr && pBucket->GetInitialType () != pBucket->GetFinalType ())
4514
4514
{
4515
4515
opnd->SetFinalType (pBucket->GetFinalType ());
4516
4516
}
@@ -4519,12 +4519,13 @@ BackwardPass::TrackAddPropertyTypes(IR::PropertySymOpnd *opnd, BasicBlock *block
4519
4519
return ;
4520
4520
}
4521
4521
4522
- #if 0 // TODO: OOP JIT, add these assert back (ReadProcessMemory?)
4522
+ #if DBG
4523
4523
Assert (typeWithProperty != nullptr );
4524
- Js::DynamicTypeHandler * typeWithoutPropertyTypeHandler = static_cast<Js::DynamicType *>(typeWithoutProperty)->GetTypeHandler();
4525
- Js::DynamicTypeHandler * typeWithPropertyTypeHandler = static_cast<Js::DynamicType *>(typeWithProperty)->GetTypeHandler();
4526
- Assert(typeWithoutPropertyTypeHandler->GetPropertyCount() + 1 == typeWithPropertyTypeHandler->GetPropertyCount());
4527
- AssertMsg(Js::DynamicObject::IsTypeHandlerCompatibleForObjectHeaderInlining(typeWithoutPropertyTypeHandler, typeWithPropertyTypeHandler),
4524
+ const JITTypeHandler * typeWithoutPropertyTypeHandler = typeWithoutProperty->GetTypeHandler ();
4525
+ const JITTypeHandler * typeWithPropertyTypeHandler = typeWithProperty->GetTypeHandler ();
4526
+ // TODO: OOP JIT, reenable assert
4527
+ // Assert(typeWithoutPropertyTypeHandler->GetPropertyCount() + 1 == typeWithPropertyTypeHandler->GetPropertyCount());
4528
+ AssertMsg (JITTypeHandler::IsTypeHandlerCompatibleForObjectHeaderInlining (typeWithoutPropertyTypeHandler, typeWithPropertyTypeHandler),
4528
4529
" TypeHandlers are not compatible for transition?" );
4529
4530
Assert (typeWithoutPropertyTypeHandler->GetSlotCapacity () <= typeWithPropertyTypeHandler->GetSlotCapacity ());
4530
4531
#endif
@@ -4545,7 +4546,7 @@ BackwardPass::TrackAddPropertyTypes(IR::PropertySymOpnd *opnd, BasicBlock *block
4545
4546
#if DBG
4546
4547
JITTypeHolder deadStoreUnavailableFinalType (nullptr );
4547
4548
#endif
4548
- if (pBucket->GetInitialType (). t == nullptr || opnd->GetType () != pBucket->GetInitialType ())
4549
+ if (pBucket->GetInitialType () == nullptr || opnd->GetType () != pBucket->GetInitialType ())
4549
4550
{
4550
4551
#if DBG
4551
4552
if (opnd->GetType () == pBucket->deadStoreUnavailableInitialType )
@@ -4571,7 +4572,7 @@ BackwardPass::TrackAddPropertyTypes(IR::PropertySymOpnd *opnd, BasicBlock *block
4571
4572
4572
4573
if (!PHASE_OFF (Js::ObjTypeSpecStorePhase, this ->func ))
4573
4574
{
4574
- #if 0 //TODO: OOP JIT, reenable assert
4575
+ #if DBG
4575
4576
4576
4577
// We may regress in this case:
4577
4578
// if (b)
@@ -4592,15 +4593,17 @@ BackwardPass::TrackAddPropertyTypes(IR::PropertySymOpnd *opnd, BasicBlock *block
4592
4593
if (!opnd->IsTypeDead ())
4593
4594
{
4594
4595
// This is the type that would have been propagated if we didn't kill it because the type isn't available
4595
- JITTypeHolder checkFinalType = deadStoreUnavailableFinalType ? deadStoreUnavailableFinalType : finalType;
4596
+ JITTypeHolder checkFinalType = deadStoreUnavailableFinalType != nullptr ? deadStoreUnavailableFinalType : finalType;
4596
4597
if (opnd->HasFinalType () && opnd->GetFinalType () != checkFinalType)
4597
4598
{
4598
4599
// Final type discovery must be progressively better (unless we kill it in the deadstore pass
4599
4600
// when the type is not available during the forward pass)
4600
- Js::DynamicTypeHandler * oldFinalTypeHandler = static_cast<Js::DynamicType *>(opnd->GetFinalType())->GetTypeHandler();
4601
- Js::DynamicTypeHandler * checkFinalTypeHandler = static_cast<Js::DynamicType *>(checkFinalType)->GetTypeHandler();
4602
- Assert(oldFinalTypeHandler->GetPropertyCount() < checkFinalTypeHandler->GetPropertyCount());
4603
- AssertMsg(Js::DynamicObject::IsTypeHandlerCompatibleForObjectHeaderInlining(oldFinalTypeHandler, checkFinalTypeHandler),
4601
+ const JITTypeHandler * oldFinalTypeHandler = opnd->GetFinalType ()->GetTypeHandler ();
4602
+ const JITTypeHandler * checkFinalTypeHandler = checkFinalType->GetTypeHandler ();
4603
+
4604
+ // TODO: OOP JIT, enable assert
4605
+ // Assert(oldFinalTypeHandler->GetPropertyCount() < checkFinalTypeHandler->GetPropertyCount());
4606
+ AssertMsg (JITTypeHandler::IsTypeHandlerCompatibleForObjectHeaderInlining (oldFinalTypeHandler, checkFinalTypeHandler),
4604
4607
" TypeHandlers should be compatible for transition." );
4605
4608
Assert (oldFinalTypeHandler->GetSlotCapacity () <= checkFinalTypeHandler->GetSlotCapacity ());
4606
4609
}
@@ -4644,7 +4647,7 @@ BackwardPass::TrackAddPropertyTypes(IR::PropertySymOpnd *opnd, BasicBlock *block
4644
4647
{
4645
4648
#if DBG
4646
4649
pBucket->deadStoreUnavailableInitialType = pBucket->GetInitialType ();
4647
- if (pBucket->deadStoreUnavailableFinalType . t == nullptr )
4650
+ if (pBucket->deadStoreUnavailableFinalType == nullptr )
4648
4651
{
4649
4652
pBucket->deadStoreUnavailableFinalType = pBucket->GetFinalType ();
4650
4653
}
@@ -4671,11 +4674,11 @@ BackwardPass::InsertTypeTransition(IR::Instr *instrInsertBefore, StackSym *objSy
4671
4674
baseOpnd->SetIsJITOptimizedReg (true );
4672
4675
4673
4676
IR::AddrOpnd *initialTypeOpnd =
4674
- IR::AddrOpnd::New (data->GetInitialType (). t ->GetAddr (), IR::AddrOpndKindDynamicType, this ->func );
4677
+ IR::AddrOpnd::New (data->GetInitialType ()->GetAddr (), IR::AddrOpndKindDynamicType, this ->func );
4675
4678
initialTypeOpnd->m_metadata = data->GetInitialType ().t ;
4676
4679
4677
4680
IR::AddrOpnd *finalTypeOpnd =
4678
- IR::AddrOpnd::New (data->GetFinalType (). t ->GetAddr (), IR::AddrOpndKindDynamicType, this ->func );
4681
+ IR::AddrOpnd::New (data->GetFinalType ()->GetAddr (), IR::AddrOpndKindDynamicType, this ->func );
4679
4682
finalTypeOpnd->m_metadata = data->GetFinalType ().t ;
4680
4683
4681
4684
IR::Instr *adjustTypeInstr =
@@ -4722,8 +4725,8 @@ BackwardPass::InsertTypeTransitionAtBlock(BasicBlock *block, int symId, AddPrope
4722
4725
{
4723
4726
// This symbol already has a type transition at this point.
4724
4727
// It *must* be doing the same transition we're already trying to do.
4725
- Assert ((intptr_t )instr->GetDst ()->AsAddrOpnd ()->m_address == data->GetFinalType (). t ->GetAddr () &&
4726
- (intptr_t )instr->GetSrc2 ()->AsAddrOpnd ()->m_address == data->GetInitialType (). t ->GetAddr ());
4728
+ Assert ((intptr_t )instr->GetDst ()->AsAddrOpnd ()->m_address == data->GetFinalType ()->GetAddr () &&
4729
+ (intptr_t )instr->GetSrc2 ()->AsAddrOpnd ()->m_address == data->GetInitialType ()->GetAddr ());
4727
4730
// Nothing to do.
4728
4731
return ;
4729
4732
}
@@ -4824,7 +4827,7 @@ BackwardPass::ForEachAddPropertyCacheBucket(Fn fn)
4824
4827
FOREACH_HASHTABLE_ENTRY (AddPropertyCacheBucket, bucket, block->stackSymToFinalType )
4825
4828
{
4826
4829
AddPropertyCacheBucket *data = &bucket.element ;
4827
- if (data->GetInitialType (). t != nullptr &&
4830
+ if (data->GetInitialType () != nullptr &&
4828
4831
data->GetInitialType () != data->GetFinalType ())
4829
4832
{
4830
4833
bool done = fn (bucket.value , data);
@@ -4841,22 +4844,22 @@ bool
4841
4844
BackwardPass::TransitionUndoesObjectHeaderInlining (AddPropertyCacheBucket *data) const
4842
4845
{
4843
4846
JITTypeHolder type = data->GetInitialType ();
4844
- if (type. t == nullptr || !Js::DynamicType::Is (type. t ->GetTypeId ()))
4847
+ if (type == nullptr || !Js::DynamicType::Is (type->GetTypeId ()))
4845
4848
{
4846
4849
return false ;
4847
4850
}
4848
4851
4849
- if (!type. t ->GetTypeHandler ()->IsObjectHeaderInlinedTypeHandler ())
4852
+ if (!type->GetTypeHandler ()->IsObjectHeaderInlinedTypeHandler ())
4850
4853
{
4851
4854
return false ;
4852
4855
}
4853
4856
4854
4857
type = data->GetFinalType ();
4855
- if (type. t == nullptr || !Js::DynamicType::Is (type. t ->GetTypeId ()))
4858
+ if (type == nullptr || !Js::DynamicType::Is (type->GetTypeId ()))
4856
4859
{
4857
4860
return false ;
4858
4861
}
4859
- return !type. t ->GetTypeHandler ()->IsObjectHeaderInlinedTypeHandler ();
4862
+ return !type->GetTypeHandler ()->IsObjectHeaderInlinedTypeHandler ();
4860
4863
}
4861
4864
4862
4865
void
0 commit comments