From 6fbe691867e8e65dff0b488da7dcb68e270c9913 Mon Sep 17 00:00:00 2001 From: Dhruv Chopra Date: Thu, 24 Sep 2020 10:43:52 -0400 Subject: [PATCH 1/4] Avoid PC-relative instructions for fieldwatch support For relocatable compiles such as remote compilations, fieldwatch should not generate PC relative instructions because it is not supported. Signed-off-by: Dhruv Chopra --- runtime/compiler/z/codegen/J9TreeEvaluator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/compiler/z/codegen/J9TreeEvaluator.cpp b/runtime/compiler/z/codegen/J9TreeEvaluator.cpp index 677e9801ff7..31805576893 100644 --- a/runtime/compiler/z/codegen/J9TreeEvaluator.cpp +++ b/runtime/compiler/z/codegen/J9TreeEvaluator.cpp @@ -4002,7 +4002,7 @@ J9::Z::TreeEvaluator::generateTestAndReportFieldWatchInstructions(TR::CodeGenera if (isResolved) { fieldClassReg = cg->allocateRegister(); - if (!(cg->needClassAndMethodPointerRelocations())) + if (!(cg->needClassAndMethodPointerRelocations()) && cg->canUseRelativeLongInstructions(reinterpret_cast((static_cast(dataSnippet)->getFieldClass())))) { // For non-AOT (JIT and JITServer) compiles we don't need to use sideEffectRegister here as the class information is available to us at compile time. J9Class *fieldClass = static_cast(dataSnippet)->getFieldClass(); From 3156e0d751c3ec12f42e88a6b170039d8a754ab6 Mon Sep 17 00:00:00 2001 From: Dhruv Chopra Date: Thu, 24 Sep 2020 10:47:01 -0400 Subject: [PATCH 2/4] Set isVettedForAOT to true in ArrayStoreCHK evaluator When looking for the java/lang/Object class by name in the TR::ArrayStoreCHK evaluator, isVettedForAOT was set to false for remote compilations. This is incorrect and we shouldn't restrict this. Moreover, it can prevent CLGRL from being generated when it should be generated. Signed-off-by: Dhruv Chopra --- runtime/compiler/z/codegen/J9TreeEvaluator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/compiler/z/codegen/J9TreeEvaluator.cpp b/runtime/compiler/z/codegen/J9TreeEvaluator.cpp index 31805576893..85b0d32ee99 100644 --- a/runtime/compiler/z/codegen/J9TreeEvaluator.cpp +++ b/runtime/compiler/z/codegen/J9TreeEvaluator.cpp @@ -4822,7 +4822,7 @@ VMarrayStoreCHKEvaluator( if (debugObj) debugObj->addInstructionComment(cursor, "Check if src.type == array.type"); - intptr_t objectClass = (intptr_t) fej9->getSystemClassFromClassName("java/lang/Object", 16, !cg->comp()->isOutOfProcessCompilation()); + intptr_t objectClass = (intptr_t) fej9->getSystemClassFromClassName("java/lang/Object", 16, true); /* * objectClass is used for Object arrays check optimization: when we are storing to Object arrays we can skip all other array store checks * However, TR_J9SharedCacheVM::getSystemClassFromClassName can return 0 when it's impossible to relocate j9class later for AOT loads From 1f0a80379bf265b2414e6b9cd1af02e11c214f38 Mon Sep 17 00:00:00 2001 From: Dhruv Chopra Date: Thu, 24 Sep 2020 10:52:58 -0400 Subject: [PATCH 3/4] Call base implementation of getSystemClassFromClassName For the VM_getSystemClassFromClassName JITServer message type, the base implementation of getSystemClassFromClassName should always be called, even for AOT compilations. This is because the validation is done on the server. Signed-off-by: Dhruv Chopra --- runtime/compiler/control/JITClientCompilationThread.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/runtime/compiler/control/JITClientCompilationThread.cpp b/runtime/compiler/control/JITClientCompilationThread.cpp index ea368fc1f5f..df2da6bc4d6 100644 --- a/runtime/compiler/control/JITClientCompilationThread.cpp +++ b/runtime/compiler/control/JITClientCompilationThread.cpp @@ -258,7 +258,9 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes auto recv = client->getRecvData(); const std::string name = std::get<0>(recv); bool isVettedForAOT = std::get<1>(recv); - client->write(response, fe->getSystemClassFromClassName(name.c_str(), name.length(), isVettedForAOT)); + // Always need non-AOT front-end here, since class validation is done on the server + TR_J9VMBase *fej9 = TR_J9VMBase::get(vmThread->javaVM->jitConfig, vmThread); + client->write(response, fej9->getSystemClassFromClassName(name.c_str(), name.length(), isVettedForAOT)); } break; case MessageType::VM_isMethodTracingEnabled: From 9fb8ed54ff2897cf9b99f24013aaeaa97b7bd18f Mon Sep 17 00:00:00 2001 From: Dhruv Chopra Date: Thu, 24 Sep 2020 17:32:12 -0400 Subject: [PATCH 4/4] Common up fieldClass definition Signed-off-by: Dhruv Chopra --- runtime/compiler/z/codegen/J9TreeEvaluator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/compiler/z/codegen/J9TreeEvaluator.cpp b/runtime/compiler/z/codegen/J9TreeEvaluator.cpp index 85b0d32ee99..2eef77a0bf9 100644 --- a/runtime/compiler/z/codegen/J9TreeEvaluator.cpp +++ b/runtime/compiler/z/codegen/J9TreeEvaluator.cpp @@ -4002,10 +4002,10 @@ J9::Z::TreeEvaluator::generateTestAndReportFieldWatchInstructions(TR::CodeGenera if (isResolved) { fieldClassReg = cg->allocateRegister(); - if (!(cg->needClassAndMethodPointerRelocations()) && cg->canUseRelativeLongInstructions(reinterpret_cast((static_cast(dataSnippet)->getFieldClass())))) + J9Class *fieldClass = static_cast(dataSnippet)->getFieldClass(); + if (!(cg->needClassAndMethodPointerRelocations()) && cg->canUseRelativeLongInstructions(reinterpret_cast(fieldClass))) { // For non-AOT (JIT and JITServer) compiles we don't need to use sideEffectRegister here as the class information is available to us at compile time. - J9Class *fieldClass = static_cast(dataSnippet)->getFieldClass(); TR_ASSERT_FATAL(fieldClass != NULL, "A valid J9Class must be provided for direct rdbar/wrtbar opcodes %p\n", node); generateRILInstruction(cg, TR::InstOpCode::LARL, node, fieldClassReg, static_cast(fieldClass)); }