From 4a104576da784636eac590a50fe0990225b10201 Mon Sep 17 00:00:00 2001 From: Shubham Verma Date: Wed, 2 Aug 2023 17:37:55 -0400 Subject: [PATCH] Add pinning array pointer support for dataAddr nodes Use node extentions to store pinning array pointer for non add nodes. Signed-off-by: Shubham Verma --- compiler/il/OMRNode.cpp | 32 +++++++++++++++++++++++++------- compiler/il/OMRNode.hpp | 5 +++-- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/compiler/il/OMRNode.cpp b/compiler/il/OMRNode.cpp index eedab756b1d..31a9ee7f1d7 100644 --- a/compiler/il/OMRNode.cpp +++ b/compiler/il/OMRNode.cpp @@ -215,7 +215,7 @@ OMR::Node::Node(TR::Node *originatingByteCodeNode, TR::ILOpCodes op, uint16_t nu + self()->hasBranchDestinationNode() + self()->hasBlock() + self()->hasArrayStride() - + self()->hasPinningArrayPointer() + + (self()->hasPinningArrayPointer() && !self()->supportsPinningArrayPointerInNodeExtension()) + self()->hasDataType() <= 1, "_unionPropertyA union is not disjoint for this node %s (%p):\n" " has({SymbolReference, ...}, ..., DataType) = ({%1d,%1d},%1d,%1d,%1d,%1d,%1d)\n", @@ -225,7 +225,7 @@ OMR::Node::Node(TR::Node *originatingByteCodeNode, TR::ILOpCodes op, uint16_t nu self()->hasBranchDestinationNode(), self()->hasBlock(), self()->hasArrayStride(), - self()->hasPinningArrayPointer(), + (self()->hasPinningArrayPointer() && !self()->supportsPinningArrayPointerInNodeExtension()), self()->hasDataType()); } @@ -5046,10 +5046,16 @@ OMR::Node::hasArrayStride() return self()->getOpCode().isArrayLength(); } +bool +OMR::Node::supportsPinningArrayPointerInNodeExtension() + { + return self()->isDataAddrPointer(); + } + bool OMR::Node::hasPinningArrayPointer() { - return self()->getOpCode().hasPinningArrayPointer(); + return self()->getOpCode().hasPinningArrayPointer() || self()->supportsPinningArrayPointerInNodeExtension(); } bool @@ -5189,16 +5195,28 @@ OMR::Node::setArrayStride(int32_t s) TR::AutomaticSymbol* OMR::Node::getPinningArrayPointer() { - TR_ASSERT(self()->hasPinningArrayPointer(), "attempting to access _pinningArrayPointer field for node %s %p that does not have it", self()->getOpCode().getName(), this); - return _unionPropertyA._pinningArrayPointer; + TR_ASSERT(self()->hasPinningArrayPointer() || _unionBase._extension.getNumElems() >= 6, "attempting to access _pinningArrayPointer field for node %s %p that does not support it", self()->getOpCode().getName(), this); + + if (self()->getOpCode().hasPinningArrayPointer()) + return _unionPropertyA._pinningArrayPointer; + + return _unionBase._extension.getExtensionPtr()->getElem(5); } TR::AutomaticSymbol* OMR::Node::setPinningArrayPointer(TR::AutomaticSymbol *s) { s->setPinningArrayPointer(); - TR_ASSERT(self()->hasPinningArrayPointer(), "attempting to access _pinningArrayPointer field for node %s %p that does not have it", self()->getOpCode().getName(), this); - return (_unionPropertyA._pinningArrayPointer = s); + TR_ASSERT(self()->hasPinningArrayPointer(), "attempting to access _pinningArrayPointer field for node %s %p that does not support it", self()->getOpCode().getName(), this); + + if (self()->getOpCode().hasPinningArrayPointer()) + return _unionPropertyA._pinningArrayPointer = s; + + int extensionElemNum = _unionBase._extension.getNumElems(); + if (extensionElemNum < 6) + self()->addExtensionElements(6 - extensionElemNum); + + return _unionBase._extension.getExtensionPtr()->setElem(5, s); } TR::DataType diff --git a/compiler/il/OMRNode.hpp b/compiler/il/OMRNode.hpp index 8277d906413..8fe696801f3 100644 --- a/compiler/il/OMRNode.hpp +++ b/compiler/il/OMRNode.hpp @@ -1590,6 +1590,7 @@ class OMR_EXTENSIBLE Node public: // For opcode properties bool hasPinningArrayPointer(); + bool supportsPinningArrayPointerInNodeExtension(); // Protected inner classes and structs. protected: @@ -1651,8 +1652,8 @@ class OMR_EXTENSIBLE Node TR::TreeTop *_branchDestinationNode; ///< hasBranchDestinationNode() TR::Block *_block; ///< hasBlock() int32_t _arrayStride; ///< hasArrayStride() - TR::AutomaticSymbol *_pinningArrayPointer; ///< hasPinningArrayPointer() - TR::DataTypes _dataType; ///< hasDataType() TODO: Change to TR::DataType once all target compilers support it + TR::AutomaticSymbol *_pinningArrayPointer; ///< hasPinningArrayPointer() + TR::DataTypes _dataType; ///< hasDataType() TODO: Change to TR::DataType once all target compilers support it UnionPropertyA() {