void TR_LocalLiveRangeReduction::populatePotentialDeps(TR_TreeRefInfo *treeRefInfo,TR::Node *node) { TR::ILOpCode &opCode = node->getOpCode(); if (node->getOpCode().hasSymbolReference()) { TR::SymbolReference *symRef = node->getSymbolReference(); int32_t symRefNum = symRef->getReferenceNumber(); //set defSym - all symbols that might be written if (opCode.isCall() || opCode.isResolveCheck()|| opCode.isStore() || node->mightHaveVolatileSymbolReference()) { bool isCallDirect = false; if (node->getOpCode().isCallDirect()) isCallDirect = true; if (!symRef->getUseDefAliases(isCallDirect).isZero(comp())) { TR::SparseBitVector useDefAliases(comp()->allocator()); symRef->getUseDefAliases(isCallDirect).getAliases(useDefAliases); TR::SparseBitVector::Cursor aliasCursor(useDefAliases); for (aliasCursor.SetToFirstOne(); aliasCursor.Valid(); aliasCursor.SetToNextOne()) { int32_t nextAlias = aliasCursor; treeRefInfo->getDefSym()->set(nextAlias); } } if (opCode.isStore()) treeRefInfo->getDefSym()->set(symRefNum); } //set useSym - all symbols that are used if (opCode.canRaiseException()) { TR::SparseBitVector useAliases(comp()->allocator()); symRef->getUseonlyAliases().getAliases(useAliases); { TR::SparseBitVector::Cursor aliasesCursor(useAliases); for (aliasesCursor.SetToFirstOne(); aliasesCursor.Valid(); aliasesCursor.SetToNextOne()) { int32_t nextAlias = aliasesCursor; treeRefInfo->getUseSym()->set(nextAlias); } } } if (opCode.isLoadVar() || (opCode.getOpCodeValue() == TR::loadaddr)) { treeRefInfo->getUseSym()->set(symRefNum); } } for (int32_t i = 0; i < node->getNumChildren(); i++) { TR::Node *child = node->getChild(i); //don't recurse over references (nodes which are not the first reference) // if (child->getReferenceCount()==1 || treeRefInfo->getFirstRefNodesList()->find(child)) populatePotentialDeps(treeRefInfo,child ); } return; }