Skip to content

Commit

Permalink
Merge pull request #21008 from jdmpapin/com-ibm-compiler-internal-pre…
Browse files Browse the repository at this point in the history
…fetch

Delete unused code to make resolved const string CP indices irrelevant
  • Loading branch information
0xdaryl authored Jan 30, 2025
2 parents aa5b433 + c1901c8 commit a82928f
Show file tree
Hide file tree
Showing 5 changed files with 0 additions and 278 deletions.
81 changes: 0 additions & 81 deletions runtime/compiler/env/VMJ9.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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; i<len; i++)
{
fprintf(stderr,"%c",u8ClassString[i]);
}
fprintf(stderr," (len is %d)\n",len);fflush(stderr);
**/

char* classSignature = TR::Compiler->cls.classNameToSignature((char*)u8ClassString, len, comp);

/**
fprintf(stderr,"classSignature is \n");
for (int i =0; i <len; i++){
fprintf(stderr,"%c",classSignature[i]);
}
fprintf(stderr," (len is %d)\n",len);
**/

TR_OpaqueClassBlock * j9ClassPtr = getClassFromSignature(classSignature, len, method);
//fprintf(stderr,"Class looked up to be %p \n", j9ClassPtr);

if (!j9ClassPtr) return 0;

TR_VMFieldsInfo fields(comp, (J9Class*)j9ClassPtr, 1);

len = (int32_t)jitConfig->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<TR_VMField> 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)
{
Expand Down
1 change: 0 additions & 1 deletion runtime/compiler/env/VMJ9.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion runtime/compiler/env/VMJ9Server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
36 changes: 0 additions & 36 deletions runtime/compiler/env/j9method.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2674,41 +2674,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")},
Expand Down Expand Up @@ -4297,7 +4262,6 @@ void TR_ResolvedJ9Method::construct()
static Y class34[] =
{
{ "java/util/Hashtable$HashEnumerator", HashtableHashEnumeratorMethods },
{ "com/ibm/Compiler/Internal/Prefetch", PrefetchMethods },
{ "java/lang/invoke/VarHandleInternal", VarHandleMethods },
{ "com/ibm/dataaccess/ExternalDecimal", DataAccessExternalDecimalMethods },
{ 0 }
Expand Down
159 changes: 0 additions & 159 deletions runtime/compiler/ilgen/Walker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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; i<numArgs; i++)
genTreeTop(pop());
return node;
}

// Get the type of prefetch
PrefetchType prefetchType = NoPrefetch;
TR::Method *method = symbol->castToMethodSymbol()->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()) \
Expand Down

0 comments on commit a82928f

Please sign in to comment.