From 404a764aeb248520a74566981221dfbc4c23c543 Mon Sep 17 00:00:00 2001 From: Devin Papineau Date: Fri, 17 Mar 2023 15:43:32 -0400 Subject: [PATCH 1/2] Remove com/ibm/Compiler/Internal/Prefetch recognized methods This class doesn't exist and (more or less) never did. --- runtime/compiler/env/j9method.cpp | 36 ------- runtime/compiler/ilgen/Walker.cpp | 159 ------------------------------ 2 files changed, 195 deletions(-) diff --git a/runtime/compiler/env/j9method.cpp b/runtime/compiler/env/j9method.cpp index f9892958654..277460bebbb 100644 --- a/runtime/compiler/env/j9method.cpp +++ b/runtime/compiler/env/j9method.cpp @@ -2666,41 +2666,6 @@ void TR_ResolvedJ9Method::construct() { TR::unknownMethod} }; - static X PrefetchMethods[] = - { - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L1", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L2", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L3", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Store", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_LoadNTA", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_StoreNTA", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_StoreConditional", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Release_StoreOnly", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Release_All", "(Ljava/lang/Object;I)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L1", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L2", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L3", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Store", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_LoadNTA", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_StoreNTA", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_StoreConditional", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Release_StoreOnly", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Release_All", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L1", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L2", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Load_L3", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_Store", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_LoadNTA", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_StoreNTA", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Prefetch_StoreConditional", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Release_StoreOnly", "(Ljava/lang/String;Ljava/lang/String;)V")}, - {x(TR::com_ibm_Compiler_Internal__TR_Prefetch, "_TR_Release_All", "(Ljava/lang/String;Ljava/lang/String;)V")}, - { TR::unknownMethod} - }; - static X OSMemoryMethods[] = { {x(TR::org_apache_harmony_luni_platform_OSMemory_putByte_JB_V, "putByte", "(JB)V")}, @@ -4285,7 +4250,6 @@ void TR_ResolvedJ9Method::construct() static Y class34[] = { { "java/util/Hashtable$HashEnumerator", HashtableHashEnumeratorMethods }, - { "com/ibm/Compiler/Internal/Prefetch", PrefetchMethods }, { "java/lang/invoke/VarHandleInternal", VarHandleMethods }, { 0 } }; diff --git a/runtime/compiler/ilgen/Walker.cpp b/runtime/compiler/ilgen/Walker.cpp index 92bd22718e0..89b07d1a05f 100644 --- a/runtime/compiler/ilgen/Walker.cpp +++ b/runtime/compiler/ilgen/Walker.cpp @@ -3937,165 +3937,6 @@ TR_J9ByteCodeIlGenerator::genInvokeInner( } #endif - if (symbol->getRecognizedMethod() == TR::com_ibm_Compiler_Internal__TR_Prefetch) - { - TR::Node *node = NULL; - - if ((comp()->getOptLevel() < hot)) - { - int i = 0; - for (i=0; icastToMethodSymbol()->getMethod(); - if (method->nameLength() == 15 && !strncmp(method->nameChars(), "_TR_Release_All", 15)) - { - prefetchType = ReleaseAll; - } - else if (method->nameLength() == 17 && !strncmp(method->nameChars(), "_TR_Prefetch_Load", 17)) - { - prefetchType = PrefetchLoad; - } - else if (method->nameLength() == 18 && !strncmp(method->nameChars(), "_TR_Prefetch_Store", 18)) - { - prefetchType = PrefetchStore; - } - else if (method->nameLength() == 20) - { - if (!strncmp(method->nameChars(), "_TR_Prefetch_LoadNTA", 20)) - prefetchType = PrefetchLoadNonTemporal; - else if (!strncmp(method->nameChars(), "_TR_Prefetch_Load_L1", 20)) - prefetchType = PrefetchLoadL1; - else if (!strncmp(method->nameChars(), "_TR_Prefetch_Load_L2", 20)) - prefetchType = PrefetchLoadL2; - else if (!strncmp(method->nameChars(), "_TR_Prefetch_Load_L3", 20)) - prefetchType = PrefetchLoadL3; - } - else if (method->nameLength() == 21) - { - if (!strncmp(method->nameChars(), "_TR_Prefetch_StoreNTA", 21)) - prefetchType = PrefetchStoreNonTemporal; - else if (!strncmp(method->nameChars(), "_TR_Release_StoreOnly", 21)) - prefetchType = ReleaseStore; - } - else if (method->nameLength() == 29 && !strncmp(method->nameChars(), "_TR_Prefetch_StoreConditional", 29)) - { - prefetchType = PrefetchStoreConditional; - } - - TR::Node *n2 = pop(); - if (2 == numArgs && n2->getOpCode().isInt()) - { - node = TR::Node::createWithSymRef(TR::Prefetch, 4, symRef); - TR::Node *addrNode = pop(); - - // For constant 2nd arguments, we'll add it to the offset. - if (n2->getOpCode().isLoadConst()) - { - // TR::Prefetch 1st child: address - node->setAndIncChild(0, addrNode); - // TR::Prefetch 2nd child: offset - node->setAndIncChild(1, n2); - } - else - { - // TR::Prefetch 1st child: address - // aiadd - // addrNode - // offsetNode - TR::Node * aiaddNode = TR::Node::create(TR::aiadd, 2, addrNode, n2); - node->setAndIncChild(0, aiaddNode); - - // TR::Prefetch 2nd child: Set offset to be zero. - TR::Node * offsetNode = TR::Node::create(TR::iconst, 0, 0); - node->setAndIncChild(1, offsetNode); - } - - // TR::Prefetch 3rd child : size - TR::Node * size = TR::Node::create(TR::iconst, 0, 1); - node->setAndIncChild(2, size); - - // TR::Prefetch 4th child : type - TR::Node * type = TR::Node::create(TR::iconst, 0, (int32_t)prefetchType); - node->setAndIncChild(3, type); - - genTreeTop(node); - } - else if (3 == numArgs || 2 == numArgs) - { - TR::Node * n3 = n2; // it's already popped above - TR::Node * n2 = pop(); - TR::Node * n1 = (numArgs == 3) ? pop() : NULL; - - if (n3->getSymbolReference() && - n3->getSymbolReference()->getSymbol()->isStatic() && - n3->getSymbolReference()->getSymbol()->castToStaticSymbol()->isConstString() && - n2->getSymbolReference() && - n2->getSymbolReference()->getSymbol()->isStatic() && - n2->getSymbolReference()->getSymbol()->castToStaticSymbol()->isConstString()) - { - uintptr_t offset = fej9()->getFieldOffset(comp(), n2->getSymbolReference(), n3->getSymbolReference() ); - if (offset) - { - TR::Node * n ; - if (comp()->target().is32Bit() || - (int32_t)(((uint32_t)((uint64_t)offset >> 32)) & 0xffffffff) == (uint32_t)0) - { - n = TR::Node::create(TR::iconst, 0, offset); - } - else - { - n = TR::Node::create(TR::lconst, 0, 0); - n->setLongInt(offset); - } - if (numArgs == 3) - { - node = TR::Node::createWithSymRef(TR::Prefetch, 4, symRef); - node->setAndIncChild(1, n); - node->setAndIncChild(0, n1); - } - else - { - node = TR::Node::createWithSymRef(TR::Prefetch, 4, symRef); - node->setAndIncChild(0, n); - TR::Node * offsetNode = TR::Node::create(TR::iconst, 0, 0); - node->setAndIncChild(1, offsetNode); - } - - // TR::Prefetch 3rd child : size - TR::Node * size = TR::Node::create(TR::iconst, 0, 1); - node->setAndIncChild(2, size); - - // TR::Prefetch 4th child : type - TR::Node * type = TR::Node::create(TR::iconst, 0, (int32_t)prefetchType); - node->setAndIncChild(3, type); - - genTreeTop(node); - } - else - { - // Generate treetops to retain proper reference count. - genTreeTop(n2); - genTreeTop(n3); - if (n1) - genTreeTop(n1); - - traceMsg(comp(),"Prefetch: Unable to resolve offset.\n"); - } - } - } - else - { - TR_ASSERT(0, "TR::Prefetch does not have two or three children"); - } - - return node; - } - #define DAA_PRINT(a) \ case a: \ if(trace()) \ From c1901c826b4ff55d8d235548c5283483b4fda09e Mon Sep 17 00:00:00 2001 From: Devin Papineau Date: Fri, 17 Mar 2023 15:48:30 -0400 Subject: [PATCH 2/2] Delete TR_J9VMBase::getFieldOffset(), which is now unused Previously the only call site was in ilgen when transforming recognized methods of com/ibm/Compiler/Internal/Prefetch, which it no longer does. With this deletion, the owning method and constant pool index of a const string symref should only matter if it's unresolved. That will make it possible to mark arbitrary (resolved) known object const refs as const strings (whenever they happen to be strings). --- runtime/compiler/env/VMJ9.cpp | 81 ----------------------------- runtime/compiler/env/VMJ9.h | 1 - runtime/compiler/env/VMJ9Server.hpp | 1 - 3 files changed, 83 deletions(-) diff --git a/runtime/compiler/env/VMJ9.cpp b/runtime/compiler/env/VMJ9.cpp index 8f81e31b712..428f329a5d7 100644 --- a/runtime/compiler/env/VMJ9.cpp +++ b/runtime/compiler/env/VMJ9.cpp @@ -5500,87 +5500,6 @@ TR_J9VMBase::getStringFieldByName(TR::Compilation * comp, TR::SymbolReference * return true; } -uintptr_t -TR_J9VMBase::getFieldOffset(TR::Compilation * comp, TR::SymbolReference* classRef, TR::SymbolReference* fieldRef) - { - TR_ResolvedMethod* method = classRef->getOwningMethod(comp); - TR::StaticSymbol* classSym = classRef->getSymbol()->castToStaticSymbol(); - j9object_t classString = (j9object_t)getStaticReferenceFieldAtAddress((uintptr_t)classSym->getStaticAddress()); - TR::StaticSymbol* fieldSym = fieldRef->getSymbol()->castToStaticSymbol(); - j9object_t fieldString = (j9object_t)getStaticReferenceFieldAtAddress((uintptr_t)fieldSym->getStaticAddress()); - - int32_t len = (int32_t)jitConfig->javaVM->internalVMFunctions->getStringUTF8Length(vmThread(), classString); - U_8* u8ClassString = (U_8*)comp->trMemory()->allocateStackMemory(len + 1); - - jitConfig->javaVM->internalVMFunctions->copyStringToUTF8Helper(vmThread(), classString, J9_STR_NULL_TERMINATE_RESULT | J9_STR_XLAT, 0, J9VMJAVALANGSTRING_LENGTH(vmThread(), classString), u8ClassString, len + 1); - - /** - //fprintf(stderr,"name is (res is %d) classString is %p\n",res, classString); fflush(stderr); - for (int i =0; icls.classNameToSignature((char*)u8ClassString, len, comp); - - /** - fprintf(stderr,"classSignature is \n"); - for (int i =0; i javaVM->internalVMFunctions->getStringUTF8Length(vmThread(), fieldString); - U_8* u8FieldString = (U_8*)comp->trMemory()->allocateStackMemory(len + 1); - - jitConfig->javaVM->internalVMFunctions->copyStringToUTF8Helper(vmThread(), fieldString, J9_STR_NULL_TERMINATE_RESULT, 0, J9VMJAVALANGSTRING_LENGTH(vmThread(), fieldString), u8FieldString, len + 1); - - ListIterator itr(fields.getFields()) ; - TR_VMField* field; - uint32_t offset = 0; - for (field = itr.getFirst(); field != NULL; field= itr.getNext()) - { - // fprintf(stderr, "fieldName %s fieldOffset %d fieldSig %s\n",field->name, field->offset, field->signature); - if (!strncmp(field->name, (const char*)u8FieldString, len+1)) - { - offset = (uint32_t)(field->offset + getObjectHeaderSizeInBytes()); - // Do we Need this? - // offset = getInstanceFieldOffset(j9ClassPtr, field->name, strlen(field->name), field->signature, strlen(field->signature), - // J9_LOOK_NO_JAVA); - - // fprintf(stderr,">>>>> Offset for %s determined to be : %d\n", field->name,offset); - return (uintptr_t)offset; - } - } - - void * staticAddr = 0; - itr = fields.getStatics() ; - for (field = itr.getFirst(); field != NULL; field=itr.getNext()) - { - if (!strncmp(field->name, (const char*)u8FieldString, len+1)) - { - // Do we Need to acquire VM Access? getInstanceFieldOffset does it? - TR::VMAccessCriticalSection staticFieldAddress(this); - staticAddr = jitConfig->javaVM->internalVMFunctions->staticFieldAddress(_vmThread, - (J9Class*)j9ClassPtr, u8FieldString, len, (U_8*)field->signature, (UDATA)strlen(field->signature), - NULL, NULL, J9_LOOK_NO_JAVA, NULL); - } - } - - - return (uintptr_t)staticAddr; - } - bool TR_J9VMBase::isJavaLangObject(TR_OpaqueClassBlock *clazz) { diff --git a/runtime/compiler/env/VMJ9.h b/runtime/compiler/env/VMJ9.h index 1cb0a5a92e2..8e1d7933de6 100644 --- a/runtime/compiler/env/VMJ9.h +++ b/runtime/compiler/env/VMJ9.h @@ -1061,7 +1061,6 @@ class TR_J9VMBase : public TR_FrontEnd */ virtual bool isMethodHandleExpectedType(TR::Compilation *comp, TR::KnownObjectTable::Index mhIndex, TR::KnownObjectTable::Index expectedTypeIndex); - virtual uintptr_t getFieldOffset( TR::Compilation * comp, TR::SymbolReference* classRef, TR::SymbolReference* fieldRef); /* * \brief * tell whether it's possible to dereference a field given the field symbol reference at compile time diff --git a/runtime/compiler/env/VMJ9Server.hpp b/runtime/compiler/env/VMJ9Server.hpp index 544a9c704b2..ae29c0092bb 100644 --- a/runtime/compiler/env/VMJ9Server.hpp +++ b/runtime/compiler/env/VMJ9Server.hpp @@ -209,7 +209,6 @@ class TR_J9ServerVM: public TR_J9VM virtual intptr_t getVFTEntry(TR_OpaqueClassBlock *clazz, int32_t offset) override; virtual bool isClassArray(TR_OpaqueClassBlock *klass) override; - virtual uintptr_t getFieldOffset(TR::Compilation * comp, TR::SymbolReference* classRef, TR::SymbolReference* fieldRef) override { return 0; } // safe answer // The base version should be safe, no need to override. // virtual bool canDereferenceAtCompileTime(TR::SymbolReference *fieldRef, TR::Compilation *comp) override; // safe answer, might change in the future virtual bool instanceOfOrCheckCast(J9Class *instanceClass, J9Class* castClass) override;