Skip to content

Commit 068425c

Browse files
committed
aarch64: NULL initialize dataAddr field for 0 size arrays
Update array inline allocation sequence to initialize dataAddr field only for non-zero size arrays. Field should be left blank for zero size arrays. Signed-off-by: Shubham Verma <[email protected]>
1 parent bac5662 commit 068425c

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

runtime/compiler/aarch64/codegen/J9TreeEvaluator.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3298,6 +3298,23 @@ genInitArrayHeader(TR::Node *node, TR::CodeGenerator *cg, TR_OpaqueClassBlock *c
32983298
tempReg1);
32993299
}
33003300
}
3301+
3302+
// Clear padding after the size field
3303+
if (!isTLHHasNotBeenCleared)
3304+
{
3305+
if (TR::Compiler->om.generateCompressedObjectHeaders())
3306+
{
3307+
generateMemSrc1Instruction(cg, TR::InstOpCode::strimmw, node,
3308+
TR::MemoryReference::createWithDisplacement(cg, objectReg, fej9->getOffsetOfDiscontiguousArraySizeField() + 4),
3309+
zeroReg);
3310+
}
3311+
else
3312+
{
3313+
generateMemSrc1Instruction(cg, TR::InstOpCode::strimmw, node,
3314+
TR::MemoryReference::createWithDisplacement(cg, objectReg, fej9->getOffsetOfContiguousArraySizeField() + 4),
3315+
zeroReg);
3316+
}
3317+
}
33013318
}
33023319

33033320
/**
@@ -3462,7 +3479,8 @@ J9::ARM64::TreeEvaluator::VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg)
34623479
* runtime size checks are needed to determine whether to use contiguous or discontiguous header layout.
34633480
*
34643481
* In both scenarios, arrays of non-zero size use contiguous header layout while zero size arrays use
3465-
* discontiguous header layout.
3482+
* discontiguous header layout. DataAddr field of zero size arrays is intialized to NULL because they
3483+
* don't have any data elements.
34663484
*/
34673485
TR::Register *offsetReg = tempReg1;
34683486
TR::Register *firstDataElementReg = tempReg2;
@@ -3491,14 +3509,18 @@ J9::ARM64::TreeEvaluator::VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg)
34913509

34923510
dataAddrSlotMR = TR::MemoryReference::createWithDisplacement(cg, offsetReg, fej9->getOffsetOfContiguousDataAddrField());
34933511
generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addimmx, node, firstDataElementReg, offsetReg, TR::Compiler->om.contiguousArrayHeaderSizeInBytes());
3512+
3513+
// Clear firstDataElementReg reg if dealing with 0 size arrays
3514+
generateCompareImmInstruction(cg, node, lengthReg, 0, false);
3515+
generateCondTrg1Src2Instruction(cg, TR::InstOpCode::cselx, node, firstDataElementReg, zeroReg, firstDataElementReg, TR::CC_EQ);
34943516
}
34953517
else if (!isVariableLength && node->getFirstChild()->getOpCode().isLoadConst() && node->getFirstChild()->getInt() == 0)
34963518
{
34973519
if (comp->getOption(TR_TraceCG))
34983520
traceMsg(comp, "Node (%p): Dealing with full/compressed refs fixed length zero size array.\n", node);
34993521

35003522
dataAddrSlotMR = TR::MemoryReference::createWithDisplacement(cg, resultReg, fej9->getOffsetOfDiscontiguousDataAddrField());
3501-
generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addimmx, node, firstDataElementReg, resultReg, TR::Compiler->om.discontiguousArrayHeaderSizeInBytes());
3523+
firstDataElementReg = zeroReg;
35023524
}
35033525
else
35043526
{
@@ -3520,8 +3542,14 @@ J9::ARM64::TreeEvaluator::VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg)
35203542

35213543
dataAddrSlotMR = TR::MemoryReference::createWithDisplacement(cg, resultReg, fej9->getOffsetOfContiguousDataAddrField());
35223544
generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addimmx, node, firstDataElementReg, resultReg, TR::Compiler->om.contiguousArrayHeaderSizeInBytes());
3523-
}
35243545

3546+
if (isVariableLength && !TR::Compiler->om.compressObjectReferences())
3547+
{
3548+
// Clear firstDataElementReg reg if dealing with variable length 0 size arrays
3549+
generateCompareImmInstruction(cg, node, lengthReg, 0, false);
3550+
generateCondTrg1Src2Instruction(cg, TR::InstOpCode::cselx, node, offsetReg, zeroReg, offsetReg, TR::CC_EQ);
3551+
}
3552+
}
35253553
generateMemSrc1Instruction(cg, TR::InstOpCode::strimmx, node, dataAddrSlotMR, firstDataElementReg);
35263554
}
35273555
#endif /* J9VM_GC_SPARSE_HEAP_ALLOCATION */

0 commit comments

Comments
 (0)