Skip to content

Commit

Permalink
Merge pull request #6321 from klangman/PR146446
Browse files Browse the repository at this point in the history
Fix FieldPrivatizer so that it does not miss emitting write barriers
  • Loading branch information
vijaysun-omr authored Feb 2, 2022
2 parents f550850 + b8a9dd3 commit aea0efc
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 additions & 2 deletions compiler/optimizer/FieldPrivatizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -762,6 +762,8 @@ void TR_FieldPrivatizer::privatizeFields(TR::Node *node, bool postDominatesEntry
bool canPrivatizeBasedOnThisNode = performTransformation(comp(), "%s Field access %p using sym ref %d privatized ", optDetailString(), node, symRef->getReferenceNumber());
if (canPrivatizeBasedOnThisNode)
{
if (autoForField)
dumpOptDetails(comp(), "using auto %d\n", autoForField->getReferenceNumber());
if (!autoForField)
{
// Create a new auto for this field
Expand All @@ -773,15 +775,33 @@ void TR_FieldPrivatizer::privatizeFields(TR::Node *node, bool postDominatesEntry
_privatizedFieldSymRefs.add(symRef->getReferenceNumber(),index,autoForField);
_privatizedRegCandidates.add(comp()->getGlobalRegisterCandidates()->findOrCreate(autoForField));
_privatizedFieldNodes.add(node->duplicateTree());
dumpOptDetails(comp(), "using auto %d\n", autoForField->getReferenceNumber());
}
else if (!_privatizedFields->get(symRef->getReferenceNumber()))
{
_privatizedFields->set(symRef->getReferenceNumber());
//Even we are reusing temp, need to save this for initialization and store back
_privatizedFieldNodes.add(node->duplicateTree());
}

dumpOptDetails(comp(), "using auto %d\n", autoForField->getReferenceNumber());
else if (opCode.isWrtBar())
{
// Replace any aload/astore privatized field nodes with awrtbar nodes referencing the same symRef
// This will insure that the store back will generate write barriers.
//
ListElement<TR::Node> *currentNodeElem = _privatizedFieldNodes.getListHead();
while (currentNodeElem)
{
TR::Node *currentNode = currentNodeElem->getData();
if (!currentNode->getOpCode().isWrtBar() && currentNode->getSymbolReference()->getReferenceNumber() == symRef->getReferenceNumber())
{
dumpOptDetails(comp(), "\tReplacing privatized field list entry %p:%s with %p:%s for auto %d\n", currentNode, currentNode->getOpCode().getName(), node, opCode.getName(), currentNode->getSymbolReference()->getReferenceNumber() );
_privatizedFieldNodes.addAfter(node->duplicateTree(), currentNodeElem);
_privatizedFieldNodes.remove(currentNode);
break;
}
currentNodeElem = currentNodeElem->getNextElement();
}
}

node->setSymbolReference(autoForField);
TR::Node *newFirstChild = 0;
Expand Down

0 comments on commit aea0efc

Please sign in to comment.