Skip to content

Commit

Permalink
Add support for subtracting -header size from offset
Browse files Browse the repository at this point in the history
Update generateArrayElementAddressTrees to support subtracting -header
size from element offset. IdiomRecognitionUtils::createIndexOffsetTree
was subtracting -header size prior to off-heap changes. I am not sure if
any opt looks for this pattern but adding the support to stay consistent
with pre off-heap logic.

Signed-off-by: Shubham Verma <[email protected]>
  • Loading branch information
VermaSh committed Jul 10, 2024
1 parent 47a9d24 commit 7bb46f2
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 15 deletions.
40 changes: 26 additions & 14 deletions compiler/optimizer/OMRTransformUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ OMR::TransformUtil::generateDataAddrLoadTrees(TR::Compilation *comp, TR::Node *a
#endif /* OMR_GC_SPARSE_HEAP_ALLOCATION */

TR::Node *
OMR::TransformUtil::generateArrayElementAddressTrees(TR::Compilation *comp, TR::Node *arrayNode, TR::Node *offsetNode)
OMR::TransformUtil::generateArrayElementAddressTrees(TR::Compilation *comp, TR::Node *arrayNode, TR::Node *offsetNode, bool subNegativeHeaderSize)
{
TR::Node *arrayAddressNode = NULL;
TR::Node *totalOffsetNode = NULL;
Expand All @@ -470,22 +470,34 @@ OMR::TransformUtil::generateArrayElementAddressTrees(TR::Compilation *comp, TR::
if (offsetNode)
arrayAddressNode = TR::Node::create(TR::aladd, 2, arrayAddressNode, offsetNode);
}
else if (comp->target().is64Bit())
#else
if (comp->target().is64Bit())
#endif /* OMR_GC_SPARSE_HEAP_ALLOCATION */
{
totalOffsetNode = TR::Node::lconst(TR::Compiler->om.contiguousArrayHeaderSizeInBytes());
if (offsetNode)
totalOffsetNode = TR::Node::create(TR::ladd, 2, offsetNode, totalOffsetNode);
arrayAddressNode = TR::Node::create(TR::aladd, 2, arrayNode, totalOffsetNode);
}
else
#endif /* OMR_GC_SPARSE_HEAP_ALLOCATION */
{
totalOffsetNode = TR::Node::iconst(static_cast<int32_t>(TR::Compiler->om.contiguousArrayHeaderSizeInBytes()));
TR_ASSERT_FATAL_WITH_NODE(arrayNode,
static_cast<int64_t>(TR::Compiler->om.contiguousArrayHeaderSizeInBytes()) <= TR::getMaxSigned<TR::Int32>(),
"Array header size is expected to fit in int32 but was wider.\n");
TR::DataTypes widestAvailableIntDataType = comp->target().is64Bit() ? TR::DataTypes::Int64 : TR::DataTypes::Int32;

int32_t arrayHeaderSize = static_cast<int32_t>(TR::Compiler->om.contiguousArrayHeaderSizeInBytes());
if (offsetNode)
totalOffsetNode = TR::Node::create(TR::iadd, 2, offsetNode, totalOffsetNode);
arrayAddressNode = TR::Node::create(TR::aiadd, 2, arrayNode, totalOffsetNode);
{
TR::ILOpCodes offsetNodeOpCode = TR::ILOpCode::addOpCode(widestAvailableIntDataType, comp->target().is64Bit());

if (subNegativeHeaderSize)
{
arrayHeaderSize = -arrayHeaderSize;
offsetNodeOpCode = TR::ILOpCode::subtractOpCode(widestAvailableIntDataType);
}

totalOffsetNode = TR::Node::create(offsetNodeOpCode, 2, offsetNode, TR::Node::iconst(arrayHeaderSize));
}
else
{
totalOffsetNode = TR::Node::iconst(arrayHeaderSize);
}

TR::ILOpCodes arrayAddressNodeOpCode = TR::ILOpCode::addOpCode(TR::DataTypes::Address, comp->target().is64Bit());
arrayAddressNode = TR::Node::create(arrayAddressNodeOpCode, 2, arrayNode, totalOffsetNode);
}

return arrayAddressNode;
Expand Down
7 changes: 6 additions & 1 deletion compiler/optimizer/OMRTransformUtil.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -219,14 +219,19 @@ class OMR_EXTENSIBLE TransformUtil
* \param offsetNode
* The offset node (in bytes)
*
* \param subNegativeHeaderSize
* Subtract -header size from offset instead of adding header size,
* applies only when offsetNode is not null
*
* \return
* IL to access array element at offset provided by offsetNode or
* first array element if no offset node is provided
*/
static TR::Node *generateArrayElementAddressTrees(
TR::Compilation *comp,
TR::Node *arrayNode,
TR::Node *offsetNode = NULL);
TR::Node *offsetNode = NULL,
bool subNegativeHeaderSize = false);

/**
* \brief
Expand Down

0 comments on commit 7bb46f2

Please sign in to comment.