Skip to content

Commit

Permalink
Prevent compacting NULLCHKs into computed call trees
Browse files Browse the repository at this point in the history
Compacting NULLCHK into computed calls will result in the NULLCHK
notbeing performed before dispatching into the call target if
there is no need for dereferencing of the reference child to
dispatch.

Also includes some formatting fixes.

Signed-off-by: Nazim Bhuiyan <nubhuiyan@ibm.com>
  • Loading branch information
nbhuiyan committed Aug 20, 2021
1 parent 61f1845 commit 2805e95
Showing 1 changed file with 39 additions and 36 deletions.
75 changes: 39 additions & 36 deletions compiler/optimizer/LocalOpts.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2020 IBM Corp. and others
* Copyright (c) 2000, 2021 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -2199,44 +2199,47 @@ bool TR_CompactNullChecks::replacePassThroughIfPossible(TR::Node *currentNode, T
(opCode.isCallIndirect() && (i==1))) &&
(currentParent == NULL || !currentParent->getOpCode().isResolveCheck())
)
{
bool canCompact = false;
if (_isNextTree ||
(opCode.isArrayLength()) ||
(opCode.isLoadVar() && !writtenSymbols->get(currentNode->getSymbolReference()->getReferenceNumber())))
canCompact = true;

if (canCompact &&
performTransformation(comp(), "%sCompact null check %p with node %p in next tree\n", optDetailString(), prevNode, currentNode))
{
//if (!_isNextTree)
// printf("Found a new opportunity in %s\n", comp()->signature());
{
bool canCompact = false;
if (_isNextTree ||
(opCode.isArrayLength()) ||
(opCode.isLoadVar() && !writtenSymbols->get(currentNode->getSymbolReference()->getReferenceNumber())))
canCompact = true;

if (opCode.isTreeTop())
{
if (!(comp()->useAnchors() && currentTree->getNode()->getOpCode().isAnchor()))
(*isTreeTopNode) = true;
}
// compacting null check into computed calls will result in the null check not being performed before dispatching into the
// call target if there is no need for dereferencing the reference child for the dispatch
if (opCode.isCallIndirect() && opCode.hasSymbolReference() && currentNode->getSymbol()->castToMethodSymbol()->isComputed())
canCompact = false;

prevNode->getFirstChild()->recursivelyDecReferenceCount();
prevNode->setAndIncChild(0, currentNode);
if (child->getOpCodeValue() != TR::loadaddr) //For loadaddr, IsNonNull is always true
child->setIsNonNull(false); // it is no longer known that the reference is non null
if (canCompact &&
performTransformation(comp(), "%sCompact null check %p with node %p in next tree\n", optDetailString(), prevNode, currentNode))
{

if (0 && comp()->useAnchors() &&
currentTree->getNode()->getOpCode().isAnchor())
{
TR::TreeTop *prevTree = currentTree;
while (prevTree->getNode() != prevNode)
prevTree = prevTree->getPrevTreeTop();
TR::TreeTop *preceedingTree = currentTree->getPrevTreeTop();
preceedingTree->join(currentTree->getNextTreeTop());
prevTree->getPrevTreeTop()->join(currentTree);
currentTree->join(prevTree);
}
return true;
}
}
if (opCode.isTreeTop())
{
if (!(comp()->useAnchors() && currentTree->getNode()->getOpCode().isAnchor()))
(*isTreeTopNode) = true;
}

prevNode->getFirstChild()->recursivelyDecReferenceCount();
prevNode->setAndIncChild(0, currentNode);
if (child->getOpCodeValue() != TR::loadaddr) //For loadaddr, IsNonNull is always true
child->setIsNonNull(false); // it is no longer known that the reference is non null

if (0 && comp()->useAnchors() &&
currentTree->getNode()->getOpCode().isAnchor())
{
TR::TreeTop *prevTree = currentTree;
while (prevTree->getNode() != prevNode)
prevTree = prevTree->getPrevTreeTop();
TR::TreeTop *preceedingTree = currentTree->getPrevTreeTop();
preceedingTree->join(currentTree->getNextTreeTop());
prevTree->getPrevTreeTop()->join(currentTree);
currentTree->join(prevTree);
}
return true;
}
}
}

return false;
Expand Down

0 comments on commit 2805e95

Please sign in to comment.