From 74ada595d80e15126867787dba2df674b560e6ab Mon Sep 17 00:00:00 2001 From: Julian Wang Date: Wed, 13 Nov 2019 18:34:55 -0500 Subject: [PATCH] Fix JNI performance regression 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 --- .../compiler/p/codegen/J9CodeGenerator.cpp | 17 +++++++++++++++ .../compiler/p/codegen/J9CodeGenerator.hpp | 2 ++ .../compiler/p/codegen/J9TreeEvaluator.cpp | 21 +------------------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/runtime/compiler/p/codegen/J9CodeGenerator.cpp b/runtime/compiler/p/codegen/J9CodeGenerator.cpp index c93c9321304..7bba2ebbfc6 100644 --- a/runtime/compiler/p/codegen/J9CodeGenerator.cpp +++ b/runtime/compiler/p/codegen/J9CodeGenerator.cpp @@ -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()); + } diff --git a/runtime/compiler/p/codegen/J9CodeGenerator.hpp b/runtime/compiler/p/codegen/J9CodeGenerator.hpp index 20b6feb4c36..89bb79c0a8d 100644 --- a/runtime/compiler/p/codegen/J9CodeGenerator.hpp +++ b/runtime/compiler/p/codegen/J9CodeGenerator.hpp @@ -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(); diff --git a/runtime/compiler/p/codegen/J9TreeEvaluator.cpp b/runtime/compiler/p/codegen/J9TreeEvaluator.cpp index 7754ddf46f9..d1aae4f5491 100644 --- a/runtime/compiler/p/codegen/J9TreeEvaluator.cpp +++ b/runtime/compiler/p/codegen/J9TreeEvaluator.cpp @@ -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 @@ -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); }