Skip to content

Commit ba64f88

Browse files
authored
Merge pull request #19600 from 0xdaryl/init46
(0.46.0) Improve x86 inline object allocations
2 parents b93fdca + 8bfd388 commit ba64f88

File tree

2 files changed

+697
-972
lines changed

2 files changed

+697
-972
lines changed

runtime/compiler/p/codegen/J9TreeEvaluator.cpp

Lines changed: 5 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -4255,7 +4255,7 @@ TR::Register *J9::Power::TreeEvaluator::VMifInstanceOfEvaluator(TR::Node *node,
42554255
}
42564256
depIndex = numberOfRegisterCandidate(cg, depNode, TR_GPR) + numberOfRegisterCandidate(cg, depNode, TR_FPR) +
42574257
numberOfRegisterCandidate(cg, depNode, TR_CCR) + numberOfRegisterCandidate(cg, depNode, TR_VRF) +
4258-
numberOfRegisterCandidate(cg, depNode, TR_VSX_SCALAR) + numberOfRegisterCandidate(cg, depNode, TR_VSX_VECTOR);
4258+
numberOfRegisterCandidate(cg, depNode, TR_VSX_SCALAR) + numberOfRegisterCandidate(cg, depNode, TR_VSX_VECTOR);
42594259
}
42604260

