Skip to content

Commit fc778d6

Browse files
authored
Merge pull request eclipse-openj9#20590 from matthewhall2/assignableFrom_useCHelper
Change Class.isAssignableFrom to use CHelper instead of JNI call on Z
2 parents 3aff572 + 024edf7 commit fc778d6

File tree

5 files changed

+56
-1
lines changed

5 files changed

+56
-1
lines changed

runtime/compiler/z/codegen/J9CodeGenerator.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -3815,6 +3815,11 @@ J9::Z::CodeGenerator::inlineDirectCall(
38153815
ReduceSynchronizedFieldLoad::inlineSynchronizedFieldLoad(node, cg);
38163816
return true;
38173817
}
3818+
else if (node->getSymbolReference()->getReferenceNumber() == TR_checkAssignable)
3819+
{
3820+
resultReg = TR::TreeEvaluator::inlineCheckAssignableFromEvaluator(node, cg);
3821+
return true;
3822+
}
38183823

38193824
static const char * enableTRTRE = feGetEnv("TR_enableTRTRE");
38203825
static bool disableCAEIntrinsic = feGetEnv("TR_DisableCAEIntrinsic") != NULL;

runtime/compiler/z/codegen/J9TreeEvaluator.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -11740,6 +11740,42 @@ static bool inlineIsAssignableFrom(TR::Node *node, TR::CodeGenerator *cg)
1174011740
return true;
1174111741
}
1174211742

11743+
TR::Register *J9::Z::TreeEvaluator::inlineCheckAssignableFromEvaluator(TR::Node *node, TR::CodeGenerator *cg)
11744+
{
11745+
TR::Register *thisClassReg = cg->evaluate(node->getFirstChild());
11746+
TR::Register *checkClassReg = cg->evaluate(node->getSecondChild());
11747+
11748+
TR::Register *resultReg = cg->allocateRegister();
11749+
TR::LabelSymbol *helperCallLabel = generateLabelSymbol(cg);
11750+
TR::LabelSymbol *doneLabel = generateLabelSymbol(cg);
11751+
11752+
TR::RegisterDependencyConditions* deps = new (cg->trHeapMemory()) TR::RegisterDependencyConditions(0, 3, cg);
11753+
deps->addPostCondition(thisClassReg, TR::RealRegister::AssignAny);
11754+
deps->addPostConditionIfNotAlreadyInserted(checkClassReg, TR::RealRegister::AssignAny);
11755+
deps->addPostCondition(resultReg, TR::RealRegister::AssignAny);
11756+
11757+
/*
11758+
* TODO: add inlined tests (classEqualityTest, SuperclassTest, etc)
11759+
* Inlined tests will be used when possible, or will jump to the OOL section
11760+
* and perform the tests using the CHelper when not possible
11761+
*/
11762+
11763+
generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_BRC, node, helperCallLabel);
11764+
TR_S390OutOfLineCodeSection *outlinedSlowPath = new (cg->trHeapMemory()) TR_S390OutOfLineCodeSection(helperCallLabel, doneLabel, cg);
11765+
cg->getS390OutOfLineCodeSectionList().push_front(outlinedSlowPath);
11766+
outlinedSlowPath->swapInstructionListsWithCompilation();
11767+
11768+
generateS390LabelInstruction(cg, TR::InstOpCode::label, node, helperCallLabel);
11769+
resultReg = TR::TreeEvaluator::performCall(node, false, cg);
11770+
11771+
generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_BRC, node, doneLabel); // exit OOL section
11772+
outlinedSlowPath->swapInstructionListsWithCompilation();
11773+
11774+
generateS390LabelInstruction(cg, TR::InstOpCode::label, node, doneLabel, deps);
11775+
node->setRegister(resultReg);
11776+
11777+
return resultReg;
11778+
}
1174311779

1174411780
bool
1174511781
J9::Z::TreeEvaluator::VMinlineCallEvaluator(TR::Node * node, bool indirect, TR::CodeGenerator * cg)

runtime/compiler/z/codegen/J9TreeEvaluator.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ class OMR_EXTENSIBLE TreeEvaluator: public J9::TreeEvaluator
226226
static TR::Register *resolveAndNULLCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
227227
static TR::Register *evaluateNULLCHKWithPossibleResolve(TR::Node *node, bool needResolution, TR::CodeGenerator *cg);
228228
static float interpreterProfilingInstanceOfOrCheckCastTopProb(TR::CodeGenerator * cg, TR::Node * node);
229+
static TR::Register *inlineCheckAssignableFromEvaluator(TR::Node *node, TR::CodeGenerator *cg);
229230

230231
/**
231232
* \brief

runtime/compiler/z/codegen/S390CHelperLinkage.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,18 @@ class RealRegisterManager
250250
TR::CodeGenerator* _cg;
251251
};
252252

253+
bool J9::Z::CHelperLinkage::getIsFastPathOnly(TR::Node * callNode)
254+
{
255+
auto opCode = callNode->getOpCodeValue();
256+
if (opCode == TR::instanceof)
257+
{
258+
return true;
259+
}
260+
261+
TR::SymbolReference * ref = callNode->getSymbolReference();
262+
return ref == cg()->comp()->getSymRefTab()->findOrCreateRuntimeHelper(TR_checkAssignable);
263+
}
264+
253265
/** \brief Build a JIT helper call.
254266
* \details
255267
* It generates sequence that prepares parameters for the JIT helper function and generate a helper call.
@@ -264,7 +276,7 @@ TR::Register * J9::Z::CHelperLinkage::buildDirectDispatch(TR::Node * callNode, T
264276
RealRegisterManager RealRegisters(cg());
265277
bool isHelperCallWithinICF = deps != NULL;
266278
// TODO: Currently only jitInstanceOf is fast path helper. Need to modify following condition if we add support for other fast path only helpers
267-
bool isFastPathOnly = callNode->getOpCodeValue() == TR::instanceof;
279+
bool isFastPathOnly = getIsFastPathOnly(callNode);
268280
traceMsg(comp(),"%s: Internal Control Flow in OOL : %s\n",callNode->getOpCode().getName(),isHelperCallWithinICF ? "true" : "false" );
269281
for (int i = TR::RealRegister::FirstGPR; i < TR::RealRegister::NumRegisters; i++)
270282
{

runtime/compiler/z/codegen/S390CHelperLinkage.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class CHelperLinkage : public TR::Linkage
3939
uint32_t _preservedRegisterMapForGC;
4040
TR::RealRegister::RegNum _methodMetaDataRegister;
4141
TR::RealRegister::RegNum _returnAddressRegister;
42+
bool getIsFastPathOnly(TR::Node * callNode);
4243
// Following Regs are needed only in the case of zOS.
4344
#if defined(J9ZOS390)
4445
TR::RealRegister::RegNum _DSAPointerRegister;

0 commit comments

Comments
 (0)