Skip to content

Commit

Permalink
Use TR::MemoryReference::create API
Browse files Browse the repository at this point in the history
Use the new `TR::MemoryReference::create` to generate memory references
from nodes. This API can be overridden by downstream projects for
custom logic.

Signed-off-by: Filip Jeremic <fjeremic@ca.ibm.com>
  • Loading branch information
fjeremic authored and r30shah committed Dec 9, 2020
1 parent 5c72bed commit 8793338
Show file tree
Hide file tree
Showing 10 changed files with 71 additions and 78 deletions.
8 changes: 4 additions & 4 deletions compiler/z/codegen/BinaryAnalyser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ TR_S390BinaryAnalyser::genericAnalyser(TR::Node * root,
else
{
TR::Node* loadBaseAddr = is16BitMemory2Operand ? secondChild->getFirstChild() : secondChild;
TR::MemoryReference * tempMR = generateS390MemoryReference(loadBaseAddr, cg());
TR::MemoryReference * tempMR = TR::MemoryReference::create(cg(), loadBaseAddr);

//floating-point arithmatics don't have RXY format instructions, so no long displacement
if (secondChild->getOpCode().isFloatingPoint())
Expand Down Expand Up @@ -247,7 +247,7 @@ TR_S390BinaryAnalyser::genericAnalyser(TR::Node * root,
{
TR_ASSERT( !getInvalid(), "TR_S390BinaryAnalyser::invalid case\n");

TR::MemoryReference * tempMR = generateS390MemoryReference(is16BitMemory2Operand ? secondChild->getFirstChild() : secondChild, cg());
TR::MemoryReference * tempMR = TR::MemoryReference::create(cg(), is16BitMemory2Operand ? secondChild->getFirstChild() : secondChild);
//floating-point arithmatics don't have RXY format instructions, so no long displacement
if (secondChild->getOpCode().isFloatingPoint())
{
Expand Down Expand Up @@ -354,7 +354,7 @@ TR_S390BinaryAnalyser::longSubtractAnalyser(TR::Node * root)
}
else // assert getBinaryReg3Mem2() == true
{
TR::MemoryReference * longMR = generateS390MemoryReference(secondChild, cg());
TR::MemoryReference * longMR = TR::MemoryReference::create(cg(), secondChild);

generateRXInstruction(cg(), memToRegOpCode, root, thirdReg, longMR);
longMR->stopUsingMemRefRegister(cg());
Expand All @@ -371,7 +371,7 @@ TR_S390BinaryAnalyser::longSubtractAnalyser(TR::Node * root)
TR_ASSERT( !getInvalid(), "TR_S390BinaryAnalyser::invalid case\n");

TR::Node* baseAddrNode = is16BitMemory2Operand ? secondChild->getFirstChild() : secondChild;
TR::MemoryReference * longMR = generateS390MemoryReference(baseAddrNode, cg());
TR::MemoryReference * longMR = TR::MemoryReference::create(cg(), baseAddrNode);

generateRXInstruction(cg(), memToRegOpCode, root, firstRegister, longMR);

Expand Down
8 changes: 4 additions & 4 deletions compiler/z/codegen/BinaryCommutativeAnalyser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,7 @@ TR_S390BinaryCommutativeAnalyser::genericAnalyser(TR::Node * root, TR::InstOpCod
cursor = generateRRInstruction(cg(), copyOpCode, root, nodeReg, firstRegister);
}

TR::MemoryReference * tempMR = generateS390MemoryReference(secondChild, cg(), true);
TR::MemoryReference * tempMR = TR::MemoryReference::create(cg(), secondChild);
//floating-point arithmatics don't have RXY format instructions, so no long displacement
if (secondChild->getOpCode().isFloatingPoint())
{
Expand Down Expand Up @@ -595,7 +595,7 @@ TR_S390BinaryCommutativeAnalyser::genericAnalyser(TR::Node * root, TR::InstOpCod
}

TR::Node* loadNode = isLoadNodeNested ? firstChild->getFirstChild() : firstChild;
TR::MemoryReference * tempMR = generateS390MemoryReference(loadNode, cg(), true);
TR::MemoryReference * tempMR = TR::MemoryReference::create(cg(), loadNode);

//floating-point arithmatics don't have RXY format instructions, so no long displacement
if (firstChild->getOpCode().isFloatingPoint())
Expand Down Expand Up @@ -858,7 +858,7 @@ TR_S390BinaryCommutativeAnalyser::integerAddAnalyser(TR::Node * root, TR::InstOp
cursor = generateRRInstruction(cg(), copyOpCode, root, tempReg, firstRegister);
}

TR::MemoryReference * tempMR = generateS390MemoryReference(is16BitMemory2Operand ? secondChild->getFirstChild() : secondChild, cg());
TR::MemoryReference * tempMR = TR::MemoryReference::create(cg(), is16BitMemory2Operand ? secondChild->getFirstChild() : secondChild);

generateRXInstruction(cg(), memToRegOpCode, root, tempReg, tempMR);
root->setRegister(tempReg);
Expand Down Expand Up @@ -898,7 +898,7 @@ TR_S390BinaryCommutativeAnalyser::integerAddAnalyser(TR::Node * root, TR::InstOp
cursor = generateRRInstruction(cg(), copyOpCode, root, tempReg, secondRegister);
}

TR::MemoryReference * tempMR = generateS390MemoryReference(firstChild, cg());
TR::MemoryReference * tempMR = TR::MemoryReference::create(cg(), firstChild);

generateRXInstruction(cg(), memToRegOpCode, root, tempReg, tempMR);
root->setRegister(tempReg);
Expand Down
4 changes: 2 additions & 2 deletions compiler/z/codegen/BinaryEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1071,7 +1071,7 @@ iDivRemGenericEvaluator(TR::Node * node, TR::CodeGenerator * cg, bool isDivision
secondChild->getOpCode().isMemoryReference() &&
!needCheck)
{
sourceMR = generateS390MemoryReference(secondChild, cg);
sourceMR = TR::MemoryReference::create(cg, secondChild);
}
else
{
Expand Down Expand Up @@ -2703,7 +2703,7 @@ OMR::Z::TreeEvaluator::imulEvaluator(TR::Node * node, TR::CodeGenerator * cg)
{
// Emit MH directly
targetRegister = cg->evaluate(regNode);
TR::MemoryReference* tmpMR = generateS390MemoryReference(halfwordNode->getFirstChild(), cg);
TR::MemoryReference* tmpMR = TR::MemoryReference::create(cg, halfwordNode->getFirstChild());
generateRXInstruction(cg, TR::InstOpCode::MH, node, targetRegister, tmpMR);
node->setRegister(targetRegister);
tmpMR->stopUsingMemRefRegister(cg);
Expand Down
16 changes: 8 additions & 8 deletions compiler/z/codegen/CompareAnalyser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ TR_S390CompareAnalyser::longOrderedCompareAndBranchAnalyser(TR::Node * root, TR:
firstChild->getRegister() == NULL &&
(firstChild->getOpCodeValue() == TR::lload || (firstChild->getOpCodeValue() == TR::iload && firstIU2L)))
{
lowFirstMR = generateS390MemoryReference(firstChild, _cg);
lowFirstMR = TR::MemoryReference::create(_cg, firstChild);
delayedFirst = _cg->allocateRegister();
if (!firstIU2L)
{
Expand All @@ -119,7 +119,7 @@ TR_S390CompareAnalyser::longOrderedCompareAndBranchAnalyser(TR::Node * root, TR:
secondChild->getRegister() == NULL &&
(secondChild->getOpCodeValue() == TR::lload || (secondChild->getOpCodeValue() == TR::iload && secondIU2L)))
{
lowSecondMR = generateS390MemoryReference(secondChild, _cg);
lowSecondMR = TR::MemoryReference::create(_cg, secondChild);
delayedSecond = _cg->allocateRegister();
if (!secondIU2L)
{
Expand All @@ -141,7 +141,7 @@ TR_S390CompareAnalyser::longOrderedCompareAndBranchAnalyser(TR::Node * root, TR:
secondChild->getRegister() == NULL &&
(secondChild->getOpCodeValue() == TR::lload || (secondChild->getOpCodeValue() == TR::iload && secondIU2L)))
{
lowSecondMR = generateS390MemoryReference(secondChild, _cg);
lowSecondMR = TR::MemoryReference::create(_cg, secondChild);
delayedSecond = _cg->allocateRegister();
if (!secondIU2L)
{
Expand All @@ -160,7 +160,7 @@ TR_S390CompareAnalyser::longOrderedCompareAndBranchAnalyser(TR::Node * root, TR:
firstChild->getRegister() == NULL &&
(firstChild->getOpCodeValue() == TR::lload || (firstChild->getOpCodeValue() == TR::iload && firstIU2L)))
{
lowFirstMR = generateS390MemoryReference(firstChild, _cg);
lowFirstMR = TR::MemoryReference::create(_cg, firstChild);
delayedFirst = _cg->allocateRegister();
if (!firstIU2L)
{
Expand Down Expand Up @@ -317,11 +317,11 @@ TR_S390CompareAnalyser::longOrderedCompareAndBranchAnalyser(TR::Node * root, TR:
if (secondIU2L)
{
highMR = NULL;
lowMR = generateS390MemoryReference(secondChild, _cg);
lowMR = TR::MemoryReference::create(_cg, secondChild);
}
else
{
highMR = generateS390MemoryReference(secondChild, _cg);
highMR = TR::MemoryReference::create(_cg, secondChild);
lowMR = generateS390MemoryReference(*highMR, 4, _cg);
}
numAdditionalRegDeps += 2;
Expand Down Expand Up @@ -435,11 +435,11 @@ TR_S390CompareAnalyser::longOrderedCompareAndBranchAnalyser(TR::Node * root, TR:
if (firstIU2L)
{
highMR = NULL;
lowMR = generateS390MemoryReference(firstChild, _cg);
lowMR = TR::MemoryReference::create(_cg, firstChild);
}
else
{
highMR = generateS390MemoryReference(firstChild, _cg);
highMR = TR::MemoryReference::create(_cg, firstChild);
lowMR = generateS390MemoryReference(*highMR, 4, _cg);
}

Expand Down
2 changes: 1 addition & 1 deletion compiler/z/codegen/ControlFlowEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2276,7 +2276,7 @@ OMR::Z::TreeEvaluator::commonButestEvaluator(TR::Node * node, TR::CodeGenerator
uint8_t tmMask = secondChild->getUnsignedByte();
if (firstChild->isSingleRefUnevaluated())
{
TR::MemoryReference * mr = generateS390MemoryReference(firstChild, cg);
TR::MemoryReference * mr = TR::MemoryReference::create(cg, firstChild);
generateSIInstruction(cg, TR::InstOpCode::TM, node, mr, tmMask);
}
else
Expand Down
10 changes: 5 additions & 5 deletions compiler/z/codegen/FPTreeEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,7 @@ fstoreHelper(TR::Node * node, TR::CodeGenerator * cg)

TR::Register * valueReg = cg->evaluate(valueChild);

TR::MemoryReference * tempMR = generateS390MemoryReference(node, cg);
TR::MemoryReference * tempMR = TR::MemoryReference::create(cg, node);

generateRXInstruction(cg, TR::InstOpCode::STE, node, valueReg, tempMR);

Expand All @@ -607,7 +607,7 @@ dstoreHelper(TR::Node * node, TR::CodeGenerator * cg)

TR::Register * valueReg = cg->evaluate(valueChild);

TR::MemoryReference * tempMR = generateS390MemoryReference(node, cg, true);
TR::MemoryReference * tempMR = TR::MemoryReference::create(cg, node);

generateRXInstruction(cg, TR::InstOpCode::STD, node, valueReg, tempMR);

Expand All @@ -624,7 +624,7 @@ floadHelper(TR::Node * node, TR::CodeGenerator * cg, TR::MemoryReference * srcMR
TR::MemoryReference * tempMR = srcMR;
if (tempMR == NULL)
{
tempMR = generateS390MemoryReference(node, cg);
tempMR = TR::MemoryReference::create(cg, node);
//traceMsg(cg->comp(), "Generated memory reference %p for node %p with offset %d",tempMR,node,tempMR->getOffset());
}

Expand All @@ -641,7 +641,7 @@ dloadHelper(TR::Node * node, TR::CodeGenerator * cg, TR::MemoryReference * srcMR

if (tempMR == NULL)
{
tempMR = generateS390MemoryReference(node, cg, true);
tempMR = TR::MemoryReference::create(cg, node);
}
generateRXInstruction(cg, TR::InstOpCode::LD, node, tempReg, tempMR);
tempMR->stopUsingMemRefRegister(cg);
Expand Down Expand Up @@ -962,7 +962,7 @@ FPtoIntBitsTypeCoercionHelper(TR::Node * node, TR::CodeGenerator * cg)
if (node->getFirstChild()->isSingleRefUnevaluated() &&
node->getFirstChild()->getOpCode().isLoadVar())
{
TR::MemoryReference * tempmemref = generateS390MemoryReference(node->getFirstChild(), cg);
TR::MemoryReference * tempmemref = TR::MemoryReference::create(cg, node->getFirstChild());
if (nodeType == TR::Int64)
targetReg = genericLoadHelper<64, 64, MemReg>(node, cg, tempmemref, NULL, false, true);
else
Expand Down
22 changes: 8 additions & 14 deletions compiler/z/codegen/OMRMemoryReference.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3303,7 +3303,13 @@ OMR::Z::MemoryReference::doEvaluate(TR::Node * subTree, TR::CodeGenerator * cg)
TR::MemoryReference*
OMR::Z::MemoryReference::create(TR::CodeGenerator* cg, TR::Node* node)
{
return generateS390MemoryReference(node, cg);
// The TR::MemoryReference(TR::Node*, TR::CodeGenerator*, bool); constructor (below) is made for store or load nodes
// that have symbol references.
// A symbol reference is needed to adjust memory reference displacement (TR::MemoryReference::calcDisplacement).
// If the node has no sym ref, this memory reference's gets a NULL symbol reference, which can lead to crashes in displacement
// calculations.
TR_ASSERT_FATAL(node->getOpCode().hasSymbolReference(), "Memory reference generation API needs a node with symbol reference\n");
return new (cg->trHeapMemory()) TR::MemoryReference(node, cg);
}

///////////////////////////////////////////
Expand Down Expand Up @@ -3373,18 +3379,6 @@ generateS390MemoryReference(TR::Register * br, int32_t disp, TR::CodeGenerator *
return new (cg->trHeapMemory()) TR::MemoryReference(br, disp, cg, name);
}

TR::MemoryReference *
generateS390MemoryReference(TR::Node * node, TR::CodeGenerator * cg, bool canUseRX)
{
// The TR::MemoryReference(TR::Node*, TR::CodeGenerator*, bool); constructor (below) is made for store or load nodes
// that have symbol references.
// A symbol reference is needed to adjust memory reference displacement (TR::MemoryReference::calcDisplacement).
// If the node has no sym ref, this memory reference's gets a NULL symbol reference, which can lead to crashes in displacement
// calculations.
TR_ASSERT_FATAL(node->getOpCode().hasSymbolReference(), "Memory reference generation API needs a node with symbol reference\n");
return new (cg->trHeapMemory()) TR::MemoryReference(node, cg, canUseRX);
}

static TR::SymbolReference * findBestSymRefForArrayCopy(TR::CodeGenerator *cg, TR::Node *arrayCopyNode, TR::Node *srcNode)
{
TR::SymbolReference *sym = arrayCopyNode->getSymbolReference();
Expand Down Expand Up @@ -3422,7 +3416,7 @@ generateS390MemoryReference(TR::CodeGenerator * cg, TR::SymbolReference *symRefF
TR::Node * tempLoad = TR::Node::createWithSymRef(TR::iloadi, 1, 1, baseNode, symRefForAliasing);
// dec ref count that was inc'ed in the line above so that populatememref code is not confused with refcount >1
baseNode->decReferenceCount();
TR::MemoryReference * mr = generateS390MemoryReference(tempLoad, cg);
TR::MemoryReference * mr = TR::MemoryReference::create(cg, tempLoad);
mr->setOffset(mr->getOffset()+disp);
return mr;
}
Expand Down
1 change: 0 additions & 1 deletion compiler/z/codegen/OMRMemoryReference.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,6 @@ TR::MemoryReference * generateS390MemoryReference(TR::CodeGenerator *cg);
TR::MemoryReference * generateS390MemoryReference(int32_t, TR::CodeGenerator *cg);
TR::MemoryReference * generateS390MemoryReference(TR::Register *, int32_t, TR::CodeGenerator *cg, const char *name=NULL);
TR::MemoryReference * generateS390MemoryReference(TR::Register *, TR::Register *, int32_t, TR::CodeGenerator *cg);
TR::MemoryReference * generateS390MemoryReference(TR::Node *, TR::CodeGenerator *, bool canUseRX = false);
TR::MemoryReference * generateS390MemoryReference(TR::MemoryReference &, int32_t, TR::CodeGenerator *cg);
TR::MemoryReference * generateS390MemoryReference(TR::Node *, TR::SymbolReference *, TR::CodeGenerator *);
TR::MemoryReference * generateS390MemoryReference(TR::Snippet *, TR::CodeGenerator *, TR::Register *, TR::Node *);
Expand Down
Loading

0 comments on commit 8793338

Please sign in to comment.