Skip to content

Commit 833607b

Browse files
Annabelle HuoAnnabelle Huo
authored andcommitted
Fix array load in transformNullRestrictedArrayCopy
Load the source array and the destination array from the saved temp instead of commoning the original nodes incorrectly across blocks. Related: eclipse-openj9/openj9#19913, eclipse-openj9/openj9#19914 Signed-off-by: Annabelle Huo <Annabelle.Huo@ibm.com>
1 parent 389628f commit 833607b

2 files changed

Lines changed: 28 additions & 12 deletions

File tree

compiler/optimizer/OMRValuePropagation.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -616,15 +616,16 @@ class ValuePropagation : public TR::Optimization
616616
{
617617
TR_ALLOC(TR_Memory::ValuePropagation)
618618

619-
TR_NeedRuntimeTestNullRestrictedArrayCopy(TR::Node *dstArrRef, TR::Node *srcArrRef,
619+
TR_NeedRuntimeTestNullRestrictedArrayCopy(TR::SymbolReference *dstArrRefSymRef, TR::SymbolReference *srcArrRefSymRef,
620620
TR::TreeTop *ptt, TR::TreeTop *ntt,
621621
TR::Block *originBlock, TR::Block *slowBlock,
622622
bool testDstArray)
623-
: _dstArrayRefNode(dstArrRef), _srcArrayRefNode(srcArrRef), _prevTT(ptt), _nextTT(ntt), _originBlock(originBlock), _slowBlock(slowBlock), _needRuntimeTestDstArray(testDstArray)
623+
: _dstArrRefSymRef(dstArrRefSymRef), _srcArrRefSymRef(srcArrRefSymRef), _prevTT(ptt), _nextTT(ntt),
624+
_originBlock(originBlock), _slowBlock(slowBlock), _needRuntimeTestDstArray(testDstArray)
624625
{}
625626

626-
TR::Node *_dstArrayRefNode;
627-
TR::Node *_srcArrayRefNode;
627+
TR::SymbolReference * _dstArrRefSymRef;
628+
TR::SymbolReference * _srcArrRefSymRef;
628629

629630
TR::TreeTop *_prevTT;
630631
TR::TreeTop *_nextTT;

compiler/optimizer/ValuePropagationCommon.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,6 +1496,9 @@ void OMR::ValuePropagation::transformArrayCopyCall(TR::Node *node)
14961496
if (trace())
14971497
traceMsg(comp(),"Creating temps for children of the original call node n%dn %p. new call node n%dn %p\n", oldCallNode->getGlobalIndex(), oldCallNode, newCallNode->getGlobalIndex(), newCallNode);
14981498

1499+
TR::SymbolReference * dstArrRefSymRef = NULL;
1500+
TR::SymbolReference * srcArrRefSymRef = NULL;
1501+
14991502
// Create temporaries for System.arraycopy arguments and replace the children of the new call node with the temps
15001503
for (int32_t i = 0 ; i < oldCallNode->getNumChildren(); ++i)
15011504
{
@@ -1516,10 +1519,17 @@ void OMR::ValuePropagation::transformArrayCopyCall(TR::Node *node)
15161519
_curTree->insertBefore(savedChildTree);
15171520

15181521
if (trace())
1519-
traceMsg(comp(),"Created child n%dn %p for old child n%dn %p of the original call node\n", savedChildNode->getGlobalIndex(), savedChildNode, child->getGlobalIndex(), child);
1522+
traceMsg(comp(),"Created child n%dn %p #%d for old child n%dn %p of the original call node\n", savedChildNode->getGlobalIndex(), savedChildNode, newSymbolReference->getReferenceNumber(),
1523+
child->getGlobalIndex(), child);
15201524

15211525
// Create the child for the new call node with a load of the new sym ref
15221526
value = TR::Node::createLoad(newCallNode, newSymbolReference);
1527+
1528+
if (child == dstObjNode)
1529+
dstArrRefSymRef = newSymbolReference;
1530+
1531+
if (child == srcObjNode)
1532+
srcArrRefSymRef = newSymbolReference;
15231533
}
15241534

15251535
if (trace())
@@ -1539,13 +1549,16 @@ void OMR::ValuePropagation::transformArrayCopyCall(TR::Node *node)
15391549
nextTT = nextTT->getNextTreeTop();
15401550

15411551
if (trace())
1542-
traceMsg(comp(), "%s: n%dn %p current block_%d slowBlock block_%d newCallTree n%dn %p srcObjNode n%dn %p dstObjNode n%dn %p prevTT n%dn %p nextTT n%dn %p\n",
1543-
__FUNCTION__, node->getGlobalIndex(), node, _curTree->getEnclosingBlock()->getNumber(), slowBlock->getNumber(),
1544-
newCallTree->getNode()->getGlobalIndex(), newCallTree->getNode(),
1545-
srcObjNode->getGlobalIndex(), srcObjNode, dstObjNode->getGlobalIndex(), dstObjNode,
1552+
{
1553+
traceMsg(comp(), "%s: n%dn %p current block_%d slowBlock block_%d newCallTree n%dn %p prevTT n%dn %p nextTT n%dn %p\n", __FUNCTION__, node->getGlobalIndex(), node,
1554+
_curTree->getEnclosingBlock()->getNumber(), slowBlock->getNumber(), newCallTree->getNode()->getGlobalIndex(), newCallTree->getNode(),
15461555
prevTT->getNode()->getGlobalIndex(), prevTT->getNode(), nextTT->getNode()->getGlobalIndex(), nextTT->getNode());
15471556

1548-
_needRuntimeTestNullRestrictedArrayCopy.add(new (trStackMemory()) TR_NeedRuntimeTestNullRestrictedArrayCopy(dstObjNode, srcObjNode,
1557+
traceMsg(comp(), "%s: srcObjNode n%dn %p #%d dstObjNode n%dn %p #%d\n", __FUNCTION__, srcObjNode->getGlobalIndex(), srcObjNode, srcArrRefSymRef->getReferenceNumber(),
1558+
dstObjNode->getGlobalIndex(), dstObjNode, dstArrRefSymRef->getReferenceNumber());
1559+
}
1560+
1561+
_needRuntimeTestNullRestrictedArrayCopy.add(new (trStackMemory()) TR_NeedRuntimeTestNullRestrictedArrayCopy(dstArrRefSymRef, srcArrRefSymRef,
15491562
prevTT, nextTT,
15501563
_curTree->getEnclosingBlock(), slowBlock,
15511564
needRuntimeTestDstArray));
@@ -3833,8 +3846,10 @@ slowBlock-> n39n BBStart <block_10> (freq 0) (cold)
38333846

38343847
TR_ASSERT_FATAL(needTestSrcArray || needTestDstArray, "needTestSrcArray %d needTestDstArray %d should not both be false\n", needTestSrcArray, needTestDstArray);
38353848

3836-
TR::Node *dstArrayRefNode = nullRestrictedArrayCopy->_dstArrayRefNode;
3837-
TR::Node *srcArrayRefNode = nullRestrictedArrayCopy->_srcArrayRefNode;
3849+
TR::SymbolReference *dstArrRefSymRef = nullRestrictedArrayCopy->_dstArrRefSymRef;
3850+
TR::SymbolReference *srcArrRefSymRef = nullRestrictedArrayCopy->_srcArrRefSymRef;
3851+
TR::Node *dstArrayRefNode = TR::Node::createLoad(dstArrRefSymRef);
3852+
TR::Node *srcArrayRefNode = TR::Node::createLoad(srcArrRefSymRef);
38383853

38393854
TR::Block *originBlock = nullRestrictedArrayCopy->_originBlock;
38403855
TR::Block *slowBlock = nullRestrictedArrayCopy->_slowBlock;

0 commit comments

Comments
 (0)