Skip to content

Commit 7f13f6d

Browse files
committed
Add support for subtracting -header size from offset
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]>
1 parent de311dd commit 7f13f6d

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

compiler/optimizer/OMRTransformUtil.cpp

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ OMR::TransformUtil::generateDataAddrLoadTrees(TR::Compilation *comp, TR::Node *a
454454
#endif /* OMR_GC_SPARSE_HEAP_ALLOCATION */
455455

456456
TR::Node *
457-
OMR::TransformUtil::generateArrayElementAddressTrees(TR::Compilation *comp, TR::Node *arrayNode, TR::Node *offsetNode)
457+
OMR::TransformUtil::generateArrayElementAddressTrees(TR::Compilation *comp, TR::Node *arrayNode, TR::Node *offsetNode, bool subNegativeHeaderSize)
458458
{
459459
TR::Node *arrayAddressNode = NULL;
460460
TR::Node *totalOffsetNode = NULL;
@@ -470,22 +470,35 @@ OMR::TransformUtil::generateArrayElementAddressTrees(TR::Compilation *comp, TR::
470470
if (offsetNode)
471471
arrayAddressNode = TR::Node::create(TR::aladd, 2, arrayAddressNode, offsetNode);
472472
}
473-
else if (comp->target().is64Bit())
474-
#else
475-
if (comp->target().is64Bit())
476-
#endif /* OMR_GC_SPARSE_HEAP_ALLOCATION */
477-
{
478-
totalOffsetNode = TR::Node::lconst(TR::Compiler->om.contiguousArrayHeaderSizeInBytes());
479-
if (offsetNode)
480-
totalOffsetNode = TR::Node::create(TR::ladd, 2, offsetNode, totalOffsetNode);
481-
arrayAddressNode = TR::Node::create(TR::aladd, 2, arrayNode, totalOffsetNode);
482-
}
483473
else
474+
#endif /* OMR_GC_SPARSE_HEAP_ALLOCATION */
484475
{
485-
totalOffsetNode = TR::Node::iconst(static_cast<int32_t>(TR::Compiler->om.contiguousArrayHeaderSizeInBytes()));
476+
TR_ASSERT_FATAL_WITH_NODE(arrayNode,
477+
static_cast<int64_t>(TR::Compiler->om.contiguousArrayHeaderSizeInBytes()) <= TR::getMaxSigned<TR::Int32>(),
478+
"Array header size is expected to fit in int32 but was wider.\n");
479+
TR::DataTypes widestAvailableIntDataType = comp->target().is64Bit() ? TR::DataTypes::Int64 : TR::DataTypes::Int32;
480+
481+
TR::ILOpCodes arrayHeaderSizeLoadOpCode = TR::ILOpCode::constOpCode(widestAvailableIntDataType);
482+
int32_t arrayHeaderSize = static_cast<int32_t>(TR::Compiler->om.contiguousArrayHeaderSizeInBytes());
486483
if (offsetNode)
487-
totalOffsetNode = TR::Node::create(TR::iadd, 2, offsetNode, totalOffsetNode);
488-
arrayAddressNode = TR::Node::create(TR::aiadd, 2, arrayNode, totalOffsetNode);
484+
{
485+
TR::ILOpCodes offsetNodeOpCode = TR::ILOpCode::addOpCode(widestAvailableIntDataType, comp->target().is64Bit());
486+
487+
if (subNegativeHeaderSize)
488+
{
489+
arrayHeaderSize = -arrayHeaderSize;
490+
offsetNodeOpCode = TR::ILOpCode::subtractOpCode(widestAvailableIntDataType);
491+
}
492+
493+
totalOffsetNode = TR::Node::create(offsetNodeOpCode, 2, offsetNode, TR::Node::create(arrayHeaderSizeLoadOpCode, 0, arrayHeaderSize));
494+
}
495+
else
496+
{
497+
totalOffsetNode = TR::Node::create(arrayHeaderSizeLoadOpCode, 0, arrayHeaderSize);
498+
}
499+
500+
TR::ILOpCodes arrayAddressNodeOpCode = TR::ILOpCode::addOpCode(TR::DataTypes::Address, comp->target().is64Bit());
501+
arrayAddressNode = TR::Node::create(arrayAddressNodeOpCode, 2, arrayNode, totalOffsetNode);
489502
}
490503

491504
return arrayAddressNode;

compiler/optimizer/OMRTransformUtil.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,14 +219,19 @@ class OMR_EXTENSIBLE TransformUtil
219219
* \param offsetNode
220220
* The offset node (in bytes)
221221
*
222+
* \param subNegativeHeaderSize
223+
* Subtract -header size from offset instead of adding header size,
224+
* applies only when offsetNode is not null
225+
*
222226
* \return
223227
* IL to access array element at offset provided by offsetNode or
224228
* first array element if no offset node is provided
225229
*/
226230
static TR::Node *generateArrayElementAddressTrees(
227231
TR::Compilation *comp,
228232
TR::Node *arrayNode,
229-
TR::Node *offsetNode = NULL);
233+
TR::Node *offsetNode = NULL,
234+
bool subNegativeHeaderSize = false);
230235

231236
/**
232237
* \brief

0 commit comments

Comments
 (0)