Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OffHeap CardMarking using the baseObj instead of dataAddr #20264

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 24 additions & 4 deletions runtime/compiler/aarch64/codegen/J9TreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -987,7 +987,8 @@ VMCardCheckEvaluator(
TR::Register *dstReg,
TR_ARM64ScratchRegisterManager *srm,
TR::LabelSymbol *doneLabel,
TR::CodeGenerator *cg)
TR::CodeGenerator *cg,
bool clobberDstReg=false)
{
TR::Compilation *comp = cg->comp();

Expand All @@ -1014,7 +1015,11 @@ VMCardCheckEvaluator(
cg->generateDebugCounter(TR::DebugCounter::debugCounterName(comp, "wrtbarEvaluator:020VMCardCheckEvaluator:01markThreadActiveCheckDone"), *srm);
}

TR::Register *temp2Reg = srm->findOrCreateScratchRegister();
TR::Register *temp2Reg;
if (clobberDstReg)
temp2Reg = dstReg;
else
temp2Reg = srm->findOrCreateScratchRegister();
/*
* Generating code checking whether an object is in heap
*
Expand Down Expand Up @@ -5037,7 +5042,13 @@ static TR::Register *VMinlineCompareAndSwapObject(TR::Node *node, TR::CodeGenera
fourthChild = node->getChild(3);
fifthChild = node->getChild(4);

objReg = cg->evaluate(secondChild);
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
bool isObjOffHeapDataAddr = (gcMode == gc_modron_wrtbar_cardmark_incremental && TR::Compiler->om.isOffHeapAllocationEnabled() && secondChild->isDataAddrPointer());
TR::Register *baseObjReg = NULL;
if (isObjOffHeapDataAddr)
TR::TreeEvaluator::stopUsingCopyReg(secondChild->getFirstChild(), baseObjReg, cg);
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
objReg = cg->evaluate(secondChild);

if (thirdChild->getOpCode().isLoadConst() && thirdChild->getRegister() == NULL)
{
Expand Down Expand Up @@ -5200,11 +5211,20 @@ static TR::Register *VMinlineCompareAndSwapObject(TR::Node *node, TR::CodeGenera
generateCompareBranchInstruction(cg, TR::InstOpCode::cbzx, node, wrtBarSrcReg, doneLabel);
cg->generateDebugCounter(TR::DebugCounter::debugCounterName(comp, "wrtbarEvaluator:000srcNullChk:NonNull"), *srm);
}
VMCardCheckEvaluator(node, objReg, srm, doneLabel, cg);
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
if (isObjOffHeapDataAddr)
VMCardCheckEvaluator(node, baseObjReg, srm, doneLabel, cg, true);
else
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
VMCardCheckEvaluator(node, objReg, srm, doneLabel, cg);
}

TR_ARM64ScratchRegisterDependencyConditions scratchDeps;
scratchDeps.addDependency(cg, objReg, doWrtBar ? TR::RealRegister::x0 : TR::RealRegister::NoReg);
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
if (isObjOffHeapDataAddr)
scratchDeps.addDependency(cg, baseObjReg, TR::RealRegister::NoReg);
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
scratchDeps.addDependency(cg, wrtBarSrcReg, doWrtBar ? TR::RealRegister::x1 : TR::RealRegister::NoReg);
if (offsetInReg)
{
Expand Down
22 changes: 20 additions & 2 deletions runtime/compiler/p/codegen/J9TreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8217,6 +8217,12 @@ static TR::Register *VMinlineCompareAndSwapObject(TR::Node *node, TR::CodeGenera
thirdChild = node->getChild(2);
fourthChild = node->getChild(3);
fifthChild = node->getChild(4);
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
bool isObjOffHeapDataAddr = (gcMode == gc_modron_wrtbar_cardmark_incremental && TR::Compiler->om.isOffHeapAllocationEnabled() && secondChild->isDataAddrPointer());
TR::Register *baseObjReg = NULL;
if (isObjOffHeapDataAddr)
TR::TreeEvaluator::stopUsingCopyReg(secondChild->getFirstChild(), baseObjReg, cg);
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
objReg = cg->evaluate(secondChild);

// VM helper chops off the value in 32bit, and we don't want the whole long value either
Expand Down Expand Up @@ -8473,7 +8479,13 @@ static TR::Register *VMinlineCompareAndSwapObject(TR::Node *node, TR::CodeGenera
}
else if (!doWrtBar && doCrdMrk)
{
TR::Register *temp1Reg = cg->allocateRegister(), *temp2Reg = cg->allocateRegister(), *temp3Reg;
TR::Register *temp1Reg = cg->allocateRegister(), *temp2Reg, *temp3Reg;
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
if (isObjOffHeapDataAddr)
temp2Reg = baseObjReg; // Use baseObjReg as temp2Reg
else
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
temp2Reg = cg->allocateRegister();
TR::addDependency(conditions, objReg, TR::RealRegister::NoReg, TR_GPR, cg);
conditions->getPostConditions()->getRegisterDependency(0)->setExcludeGPR0();
TR::addDependency(conditions, temp1Reg, TR::RealRegister::NoReg, TR_GPR, cg);
Expand All @@ -8494,7 +8506,13 @@ static TR::Register *VMinlineCompareAndSwapObject(TR::Node *node, TR::CodeGenera
TR::addDependency(conditions, temp3Reg, TR::RealRegister::NoReg, TR_GPR, cg);
}

VMCardCheckEvaluator(node, objReg, cndReg, temp1Reg, temp2Reg, temp3Reg, conditions, cg);
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
if (isObjOffHeapDataAddr)
// Given that baseObjReg is trash-able it can be used as the objReg and temp2Reg
VMCardCheckEvaluator(node, baseObjReg, cndReg, temp1Reg, temp2Reg, temp3Reg, conditions, cg);
else
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
VMCardCheckEvaluator(node, objReg, cndReg, temp1Reg, temp2Reg, temp3Reg, conditions, cg);

cg->stopUsingRegister(temp1Reg);
cg->stopUsingRegister(temp2Reg);
Expand Down
8 changes: 7 additions & 1 deletion runtime/compiler/x/codegen/J9TreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10599,7 +10599,13 @@ void J9::X86::TreeEvaluator::VMwrtbarWithoutStoreEvaluator(
TR::Register *owningObjectReg;
TR::Register *tempReg = NULL;

owningObjectReg = cg->evaluate(destOwningObject);
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
bool stopUsingCopyBaseReg;
if (gcMode == gc_modron_wrtbar_cardmark_incremental && TR::Compiler->om.isOffHeapAllocationEnabled() && destOwningObject->isDataAddrPointer())
owningObjectReg = cg->evaluate(destOwningObject->getFirstChild());
else
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
owningObjectReg = cg->evaluate(destOwningObject);

if (doInternalControlFlow)
{
Expand Down
26 changes: 23 additions & 3 deletions runtime/compiler/z/codegen/J9TreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12013,6 +12013,12 @@ J9::Z::TreeEvaluator::VMinlineCompareAndSwap(TR::Node *node, TR::CodeGenerator *

// Eval old and new vals
//
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
bool isObjOffHeapDataAddr = (TR::Compiler->om.writeBarrierType() == gc_modron_wrtbar_cardmark_incremental && TR::Compiler->om.isOffHeapAllocationEnabled() && objNode->isDataAddrPointer());
TR::Register *baseObjReg = NULL;
if (isObjOffHeapDataAddr)
baseObjReg = cg->gprClobberEvaluate(objNode->getFirstChild());
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
objReg = cg->evaluate(objNode);
oldVReg = cg->gprClobberEvaluate(oldVNode); // CS oldReg, newReg, OFF(objReg)
newVReg = cg->evaluate(newVNode); // oldReg is clobbered
Expand Down Expand Up @@ -12110,15 +12116,24 @@ J9::Z::TreeEvaluator::VMinlineCompareAndSwap(TR::Node *node, TR::CodeGenerator *
if (isObj && (doWrtBar || doCrdMrk))
{
TR::LabelSymbol *doneLabelWrtBar = generateLabelSymbol(cg);
TR::Register *epReg = cg->allocateRegister();
TR::Register *epReg;
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
if (!isObjOffHeapDataAddr)
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
epReg = cg->allocateRegister();
TR::Register *raReg = cg->allocateRegister();
TR::RegisterDependencyConditions* condWrtBar = new (cg->trHeapMemory()) TR::RegisterDependencyConditions(0, 5, cg);
condWrtBar->addPostCondition(objReg, TR::RealRegister::GPR1);
if (compressedValueRegister != newVReg)
condWrtBar->addPostCondition(newVReg, TR::RealRegister::AssignAny); //defect 92001
if (compressedValueRegister != objReg) // add this because I got conflicting dependencies on GPR1 and GPR2!
condWrtBar->addPostCondition(compressedValueRegister, TR::RealRegister::GPR2); //defect 92001
condWrtBar->addPostCondition(epReg, cg->getEntryPointRegister());
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
if (isObjOffHeapDataAddr)
condWrtBar->addPostCondition(baseObjReg, cg->getEntryPointRegister());
else
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
condWrtBar->addPostCondition(epReg, cg->getEntryPointRegister());
condWrtBar->addPostCondition(raReg, cg->getReturnAddressRegister());
// Cardmarking is not inlined for gencon. Consider doing so when perf issue arises.
if (doWrtBar)
Expand All @@ -12135,7 +12150,12 @@ J9::Z::TreeEvaluator::VMinlineCompareAndSwap(TR::Node *node, TR::CodeGenerator *

else if (doCrdMrk)
{
VMCardCheckEvaluator(node, objReg, epReg, condWrtBar, cg, false, doneLabelWrtBar, false);
#if defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION)
if (isObjOffHeapDataAddr)
VMCardCheckEvaluator(node, baseObjReg, NULL, condWrtBar, cg, true, doneLabelWrtBar, false);
else
#endif /* defined(J9VM_GC_ENABLE_SPARSE_HEAP_ALLOCATION) */
VMCardCheckEvaluator(node, objReg, epReg, condWrtBar, cg, false, doneLabelWrtBar, false);
// true #1 -> copy of objReg just happened, it's safe to clobber tempReg
// false #2 -> Don't do compile time check for heap obj
}
Expand Down