42614261
doneLabel = generateLabelSymbol(cg);
@@ -5536,7 +5536,6 @@ static void genHeapAlloc(TR::Node *node, TR::Instruction *&iCursor, TR_OpaqueCla
55365536
if (usingTLH)
55375537
{
55385538
bool sizeInReg = (isVariableLen || (allocSize > UPPER_IMMED));
5539-
bool shouldAlignToCacheBoundary = false;
55405539
int32_t instanceBoundaryForAlignment = 64;
55415540

55425541
static bool verboseDualTLH = feGetEnv("TR_verboseDualTLH") != NULL;
@@ -5572,78 +5571,14 @@ static void genHeapAlloc(TR::Node *node, TR::Instruction *&iCursor, TR_OpaqueCla
55725571
//TODO: This code is never executed, check if this can be deleted now.
55735572
if (!cg->isDualTLH())
55745573
{
5575-
//All of this code never gets executed because of the 0 && in
5576-
//the inside if statement. Candidate for deletion
5574+
iCursor = generateTrg1MemInstruction(cg,TR::InstOpCode::Op_load, node, resReg,
5575+
TR::MemoryReference::createWithDisplacement(cg, metaReg, offsetof(J9VMThread, heapAlloc), TR::Compiler->om.sizeofReferenceAddress()), iCursor);
55775576

5578-
if (!isVariableLen)
5579-
{
5580-
static char *disableAlign = feGetEnv("TR_DisableAlignAlloc");
5581-
5582-
if (0 && !disableAlign && (node->getOpCodeValue() == TR::New) && (comp->getMethodHotness() >= hot || node->shouldAlignTLHAlloc()))
5583-
{
5584-
TR_OpaqueMethodBlock *ownMethod = node->getOwningMethod();
5585-
5586-
TR::Node *classChild = node->getFirstChild();
5587-
char * className = NULL;
5588-
TR_OpaqueClassBlock *clazz = NULL;
5589-
5590-
if (classChild && classChild->getSymbolReference() && !classChild->getSymbolReference()->isUnresolved())
5591-
{
5592-
TR::SymbolReference *symRef = classChild->getSymbolReference();
5593-
TR::Symbol *sym = symRef->getSymbol();
5594-
5595-
if (sym && sym->getKind() == TR::Symbol::IsStatic && sym->isClassObject())
5596-
{
5597-
TR::StaticSymbol * staticSym = symRef->getSymbol()->castToStaticSymbol();
5598-
void * staticAddress = staticSym->getStaticAddress();
5599-
if (symRef->getCPIndex() >= 0)
5600-
{
5601-
if (!staticSym->addressIsCPIndexOfStatic() && staticAddress)
5602-
{
5603-
int32_t len;
5604-
className = TR::Compiler->cls.classNameChars(comp, symRef, len);
5605-
clazz = (TR_OpaqueClassBlock *) staticAddress;
5606-
}
5607-
}
5608-
}
5609-
}
5610-
5611-
int32_t instanceSizeForAlignment = 56;
5612-
static char *alignSize = feGetEnv("TR_AlignInstanceSize");
5613-
static char *alignBoundary = feGetEnv("TR_AlignInstanceBoundary");
5614-
5615-
if (alignSize)
5616-
instanceSizeForAlignment = atoi(alignSize);
5617-
if (alignBoundary)
5618-
instanceBoundaryForAlignment = atoi(alignBoundary);
5619-
5620-
if (clazz && !cg->getCurrentEvaluationBlock()->isCold() && TR::Compiler->cls.classInstanceSize(clazz) >= instanceSizeForAlignment)
5621-
{
5622-
shouldAlignToCacheBoundary = true;
5623-
5624-
iCursor = generateTrg1MemInstruction(cg,TR::InstOpCode::Op_load, node, temp1Reg,
5625-
TR::MemoryReference::createWithDisplacement(cg, metaReg, offsetof(J9VMThread, heapAlloc), TR::Compiler->om.sizeofReferenceAddress()), iCursor);
5626-
5627-
iCursor = generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addi, node, resReg, temp1Reg, instanceBoundaryForAlignment - 1, iCursor);
5628-
if (comp->target().is64Bit())
5629-
iCursor = generateTrg1Src1Imm2Instruction(cg, TR::InstOpCode::rldicr, node, resReg, resReg, 0, int64_t(-instanceBoundaryForAlignment), iCursor);
5630-
else
5631-
iCursor = generateTrg1Src1Imm2Instruction(cg, TR::InstOpCode::rlwinm, node, resReg, resReg, 0, -instanceBoundaryForAlignment, iCursor);
5632-
}
5633-
}
5634-
}
5635-
5636-
if (!shouldAlignToCacheBoundary)
5637-
{
5638-
iCursor = generateTrg1MemInstruction(cg,TR::InstOpCode::Op_load, node, resReg,
5639-
TR::MemoryReference::createWithDisplacement(cg, metaReg, offsetof(J9VMThread, heapAlloc), TR::Compiler->om.sizeofReferenceAddress()), iCursor);
5640-
}
56415577
iCursor = generateTrg1MemInstruction(cg,TR::InstOpCode::Op_load, node, heapTopReg,
56425578
TR::MemoryReference::createWithDisplacement(cg, metaReg, offsetof(J9VMThread, heapTop), TR::Compiler->om.sizeofReferenceAddress()), iCursor);
56435579

56445580
if (needZeroInit)
56455581
iCursor = generateTrg1ImmInstruction(cg, TR::InstOpCode::li, node, zeroReg, 0, iCursor);
5646-
56475582
}
56485583
else
56495584
{
@@ -5815,15 +5750,9 @@ static void genHeapAlloc(TR::Node *node, TR::Instruction *&iCursor, TR_OpaqueCla
58155750
else
58165751
iCursor = generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addi, node, temp2Reg, resReg, allocSize, iCursor);
58175752

5818-
//TODO: shouldAlignToCacheBoundary is never true, check its effects here.
5819-
int32_t padding = shouldAlignToCacheBoundary ? instanceBoundaryForAlignment : 0;
5820-
5821-
if (!isVariableLen && ((uint32_t) allocSize + padding) > maxSafeSize)
5753+
if (!isVariableLen && ((uint32_t) allocSize) > maxSafeSize)
58225754
{
5823-
if (!shouldAlignToCacheBoundary)
5824-
iCursor = generateTrg1Src2Instruction(cg,TR::InstOpCode::Op_cmpl, node, condReg, temp2Reg, resReg, iCursor);
5825-
else
5826-
iCursor = generateTrg1Src2Instruction(cg,TR::InstOpCode::Op_cmpl, node, condReg, temp2Reg, temp1Reg, iCursor);
5755+
iCursor = generateTrg1Src2Instruction(cg,TR::InstOpCode::Op_cmpl, node, condReg, temp2Reg, resReg, iCursor);
58275756
iCursor = generateConditionalBranchInstruction(cg, TR::InstOpCode::blt, node, callLabel, condReg, iCursor);
58285757
}
58295758

@@ -5848,53 +5777,6 @@ static void genHeapAlloc(TR::Node *node, TR::Instruction *&iCursor, TR_OpaqueCla
58485777
iCursor = generateTrg1Src2Instruction(cg,TR::InstOpCode::Op_cmpl, node, condReg, temp2Reg, heapTopReg, iCursor);
58495778
iCursor = generateConditionalBranchInstruction(cg, TR::InstOpCode::bgt, node, callLabel, condReg, iCursor);
58505779

5851-
//TODO: this code is never executed, check if we can remove this now.
5852-
if (!cg->isDualTLH())
5853-
{
5854-
//shouldAlignToCacheBoundary is false at definition at the top, and
5855-
//the only codepoint where its set to true is never executed
5856-
//so this looks like a candidate for deletion.
5857-
if (shouldAlignToCacheBoundary)
5858-
{
5859-
TR::LabelSymbol *doneAlignLabel = generateLabelSymbol(cg);
5860-
TR::LabelSymbol *multiSlotGapLabel = generateLabelSymbol(cg);
5861-
;
5862-
iCursor = generateTrg1Src2Instruction(cg, TR::InstOpCode::subf, node, dataSizeReg, temp1Reg, resReg, iCursor);
5863-
5864-
if (sizeInReg)
5865-
iCursor = generateTrg1Src2Instruction(cg, TR::InstOpCode::add, node, sizeReg, dataSizeReg, sizeReg, iCursor);
5866-
else
5867-
iCursor = generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::addi, node, sizeReg, dataSizeReg, allocSize, iCursor);
5868-
5869-
sizeInReg = true;
5870-
5871-
iCursor = generateTrg1Src1ImmInstruction(cg,TR::InstOpCode::Op_cmpli, node, condReg, dataSizeReg, sizeof(uintptr_t), iCursor);
5872-
iCursor = generateConditionalBranchInstruction(cg, TR::InstOpCode::blt, node, doneAlignLabel, condReg, iCursor);
5873-
iCursor = generateConditionalBranchInstruction(cg, TR::InstOpCode::bgt, node, multiSlotGapLabel, condReg, iCursor);
5874-
iCursor = generateTrg1ImmInstruction(cg, TR::InstOpCode::li, node, dataSizeReg, J9_GC_SINGLE_SLOT_HOLE, iCursor);
5875-
5876-
if (comp->target().is64Bit() && fej9->generateCompressedLockWord())
5877-
{
5878-
iCursor = generateMemSrc1Instruction(cg, TR::InstOpCode::stw, node, TR::MemoryReference::createWithDisplacement(cg, temp1Reg, 0, 4), dataSizeReg, iCursor);
5879-
iCursor = generateMemSrc1Instruction(cg, TR::InstOpCode::stw, node, TR::MemoryReference::createWithDisplacement(cg, temp1Reg, 4, 4), dataSizeReg, iCursor);
5880-
}
5881-
else
5882-
{
5883-
iCursor = generateMemSrc1Instruction(cg,TR::InstOpCode::Op_st, node, TR::MemoryReference::createWithDisplacement(cg, temp1Reg, 0, TR::Compiler->om.sizeofReferenceAddress()), dataSizeReg,
5884-
iCursor);
5885-
}
5886-
5887-
iCursor = generateLabelInstruction(cg, TR::InstOpCode::b, node, doneAlignLabel, iCursor);
5888-
iCursor = generateLabelInstruction(cg, TR::InstOpCode::label, node, multiSlotGapLabel, iCursor);
5889-
iCursor = generateMemSrc1Instruction(cg,TR::InstOpCode::Op_st, node, TR::MemoryReference::createWithDisplacement(cg, temp1Reg, TR::Compiler->om.sizeofReferenceAddress(), TR::Compiler->om.sizeofReferenceAddress()),
5890-
dataSizeReg, iCursor);
5891-
iCursor = generateTrg1ImmInstruction(cg, TR::InstOpCode::li, node, dataSizeReg, J9_GC_MULTI_SLOT_HOLE, iCursor);
5892-
iCursor = generateMemSrc1Instruction(cg,TR::InstOpCode::Op_st, node, TR::MemoryReference::createWithDisplacement(cg, temp1Reg, 0, TR::Compiler->om.sizeofReferenceAddress()), dataSizeReg,
5893-
iCursor);
5894-
iCursor = generateLabelInstruction(cg, TR::InstOpCode::label, node, doneAlignLabel, iCursor);
5895-
}
5896-
}
5897-
58985780
if (cg->enableTLHPrefetching())
58995781
{
59005782
//Decide between zeroed and non-zero TLH'es

0 commit comments

Comments
 (0)