@@ -1603,7 +1603,7 @@ UDATA TR_J9VMBase::getOffsetOfClassFromJavaLangClassField()
1603
1603
1604
1604
UDATA TR_J9VMBase::getOffsetOfRamStaticsFromClassField () {return offsetof (J9Class, ramStatics);}
1605
1605
UDATA TR_J9VMBase::getOffsetOfIsArrayFieldFromRomClass () {return offsetof (J9ROMClass, modifiers);}
1606
- UDATA TR_J9VMBase::getOffsetOfClassAndDepthFlags () {return offsetof (J9Class, classDepthAndFlags);}
1606
+ UDATA TR_J9VMBase::getOffsetOfClassDepthAndFlags () {return offsetof (J9Class, classDepthAndFlags);}
1607
1607
UDATA TR_J9VMBase::getOffsetOfClassFlags () {return offsetof (J9Class, classFlags);}
1608
1608
UDATA TR_J9VMBase::getOffsetOfArrayComponentTypeField () {return offsetof (J9ArrayClass, componentType);}
1609
1609
UDATA TR_J9VMBase::constReleaseVMAccessOutOfLineMask () {return J9_PUBLIC_FLAGS_VMACCESS_RELEASE_BITS;}
@@ -2902,13 +2902,56 @@ TR_J9VMBase::testIsClassIdentityType(TR::Node *j9ClassRefNode)
2902
2902
}
2903
2903
2904
2904
TR::Node *
2905
- TR_J9VMBase::checkSomeArrayCompClassFlags (TR::Node *arrayBaseAddressNode, TR::ILOpCodes ifCmpOp, uint32_t flagsToTest)
2905
+ TR_J9VMBase::loadClassDepthAndFlags (TR::Node *j9ClassRefNode)
2906
+ {
2907
+ TR::SymbolReference *classDepthAndFlagsSymRef = TR::comp ()->getSymRefTab ()->findOrCreateClassDepthAndFlagsSymbolRef ();
2908
+
2909
+ TR::Node *classFlagsNode = NULL ;
2910
+
2911
+ if (TR::comp ()->target ().is32Bit ())
2912
+ {
2913
+ classFlagsNode = TR::Node::createWithSymRef (TR::iloadi, 1 , 1 , j9ClassRefNode, classDepthAndFlagsSymRef);
2914
+ }
2915
+ else
2916
+ {
2917
+ classFlagsNode = TR::Node::createWithSymRef (TR::lloadi, 1 , 1 , j9ClassRefNode, classDepthAndFlagsSymRef);
2918
+ classFlagsNode = TR::Node::create (TR::l2i, 1 , classFlagsNode);
2919
+ }
2920
+
2921
+ return classFlagsNode;
2922
+ }
2923
+
2924
+ TR::Node *
2925
+ TR_J9VMBase::testAreSomeClassDepthAndFlagsSet (TR::Node *j9ClassRefNode, uint32_t flagsToTest)
2926
+ {
2927
+ TR::Node *classFlags = loadClassDepthAndFlags (j9ClassRefNode);
2928
+ TR::Node *maskedFlags = TR::Node::create (TR::iand, 2 , classFlags, TR::Node::iconst (j9ClassRefNode, flagsToTest));
2929
+
2930
+ return maskedFlags;
2931
+ }
2932
+
2933
+ TR::Node *
2934
+ TR_J9VMBase::testIsClassArrayType (TR::Node *j9ClassRefNode)
2935
+ {
2936
+ return testAreSomeClassDepthAndFlagsSet (j9ClassRefNode, getFlagValueForArrayCheck ());
2937
+ }
2938
+
2939
+ TR::Node *
2940
+ TR_J9VMBase::loadArrayClassComponentType (TR::Node *j9ClassRefNode)
2906
2941
{
2907
- TR::SymbolReference *vftSymRef = TR::comp ()->getSymRefTab ()->findOrCreateVftSymbolRef ();
2908
2942
TR::SymbolReference *arrayCompSymRef = TR::comp ()->getSymRefTab ()->findOrCreateArrayComponentTypeSymbolRef ();
2943
+ TR::Node *arrayCompClass = TR::Node::createWithSymRef (TR::aloadi, 1 , 1 , j9ClassRefNode, arrayCompSymRef);
2909
2944
2945
+ return arrayCompClass;
2946
+ }
2947
+
2948
+ TR::Node *
2949
+ TR_J9VMBase::checkSomeArrayCompClassFlags (TR::Node *arrayBaseAddressNode, TR::ILOpCodes ifCmpOp, uint32_t flagsToTest)
2950
+ {
2951
+ TR::SymbolReference *vftSymRef = TR::comp ()->getSymRefTab ()->findOrCreateVftSymbolRef ();
2910
2952
TR::Node *vft = TR::Node::createWithSymRef (TR::aloadi, 1 , 1 , arrayBaseAddressNode, vftSymRef);
2911
- TR::Node *arrayCompClass = TR::Node::createWithSymRef (TR::aloadi, 1 , 1 , vft, arrayCompSymRef);
2953
+
2954
+ TR::Node *arrayCompClass = loadArrayClassComponentType (vft);
2912
2955
TR::Node *maskedFlagsNode = testAreSomeClassFlagsSet (arrayCompClass, flagsToTest);
2913
2956
TR::Node *ifNode = TR::Node::createif (ifCmpOp, maskedFlagsNode, TR::Node::iconst (arrayBaseAddressNode, 0 ));
2914
2957
@@ -7408,14 +7451,14 @@ TR_J9VM::transformJavaLangClassIsArray(TR::Compilation * comp, TR::Node * callNo
7408
7451
// treetop
7409
7452
// iushr
7410
7453
// iand
7411
- // iloadi <classAndDepthFlags >
7454
+ // iloadi <ClassDepthAndFlags >
7412
7455
// aloadi <classFromJavaLangClass>
7413
7456
// aload <parm 1> <= jlClass
7414
7457
// iconst J9AccClassArray
7415
7458
// iconst shiftAmount
7416
7459
7417
- int andMask = comp->fej9 ()->getFlagValueForArrayCheck ();
7418
- TR::Node * classFlag , *jlClass, * andConstNode ;
7460
+ int flagMask = comp->fej9 ()->getFlagValueForArrayCheck ();
7461
+ TR::Node * classFlagNode , *jlClass;
7419
7462
TR::SymbolReferenceTable *symRefTab = comp->getSymRefTab ();
7420
7463
7421
7464
jlClass = callNode->getFirstChild ();
@@ -7435,26 +7478,16 @@ TR_J9VM::transformJavaLangClassIsArray(TR::Compilation * comp, TR::Node * callNo
7435
7478
7436
7479
TR::Node * vftLoad = TR::Node::createWithSymRef (callNode, TR::aloadi, 1 , jlClass, comp->getSymRefTab ()->findOrCreateClassFromJavaLangClassSymbolRef ());
7437
7480
7438
- if (comp->target ().is32Bit ())
7439
- {
7440
- classFlag = TR::Node::createWithSymRef (callNode, TR::iloadi, 1 , vftLoad, symRefTab->findOrCreateClassAndDepthFlagsSymbolRef ());
7441
- }
7442
- else
7443
- {
7444
- classFlag = TR::Node::createWithSymRef (callNode, TR::lloadi, 1 , vftLoad, symRefTab->findOrCreateClassAndDepthFlagsSymbolRef ());
7445
- classFlag = TR::Node::create (callNode, TR::l2i, 1 , classFlag);
7446
- }
7481
+ classFlagNode = testIsClassArrayType (vftLoad);
7447
7482
7448
7483
// Decrement the ref count of jlClass since the call is going to be transmuted and its first child is not needed anymore
7449
7484
callNode->getAndDecChild (0 );
7450
7485
TR::Node::recreate (callNode, TR::iushr);
7451
7486
callNode->setNumChildren (2 );
7452
7487
7453
- andConstNode = TR::Node::create (callNode, TR::iconst, 0 , andMask);
7454
- TR::Node * andNode = TR::Node::create (TR::iand, 2 , classFlag, andConstNode);
7455
- callNode->setAndIncChild (0 , andNode);
7488
+ callNode->setAndIncChild (0 , classFlagNode);
7456
7489
7457
- int32_t shiftAmount = trailingZeroes (andMask );
7490
+ int32_t shiftAmount = trailingZeroes (flagMask );
7458
7491
callNode->setAndIncChild (1 , TR::Node::iconst (callNode, shiftAmount));
7459
7492
}
7460
7493
@@ -7642,6 +7675,7 @@ TR_J9VM::inlineNativeCall(TR::Compilation * comp, TR::TreeTop * callNodeTreeTop,
7642
7675
TR::Node::recreate (callNode, TR::aloadi);
7643
7676
callNode->setSymbolReference (comp->getSymRefTab ()->findOrCreateVftSymbolRef ());
7644
7677
callNode = TR::Node::createWithSymRef (TR::aloadi, 1 , 1 , callNode, comp->getSymRefTab ()->findOrCreateJavaLangClassFromClassSymbolRef ());
7678
+ callNode->setIsNonNull (true );
7645
7679
return callNode;
7646
7680
7647
7681
case TR::java_lang_Class_getStackClass:
@@ -8363,13 +8397,13 @@ TR_J9VM::inlineNativeCall(TR::Compilation * comp, TR::TreeTop * callNodeTreeTop,
8363
8397
case TR::com_ibm_jit_JITHelpers_getClassDepthAndFlagsFromJ9Class32:
8364
8398
{
8365
8399
loadOp = TR::iloadi;
8366
- newSymRef = comp->getSymRefTab ()->findOrCreateClassAndDepthFlagsSymbolRef ();
8400
+ newSymRef = comp->getSymRefTab ()->findOrCreateClassDepthAndFlagsSymbolRef ();
8367
8401
break ;
8368
8402
}
8369
8403
case TR::com_ibm_jit_JITHelpers_getClassDepthAndFlagsFromJ9Class64:
8370
8404
{
8371
8405
loadOp = TR::lloadi;
8372
- newSymRef = comp->getSymRefTab ()->findOrCreateClassAndDepthFlagsSymbolRef ();
8406
+ newSymRef = comp->getSymRefTab ()->findOrCreateClassDepthAndFlagsSymbolRef ();
8373
8407
break ;
8374
8408
}
8375
8409
case TR::com_ibm_jit_JITHelpers_getComponentTypeFromJ9Class32:
0 commit comments