Skip to content

Commit

Permalink
Fix JNI performance regression
Browse files Browse the repository at this point in the history
This is to check in OpenJ9 side refactoring first before OMR side fix can be check
in.

It was caused by changes committed for OpenJ9 issue #4893. When JNILinkage is not
set on the method symbol anymore, OutOfLine performCall eventully evaluated it
through PrivateLinkage and stuck in interpreter. The fundamental reason is that
a new node is created for performCall but the isPreparedForJNI flag is not copied
over and performCall doesn't get the linkage right.

Signed-off-by: Julian Wang <zlwang@ca.ibm.com>
  • Loading branch information
zl-wang committed Nov 13, 2019
1 parent f06058c commit 74ada59
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 20 deletions.
17 changes: 17 additions & 0 deletions runtime/compiler/p/codegen/J9CodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -735,3 +735,20 @@ J9::Power::CodeGenerator::insertPrefetchIfNecessary(TR::Node *node, TR::Register
}
}

TR::Linkage *
J9::Power::CodeGenerator::deriveCallingLinkage(TR::Node *node, bool isIndirect)
{
TR::SymbolReference *symRef = node->getSymbolReference();
TR::MethodSymbol *callee = symRef->getSymbol()->castToMethodSymbol();
TR_J9VMBase *fej9 = (TR_J9VMBase *)(self()->fe());

static char * disableDirectNativeCall = feGetEnv("TR_DisableDirectNativeCall");

// Clean-up: the fej9 checking seemed unnecessary
if (!isIndirect && callee->isJNI() && fej9->canRelocateDirectNativeCalls() &&
(node->isPreparedForDirectJNI() ||
(disableDirectNativeCall == NULL && callee->getResolvedMethodSymbol()->canDirectNativeCall())))
return self()->getLinkage(TR_J9JNILinkage);

return self()->getLinkage(callee->getLinkageConvention());
}
2 changes: 2 additions & 0 deletions runtime/compiler/p/codegen/J9CodeGenerator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ class OMR_EXTENSIBLE CodeGenerator : public J9::CodeGenerator

bool inlineDirectCall(TR::Node *node, TR::Register *&resultReg);

TR::Linkage *deriveCallingLinkage(TR::Node *node, bool isIndirect);

bool suppressInliningOfRecognizedMethod(TR::RecognizedMethod method);

bool enableAESInHardwareTransformations();
Expand Down
21 changes: 1 addition & 20 deletions runtime/compiler/p/codegen/J9TreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13318,25 +13318,9 @@ TR::Register *J9::Power::TreeEvaluator::directCallEvaluator(TR::Node *node, TR::
TR::MethodSymbol *callee = symRef->getSymbol()->castToMethodSymbol();
TR::Linkage *linkage;
TR::Register *returnRegister;
bool doJNIDirectDispatch = false;

TR_J9VMBase *fej9 = (TR_J9VMBase *)(cg->fe());

if(callee->isJNI() && callee->getLinkageConvention() != TR_J9JNILinkage)
{
//This needs a cleanup, canRelocateDirectNativeCalls() might go away soon.
//Too many checks here, can we simplify this?

static char * disableDirectNativeCall = feGetEnv("TR_DisableDirectNativeCall");
doJNIDirectDispatch = fej9->canRelocateDirectNativeCalls() &&
(node->isPreparedForDirectJNI() ||
(disableDirectNativeCall == NULL && callee->getResolvedMethodSymbol()->canDirectNativeCall()));

}

if (!cg->inlineDirectCall(node, returnRegister))
{
TR::SymbolReference *symRef = node->getSymbolReference();
TR::SymbolReferenceTable *symRefTab = cg->comp()->getSymRefTab();

// Non-helpers supported by code gen. are expected to be inlined
Expand All @@ -13347,10 +13331,7 @@ TR::Register *J9::Power::TreeEvaluator::directCallEvaluator(TR::Node *node, TR::
symRefTab->getNonHelperSymbol(symRef));
}

if(doJNIDirectDispatch)
linkage = cg->getLinkage(TR_J9JNILinkage);
else
linkage = cg->getLinkage(callee->getLinkageConvention());
linkage = cg->deriveCallingLinkage(node, false);
returnRegister = linkage->buildDirectDispatch(node);
}

Expand Down

0 comments on commit 74ada59

Please sign in to comment.