Skip to content

Commit

Permalink
Extend arraycmp length child
Browse files Browse the repository at this point in the history
Change all uses of arraycmp to take a 64 bit length child instead of 32 bits.

Signed-off-by: Spencer Comin <spencer.comin@ibm.com>
  • Loading branch information
Spencer-Comin committed Jun 13, 2024
1 parent 9bb74b5 commit fcc1338
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 17 deletions.
28 changes: 12 additions & 16 deletions runtime/compiler/optimizer/IdiomTransformations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9724,25 +9724,19 @@ CISCTransform2ArrayCmp(TR_CISCTransformer *trans)
TR::Node * elementSizeNode = NULL;
if (elementSize > 1)
{
//FIXME: enable this code for 64-bit
// currently disabled until all uses of lengthNode are
// sign-extended correctly
//
TR::ILOpCodes mulOp = TR::imul;
#if 0
if (comp->target().is64Bit())
{
elementSizeNode = TR::Node::create(mulFactorNode, TR::lconst);
elementSizeNode->setLongInt(elementSize);
mulOp = TR::lmul;
elementSizeNode = TR::Node::create(mulFactorNode, TR::lconst, 0, elementSize);
lengthNode = TR::Node::create(TR::i2l, 1, lengthNode);
lengthNode = TR::Node::create(TR::lmul, 2, lengthNode, elementSizeNode);
}
else
#endif
{
elementSizeNode = TR::Node::create(mulFactorNode, TR::iconst, 0, elementSize);
lengthNode = TR::Node::create(mulOp, 2,
lengthNode,
elementSizeNode);
lengthNode = TR::Node::create(TR::imul, 2, lengthNode, elementSizeNode);
lengthNode = TR::Node::create(TR::iu2l, 1, lengthNode);
}

switch(elementSize)
{
case 2: shrCount = 1; break;
Expand All @@ -9751,6 +9745,8 @@ CISCTransform2ArrayCmp(TR_CISCTransformer *trans)
default: TR_ASSERT(false, "error");
}
}
else
lengthNode = TR::Node::create(TR::iu2l, 1, lengthNode);

TR_ASSERT(!generateArraycmplen || !generateArraycmpsign, "error");

Expand Down Expand Up @@ -9795,7 +9791,7 @@ CISCTransform2ArrayCmp(TR_CISCTransformer *trans)
if (generateArraycmplen)
{
// Using arraycmplen
TR::Node * arraycmplen = TR::Node::create(TR::arraycmplen, 3, input1Node, input2Node, TR::Node::create(lengthNode, TR::iu2l, 1, lengthNode));
TR::Node * arraycmplen = TR::Node::create(TR::arraycmplen, 3, input1Node, input2Node, lengthNode);
arraycmplen->setSymbolReference(comp->getSymRefTab()->findOrCreateArrayCmpLenSymbol());

arraycmplen = TR::Node::create(TR::l2i, 1, arraycmplen);
Expand Down Expand Up @@ -9823,7 +9819,7 @@ CISCTransform2ArrayCmp(TR_CISCTransformer *trans)
newLastTreeTop = tmpTreeTop;
}

tmpNode = TR::Node::createif(TR::ificmpeq, lengthNode, resultLoad, okDest);
tmpNode = TR::Node::createif(TR::ificmpeq, TR::Node::create(lengthNode, TR::l2i, 1, lengthNode), resultLoad, okDest);

tmpTreeTop = TR::TreeTop::create(comp, tmpNode);
newLastTreeTop->join(tmpTreeTop);
Expand All @@ -9832,7 +9828,7 @@ CISCTransform2ArrayCmp(TR_CISCTransformer *trans)
else
{
// Using arraycmp
TR::Node * arraycmp = TR::Node::create(TR::arraycmp, 3, input1Node, input2Node, createI2LIfNecessary(comp, trans->isGenerateI2L(), lengthNode));
TR::Node * arraycmp = TR::Node::create(TR::arraycmp, 3, input1Node, input2Node, lengthNode);
arraycmp->setSymbolReference(comp->getSymRefTab()->findOrCreateArrayCmpSymbol());

TR::Node * cmpIfNode;
Expand Down
2 changes: 1 addition & 1 deletion runtime/compiler/optimizer/J9ValuePropagation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3151,7 +3151,7 @@ J9::ValuePropagation::transformVTObjectEqNeCompare(TR_OpaqueClassBlock *containi
totalFieldSize += TR::DataType::getSize(fieldEntry._datatype);
}

TR::Node *totalFieldSizeNode = TR::Node::iconst(callNode, totalFieldSize);
TR::Node *totalFieldSizeNode = TR::Node::lconst(callNode, totalFieldSize);

TR::Node * lhsOffsetNode = NULL;
TR::Node * rhsOffsetNode = NULL;
Expand Down

0 comments on commit fcc1338

Please sign in to comment.