@@ -454,7 +454,7 @@ OMR::TransformUtil::generateDataAddrLoadTrees(TR::Compilation *comp, TR::Node *a
454
454
#endif /* OMR_GC_SPARSE_HEAP_ALLOCATION */
455
455
456
456
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 )
458
458
{
459
459
TR::Node *arrayAddressNode = NULL ;
460
460
TR::Node *totalOffsetNode = NULL ;
@@ -470,22 +470,35 @@ OMR::TransformUtil::generateArrayElementAddressTrees(TR::Compilation *comp, TR::
470
470
if (offsetNode)
471
471
arrayAddressNode = TR::Node::create (TR::aladd, 2 , arrayAddressNode, offsetNode);
472
472
}
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
- }
483
473
else
474
+ #endif /* OMR_GC_SPARSE_HEAP_ALLOCATION */
484
475
{
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 ());
486
483
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);
489
502
}
490
503
491
504
return arrayAddressNode;
0 commit comments