rcount_t OMR::CodeGenerator::incReferenceCount(TR::Node *node) { TR::Register *reg = node->getRegister(); #ifdef J9_PROJECT_SPECIFIC #if defined(TR_TARGET_S390) if (reg && reg->getOpaquePseudoRegister()) { TR_OpaquePseudoRegister * pseudoReg = reg->getOpaquePseudoRegister(); TR_StorageReference * pseudoRegStorageReference = pseudoReg->getStorageReference(); TR_ASSERT(pseudoRegStorageReference, "the pseudoReg should have a non-null storage reference\n"); pseudoRegStorageReference->incrementTemporaryReferenceCount(); } #endif #endif rcount_t count = node->incReferenceCount(); if (self()->comp()->getOptions()->getTraceCGOption(TR_TraceCGEvaluation)) { self()->getDebug()->printNodeEvaluation(node, "++ ", reg); } return count; }
rcount_t OMR::CodeGenerator::decReferenceCount(TR::Node * node) { TR::Register *reg = node->getRegister(); // restricted registers go dead when ref count==2 because // their ref count was inced in prepareNodeForInstructionSelection if ((node->getReferenceCount() == 1) && reg && self()->getLiveRegisters(reg->getKind())) { TR_ASSERT(reg->isLive() || (diagnostic("\n*** Error: Register %s for node " "[%s] died prematurely\n", reg->getRegisterName(self()->comp()), node->getName(self()->comp()->getDebug())), 0), "Node %s register should be live",self()->getDebug()->getName(node)); TR_LiveRegisterInfo *liveRegister = reg->getLiveRegisterInfo(); TR::Register *pair = reg->getRegisterPair(); if (pair) { pair->getHighOrder()->getLiveRegisterInfo()->decNodeCount(); pair->getLowOrder()->getLiveRegisterInfo()->decNodeCount(); } if (liveRegister && liveRegister->decNodeCount() == 0) { // The register is now dead // self()->getLiveRegisters(reg->getKind())->registerIsDead(reg); } } #ifdef J9_PROJECT_SPECIFIC #if defined(TR_TARGET_S390) if (reg && reg->getOpaquePseudoRegister()) { TR_OpaquePseudoRegister *pseudoReg = reg->getOpaquePseudoRegister(); TR_StorageReference *storageReference = pseudoReg->getStorageReference(); TR_ASSERT(storageReference,"the pseudoReg should have a non-null storage reference\n"); storageReference->decrementTemporaryReferenceCount(); if (node->getReferenceCount() == 1) { storageReference->decOwningRegisterCount(); if (self()->traceBCDCodeGen()) traceMsg(self()->comp(),"\tdecrement owningRegisterCount %d->%d on ref #%d (%s) for reg %s as %s (%p) refCount == 1 (going to 0)\n", storageReference->getOwningRegisterCount()+1, storageReference->getOwningRegisterCount(), storageReference->getReferenceNumber(), self()->getDebug()->getName(storageReference->getSymbol()), self()->getDebug()->getName(reg), node->getOpCode().getName(), node); } } else if (node->getOpCode().hasSymbolReference() && node->getSymbolReference() && node->getSymbolReference()->isTempVariableSizeSymRef()) { TR_ASSERT(false,"tempMemSlots should only be attached to pseudoRegisters and not node %p\n",node); } #endif #endif rcount_t count = node->decReferenceCount(); if (self()->comp()->getOptions()->getTraceCGOption(TR_TraceCGEvaluation)) { self()->getDebug()->printNodeEvaluation(node, "-- ", reg); } return count; }